openapi: 3.0.3
info:
  title: Athena API
  version: 1.0.0
  description: "\n    Comprehensive API for Athena advisory consulting platform.\n
    \   \n    ## Key Features\n    \n    - **Automatic Version Numbering**: Location
    Tools use automatic sequential version numbering (1, 2, 3, etc.)\n    - **RESTful
    Design**: Standard HTTP methods and status codes\n    - **JSON API**: All requests
    and responses use JSON format\n    - **API Key Authentication**: Secure access
    with user-specific API keys\n    - **Rate Limiting**: 1000 requests per hour per
    API key\n    - **Pagination**: Consistent pagination across all list endpoints\n
    \   \n    ## Location Tool Versioning\n    \n    The Location Tool implements
    automatic version numbering to ensure data integrity:\n    \n    - Version numbers
    are automatically assigned as sequential integers\n    - No manual version input
    is required or accepted\n    - Concurrent version creation is handled safely\n
    \   - All version numbers are stored as integers for proper sorting\n    \n    See
    the Location Tools section for detailed examples and usage patterns.\n    "
paths:
  /api/v1/advisor/findings/:
    get:
      operationId: advisor_findings_list
      description: Retrieve a list of findings across advisor tools owned by the current
        user.
      summary: List findings
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, impact_level, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search findings by name, description, or source detail
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedFindingList'
          description: ''
    post:
      operationId: advisor_findings_create
      description: Create a new finding within an advisor tool.
      summary: Create finding
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FindingRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/FindingRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/FindingRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Finding'
          description: ''
  /api/v1/advisor/findings/{id}/:
    get:
      operationId: advisor_findings_retrieve
      description: Retrieve detailed information about a specific finding.
      summary: Get finding details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this finding.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Finding'
          description: ''
    put:
      operationId: advisor_findings_update
      description: Update all fields of a finding.
      summary: Update finding
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this finding.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FindingRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/FindingRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/FindingRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Finding'
          description: ''
    patch:
      operationId: advisor_findings_partial_update
      description: Update specific fields of a finding.
      summary: Partially update finding
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this finding.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedFindingRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedFindingRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedFindingRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Finding'
          description: ''
    delete:
      operationId: advisor_findings_destroy
      description: Delete a finding.
      summary: Delete finding
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this finding.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/advisor/findings/by_impact/:
    get:
      operationId: advisor_findings_by_impact_retrieve
      description: Filter findings by their impact level.
      summary: Get findings by impact level
      parameters:
      - in: query
        name: level
        schema:
          type: string
        description: Impact level to filter by (e.g. High, Medium, Low)
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Finding'
          description: ''
  /api/v1/advisor/findings/by_source/:
    get:
      operationId: advisor_findings_by_source_retrieve
      description: Filter findings by their source.
      summary: Get findings by source
      parameters:
      - in: query
        name: source
        schema:
          type: string
        description: Source to filter findings by
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Finding'
          description: ''
  /api/v1/advisor/principles/:
    get:
      operationId: advisor_principles_list
      description: Retrieve a list of principles across advisor tools owned by the
        current user.
      summary: List principles
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, weight, order, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search principles by name or description
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPrincipleList'
          description: ''
    post:
      operationId: advisor_principles_create
      description: Create a new principle within an advisor tool.
      summary: Create principle
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PrincipleRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PrincipleRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PrincipleRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Principle'
          description: ''
  /api/v1/advisor/principles/{id}/:
    get:
      operationId: advisor_principles_retrieve
      description: Retrieve detailed information about a specific principle.
      summary: Get principle details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this principle.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Principle'
          description: ''
    put:
      operationId: advisor_principles_update
      description: Update all fields of a principle.
      summary: Update principle
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this principle.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PrincipleRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PrincipleRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PrincipleRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Principle'
          description: ''
    patch:
      operationId: advisor_principles_partial_update
      description: Update specific fields of a principle.
      summary: Partially update principle
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this principle.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPrincipleRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPrincipleRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPrincipleRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Principle'
          description: ''
    delete:
      operationId: advisor_principles_destroy
      description: Delete a principle.
      summary: Delete principle
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this principle.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/advisor/recommendations/:
    get:
      operationId: advisor_recommendations_list
      description: Retrieve a list of recommendations across advisor tools owned by
        the current user.
      summary: List recommendations
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: title, cost, complexity, implementation_days, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search recommendations by title or description
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedRecommendationList'
          description: ''
    post:
      operationId: advisor_recommendations_create
      description: Create a new recommendation within an advisor tool.
      summary: Create recommendation
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
  /api/v1/advisor/recommendations/{id}/:
    get:
      operationId: advisor_recommendations_retrieve
      description: Retrieve detailed information about a specific recommendation.
      summary: Get recommendation details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this recommendation.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
    put:
      operationId: advisor_recommendations_update
      description: Update all fields of a recommendation.
      summary: Update recommendation
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this recommendation.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
    patch:
      operationId: advisor_recommendations_partial_update
      description: Update specific fields of a recommendation.
      summary: Partially update recommendation
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this recommendation.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedRecommendationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedRecommendationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedRecommendationRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
    delete:
      operationId: advisor_recommendations_destroy
      description: Delete a recommendation.
      summary: Delete recommendation
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this recommendation.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/advisor/recommendations/{id}/add_alignment/:
    post:
      operationId: advisor_recommendations_add_alignment_create
      description: Add a principle alignment record to a recommendation.
      summary: Add principle alignment to recommendation
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this recommendation.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
  /api/v1/advisor/recommendations/{id}/add_impact/:
    post:
      operationId: advisor_recommendations_add_impact_create
      description: Add an impact record to a recommendation.
      summary: Add impact to recommendation
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this recommendation.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RecommendationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
  /api/v1/advisor/recommendations/by_complexity/:
    get:
      operationId: advisor_recommendations_by_complexity_retrieve
      description: Filter recommendations by their implementation complexity.
      summary: Get recommendations by complexity
      parameters:
      - in: query
        name: complexity
        schema:
          type: string
        description: Complexity level to filter by
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
  /api/v1/advisor/recommendations/by_timeframe/:
    get:
      operationId: advisor_recommendations_by_timeframe_retrieve
      description: Filter recommendations by implementation timeframe. Short = ≤30
        days, Medium = 31–180 days, Long = >180 days.
      summary: Get recommendations by timeframe
      parameters:
      - in: query
        name: timeframe
        schema:
          type: string
        description: 'Timeframe to filter by: Short, Medium, or Long'
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recommendation'
          description: ''
  /api/v1/advisor/requirements/:
    get:
      operationId: advisor_requirements_list
      description: Retrieve a list of requirements across advisor tools owned by the
        current user.
      summary: List requirements
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, type, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search requirements by name, description, or success measure
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedRequirementList'
          description: ''
    post:
      operationId: advisor_requirements_create
      description: Create a new requirement within an advisor tool.
      summary: Create requirement
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RequirementRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RequirementRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RequirementRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirement'
          description: ''
  /api/v1/advisor/requirements/{id}/:
    get:
      operationId: advisor_requirements_retrieve
      description: Retrieve detailed information about a specific requirement.
      summary: Get requirement details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this requirement.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirement'
          description: ''
    put:
      operationId: advisor_requirements_update
      description: Update all fields of a requirement.
      summary: Update requirement
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this requirement.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RequirementRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RequirementRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RequirementRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirement'
          description: ''
    patch:
      operationId: advisor_requirements_partial_update
      description: Update specific fields of a requirement.
      summary: Partially update requirement
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this requirement.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedRequirementRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedRequirementRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedRequirementRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirement'
          description: ''
    delete:
      operationId: advisor_requirements_destroy
      description: Delete a requirement.
      summary: Delete requirement
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this requirement.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/advisor/requirements/by_type/:
    get:
      operationId: advisor_requirements_by_type_retrieve
      description: Filter requirements by their type.
      summary: Get requirements by type
      parameters:
      - in: query
        name: type
        schema:
          type: string
        description: Requirement type to filter by
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirement'
          description: ''
  /api/v1/advisor/tools/:
    get:
      operationId: advisor_tools_list
      description: Retrieve a list of advisor tools owned by the current user.
      summary: List advisor tools
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search advisor tools by name or description
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedAdvisorToolList'
          description: ''
    post:
      operationId: advisor_tools_create
      description: Create a new advisor tool.
      summary: Create advisor tool
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdvisorToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AdvisorToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/AdvisorToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdvisorTool'
          description: ''
  /api/v1/advisor/tools/{id}/:
    get:
      operationId: advisor_tools_retrieve
      description: Retrieve detailed information about a specific advisor tool.
      summary: Get advisor tool details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Advisor Tool.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdvisorTool'
          description: ''
    put:
      operationId: advisor_tools_update
      description: Update all fields of an advisor tool.
      summary: Update advisor tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Advisor Tool.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdvisorToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AdvisorToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/AdvisorToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdvisorTool'
          description: ''
    patch:
      operationId: advisor_tools_partial_update
      description: Update specific fields of an advisor tool.
      summary: Partially update advisor tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Advisor Tool.
        required: true
      tags:
      - Advisor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedAdvisorToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedAdvisorToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedAdvisorToolRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdvisorTool'
          description: ''
    delete:
      operationId: advisor_tools_destroy
      description: Delete an advisor tool and all associated data.
      summary: Delete advisor tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Advisor Tool.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/advisor/tools/{id}/summary/:
    get:
      operationId: advisor_tools_summary_retrieve
      description: Retrieve a comprehensive summary of the advisor tool including
        all findings, requirements, principles, recommendations, and statistics.
      summary: Get advisor tool summary
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Advisor Tool.
        required: true
      tags:
      - Advisor
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdvisorTool'
          description: ''
  /api/v1/bmc/canvases/:
    get:
      operationId: bmc_canvases_list
      description: Retrieve a list of Business Model Canvases owned by the current
        user.
      summary: List BMC canvases
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedBMCList'
          description: ''
    post:
      operationId: bmc_canvases_create
      description: Create a new Business Model Canvas. The version number is automatically
        assigned.
      summary: Create BMC canvas
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
  /api/v1/bmc/canvases/{id}/:
    get:
      operationId: bmc_canvases_retrieve
      description: Retrieve detailed information about a specific Business Model Canvas.
      summary: Get BMC canvas details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
    put:
      operationId: bmc_canvases_update
      description: Update all fields of a Business Model Canvas.
      summary: Update BMC canvas
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
    patch:
      operationId: bmc_canvases_partial_update
      description: Update specific fields of a Business Model Canvas.
      summary: Partially update BMC canvas
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedBMCRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedBMCRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedBMCRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
    delete:
      operationId: bmc_canvases_destroy
      description: Delete a Business Model Canvas.
      summary: Delete BMC canvas
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/bmc/canvases/{id}/create_version/:
    post:
      operationId: bmc_canvases_create_version_create
      description: Create a new incremented version of the current Business Model
        Canvas.
      summary: Create new version of BMC
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
  /api/v1/bmc/canvases/{id}/export_svg/:
    get:
      operationId: bmc_canvases_export_svg_retrieve
      description: Export the Business Model Canvas as an SVG file download.
      summary: Export BMC as SVG
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            image/svg+xml:
              schema:
                type: string
                format: binary
          description: ''
  /api/v1/bmc/canvases/{id}/save_as_template/:
    post:
      operationId: bmc_canvases_save_as_template_create
      description: Save the current Business Model Canvas as a reusable template.
      summary: Save BMC as template
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
  /api/v1/bmc/canvases/{id}/save_to_gallery/:
    post:
      operationId: bmc_canvases_save_to_gallery_create
      description: Render and save the Business Model Canvas to the media gallery.
      summary: Save BMC to gallery
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Business Model Canvas.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMC'
          description: ''
  /api/v1/bmc/templates/:
    get:
      operationId: bmc_templates_list
      description: Retrieve a list of active Business Model Canvas templates.
      summary: List BMC templates
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedBMCTemplateList'
          description: ''
    post:
      operationId: bmc_templates_create
      description: Create a new Business Model Canvas template.
      summary: Create BMC template
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTemplate'
          description: ''
  /api/v1/bmc/templates/{id}/:
    get:
      operationId: bmc_templates_retrieve
      description: Retrieve detailed information about a specific BMC template.
      summary: Get BMC template details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc template.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTemplate'
          description: ''
    put:
      operationId: bmc_templates_update
      description: Update all fields of a BMC template.
      summary: Update BMC template
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc template.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTemplate'
          description: ''
    patch:
      operationId: bmc_templates_partial_update
      description: Update specific fields of a BMC template.
      summary: Partially update BMC template
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc template.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedBMCTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedBMCTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedBMCTemplateRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTemplate'
          description: ''
    delete:
      operationId: bmc_templates_destroy
      description: Delete a BMC template.
      summary: Delete BMC template
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc template.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/bmc/tools/:
    get:
      operationId: bmc_tools_list
      description: Retrieve a list of Business Model Canvas tools owned by the current
        user.
      summary: List BMC tools
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedBMCToolList'
          description: ''
    post:
      operationId: bmc_tools_create
      description: Create a new Business Model Canvas tool.
      summary: Create BMC tool
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTool'
          description: ''
  /api/v1/bmc/tools/{id}/:
    get:
      operationId: bmc_tools_retrieve
      description: Retrieve detailed information about a specific BMC tool.
      summary: Get BMC tool details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc tool.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTool'
          description: ''
    put:
      operationId: bmc_tools_update
      description: Update all fields of a BMC tool.
      summary: Update BMC tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc tool.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTool'
          description: ''
    patch:
      operationId: bmc_tools_partial_update
      description: Update specific fields of a BMC tool.
      summary: Partially update BMC tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc tool.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedBMCToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedBMCToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedBMCToolRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTool'
          description: ''
    delete:
      operationId: bmc_tools_destroy
      description: Delete a BMC tool and all associated canvases.
      summary: Delete BMC tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc tool.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/bmc/tools/{id}/canvases/:
    get:
      operationId: bmc_tools_canvases_retrieve
      description: Retrieve all canvas versions associated with a specific BMC tool,
        ordered by version descending.
      summary: List canvases for BMC tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc tool.
        required: true
      tags:
      - BMC
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTool'
          description: ''
  /api/v1/bmc/tools/{id}/create_canvas/:
    post:
      operationId: bmc_tools_create_canvas_create
      description: Create a new canvas version for a specific BMC tool. The version
        number is automatically incremented.
      summary: Create canvas for BMC tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this bmc tool.
        required: true
      tags:
      - BMC
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BMCToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BMCTool'
          description: ''
  /api/v1/calendar/events/:
    get:
      operationId: calendar_events_retrieve
      description: Returns calendar events for the authenticated user within a specified
        date range
      summary: List calendar events
      parameters:
      - in: query
        name: end
        schema:
          type: string
        description: End date (ISO format)
      - in: query
        name: start
        schema:
          type: string
        description: Start date (ISO format)
      tags:
      - calendar
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: List of calendar events
  /api/v1/core/api-keys/:
    get:
      operationId: core_api_keys_list
      description: Retrieve a list of API keys belonging to the current user.
      summary: List user API keys
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedAPIKeyList'
          description: ''
  /api/v1/core/api-keys/{id}/:
    get:
      operationId: core_api_keys_retrieve
      description: Retrieve detailed information about a specific API key.
      summary: Get API key details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this api key.
        required: true
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIKey'
          description: ''
  /api/v1/core/currencies/:
    get:
      operationId: core_currencies_list
      description: Retrieve a list of all active currencies available in the system.
      summary: List currencies
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCurrencyList'
          description: ''
  /api/v1/core/currencies/{code}/:
    get:
      operationId: core_currencies_retrieve
      description: Retrieve detailed information about a specific currency.
      summary: Get currency details
      parameters:
      - in: path
        name: code
        schema:
          type: string
        description: A unique value identifying this currency.
        required: true
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Currency'
          description: ''
  /api/v1/core/divisions/:
    get:
      operationId: core_divisions_list
      description: Retrieve a list of divisions with optional filtering by organization.
      summary: List organization divisions
      parameters:
      - in: query
        name: organization
        schema:
          type: integer
        description: Filter divisions by organization ID
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search divisions by name or abbreviation
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOrganizationDivisionList'
          description: ''
    post:
      operationId: core_divisions_create
      description: Create a new organizational division.
      summary: Create new division
      tags:
      - Core
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrganizationDivisionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OrganizationDivisionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OrganizationDivisionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationDivision'
          description: ''
  /api/v1/core/divisions/{id}/:
    get:
      operationId: core_divisions_retrieve
      description: Retrieve detailed information about a specific division including
        hierarchy and counts.
      summary: Get division details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Organization Division.
        required: true
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationDivision'
          description: ''
    put:
      operationId: core_divisions_update
      description: Update an existing division's information.
      summary: Update division
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Organization Division.
        required: true
      tags:
      - Core
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrganizationDivisionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OrganizationDivisionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OrganizationDivisionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationDivision'
          description: ''
    patch:
      operationId: core_divisions_partial_update
      description: Partially update an existing division's information.
      summary: Partially update division
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Organization Division.
        required: true
      tags:
      - Core
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedOrganizationDivisionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedOrganizationDivisionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedOrganizationDivisionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationDivision'
          description: ''
    delete:
      operationId: core_divisions_destroy
      description: Delete a division. Sub-divisions will have their parent cleared.
      summary: Delete division
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Organization Division.
        required: true
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/core/divisions/{id}/sub_divisions/:
    get:
      operationId: core_divisions_sub_divisions_list
      description: Retrieve all sub-divisions of a division recursively.
      summary: Get sub-divisions
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Organization Division.
        required: true
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: search
        required: false
        in: query
        description: A search term.
        schema:
          type: string
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOrganizationDivisionList'
          description: ''
  /api/v1/core/fiscal-years/:
    get:
      operationId: core_fiscal_years_list
      description: Retrieve a list of all fiscal years configured in the system.
      summary: List fiscal years
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedFiscalYearList'
          description: ''
  /api/v1/core/fiscal-years/{id}/:
    get:
      operationId: core_fiscal_years_retrieve
      description: Retrieve detailed information about a specific fiscal year including
        quarters.
      summary: Get fiscal year details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this fiscal year.
        required: true
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FiscalYear'
          description: ''
  /api/v1/core/organizations/:
    get:
      operationId: core_organizations_list
      description: Retrieve a list of organizations with optional search by name.
      summary: List organizations
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search organizations by name
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOrganizationList'
          description: ''
  /api/v1/core/organizations/{id}/:
    get:
      operationId: core_organizations_retrieve
      description: Retrieve detailed information about a specific organization.
      summary: Get organization details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this organization.
        required: true
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Organization'
          description: ''
  /api/v1/core/profile/:
    get:
      operationId: core_profile_retrieve
      description: Retrieve the current user's profile settings including timezone,
        date format, and theme preferences.
      summary: Get user profile
      tags:
      - Core
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserProfile'
          description: ''
    put:
      operationId: core_profile_update
      description: Update the current user's profile settings.
      summary: Update user profile
      tags:
      - Core
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserProfileRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/UserProfileRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/UserProfileRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserProfile'
          description: ''
    patch:
      operationId: core_profile_partial_update
      description: Partially update the current user's profile settings.
      summary: Partially update user profile
      tags:
      - Core
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedUserProfileRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedUserProfileRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedUserProfileRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserProfile'
          description: ''
  /api/v1/core/stats/:
    get:
      operationId: core_stats_retrieve
      description: Get API usage statistics and metrics.
      summary: API Statistics
      tags:
      - System
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  total_requests:
                    type: integer
                  active_users:
                    type: integer
                  endpoints_available:
                    type: integer
                  rate_limit_info:
                    type: object
                    properties:
                      limit:
                        type: integer
                      remaining:
                        type: integer
                      reset_time:
                        type: string
                        format: date-time
          description: ''
  /api/v1/deckcraft/decks/:
    get:
      operationId: deckcraft_decks_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDeckList'
          description: ''
    post:
      operationId: deckcraft_decks_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
  /api/v1/deckcraft/decks/{id}/:
    get:
      operationId: deckcraft_decks_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
    put:
      operationId: deckcraft_decks_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
    patch:
      operationId: deckcraft_decks_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDeckRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
    delete:
      operationId: deckcraft_decks_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/deckcraft/decks/{id}/download/:
    get:
      operationId: deckcraft_decks_download_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
  /api/v1/deckcraft/decks/{id}/generate/:
    post:
      operationId: deckcraft_decks_generate_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
  /api/v1/deckcraft/presentations/:
    get:
      operationId: deckcraft_presentations_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPresentationList'
          description: ''
    post:
      operationId: deckcraft_presentations_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
  /api/v1/deckcraft/presentations/{id}/:
    get:
      operationId: deckcraft_presentations_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
    put:
      operationId: deckcraft_presentations_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
    patch:
      operationId: deckcraft_presentations_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPresentationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPresentationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPresentationRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
    delete:
      operationId: deckcraft_presentations_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/deckcraft/slides/:
    get:
      operationId: deckcraft_slides_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDeckSlideList'
          description: ''
    post:
      operationId: deckcraft_slides_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
  /api/v1/deckcraft/slides/{id}/:
    get:
      operationId: deckcraft_slides_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
    put:
      operationId: deckcraft_slides_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
    patch:
      operationId: deckcraft_slides_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDeckSlideRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
    delete:
      operationId: deckcraft_slides_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/deckcraft/slides/reorder/:
    post:
      operationId: deckcraft_slides_reorder_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
  /api/v1/deckcraft/table-sources/:
    get:
      operationId: deckcraft_table_sources_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTableSourceList'
          description: ''
  /api/v1/deckcraft/table-sources/{id}/:
    get:
      operationId: deckcraft_table_sources_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TableSource'
          description: ''
  /api/v1/deckcraft/table-sources/{id}/data/:
    get:
      operationId: deckcraft_table_sources_data_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TableSource'
          description: ''
  /api/v1/deckcraft/templates/:
    get:
      operationId: deckcraft_templates_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPowerPointTemplateList'
          description: ''
    post:
      operationId: deckcraft_templates_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
  /api/v1/deckcraft/templates/{id}/:
    get:
      operationId: deckcraft_templates_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
    put:
      operationId: deckcraft_templates_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
    patch:
      operationId: deckcraft_templates_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPowerPointTemplateRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
    delete:
      operationId: deckcraft_templates_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/deckcraft/templates/{id}/layouts/:
    get:
      operationId: deckcraft_templates_layouts_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
  /api/v1/deckcraft/templates/{id}/refresh/:
    post:
      operationId: deckcraft_templates_refresh_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
  /api/v1/engagement/engagements/:
    get:
      operationId: engagement_engagements_list
      description: Retrieve a paginated list of client engagements with summary information.
      summary: List engagements
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, start_date, end_date, status, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search engagements by name, description, or client name
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedEngagementSummaryList'
          description: ''
    post:
      operationId: engagement_engagements_create
      description: Create a new client engagement.
      summary: Create engagement
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EngagementRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/EngagementRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/EngagementRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Engagement'
          description: ''
  /api/v1/engagement/engagements/{id}/:
    get:
      operationId: engagement_engagements_retrieve
      description: Retrieve detailed information about a specific engagement.
      summary: Get engagement details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this engagement.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Engagement'
          description: ''
    put:
      operationId: engagement_engagements_update
      description: Update all fields of an engagement record.
      summary: Update engagement
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this engagement.
        required: true
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EngagementRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/EngagementRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/EngagementRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Engagement'
          description: ''
    patch:
      operationId: engagement_engagements_partial_update
      description: Update specific fields of an engagement record.
      summary: Partially update engagement
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this engagement.
        required: true
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedEngagementRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedEngagementRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedEngagementRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Engagement'
          description: ''
    delete:
      operationId: engagement_engagements_destroy
      description: Delete an engagement record.
      summary: Delete engagement
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this engagement.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/engagement/engagements/{id}/summary/:
    get:
      operationId: engagement_engagements_summary_retrieve
      description: Retrieve comprehensive engagement summary including interviews,
        workshops, and statistics.
      summary: Get engagement summary
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this engagement.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  engagement:
                    type: object
                    description: Engagement details
                  interviews:
                    type: array
                    description: List of interviews
                  workshops:
                    type: array
                    description: List of workshops
                  statistics:
                    type: object
                    properties:
                      total_interviews:
                        type: integer
                      total_workshops:
                        type: integer
                      duration_days:
                        type: integer
          description: ''
  /api/v1/engagement/engagements/by_client/:
    get:
      operationId: engagement_engagements_by_client_retrieve
      description: Filter engagements by a specific client.
      summary: Get engagements by client
      parameters:
      - in: query
        name: client_id
        schema:
          type: string
          format: uuid
        description: ID of the client to filter engagements by
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Engagement'
          description: ''
  /api/v1/engagement/engagements/by_status/:
    get:
      operationId: engagement_engagements_by_status_retrieve
      description: Filter engagements by their current status.
      summary: Get engagements by status
      parameters:
      - in: query
        name: status
        schema:
          type: string
        description: Status to filter engagements by
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Engagement'
          description: ''
  /api/v1/engagement/interviews/:
    get:
      operationId: engagement_interviews_list
      description: Retrieve a list of interviews for engagements owned by the current
        user.
      summary: List interviews
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, date, time'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search interviews by name, notes, or contact name
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedInterviewList'
          description: ''
    post:
      operationId: engagement_interviews_create
      description: Create a new interview within an engagement.
      summary: Create interview
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InterviewRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/InterviewRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/InterviewRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Interview'
          description: ''
  /api/v1/engagement/interviews/{id}/:
    get:
      operationId: engagement_interviews_retrieve
      description: Retrieve detailed information about a specific interview.
      summary: Get interview details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this interview.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Interview'
          description: ''
    put:
      operationId: engagement_interviews_update
      description: Update all fields of an interview record.
      summary: Update interview
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this interview.
        required: true
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InterviewRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/InterviewRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/InterviewRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Interview'
          description: ''
    patch:
      operationId: engagement_interviews_partial_update
      description: Update specific fields of an interview record.
      summary: Partially update interview
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this interview.
        required: true
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedInterviewRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedInterviewRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedInterviewRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Interview'
          description: ''
    delete:
      operationId: engagement_interviews_destroy
      description: Delete an interview record.
      summary: Delete interview
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this interview.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/engagement/interviews/by_engagement/:
    get:
      operationId: engagement_interviews_by_engagement_retrieve
      description: Retrieve all interviews for a specific engagement.
      summary: Get interviews by engagement
      parameters:
      - in: query
        name: engagement_id
        schema:
          type: string
          format: uuid
        description: ID of the engagement to filter interviews by
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Interview'
          description: ''
  /api/v1/engagement/workshops/:
    get:
      operationId: engagement_workshops_list
      description: Retrieve a list of workshops for engagements owned by the current
        user.
      summary: List workshops
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, date, time, workshop_type'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search workshops by name, notes, or workshop type
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedWorkshopList'
          description: ''
    post:
      operationId: engagement_workshops_create
      description: Create a new workshop within an engagement.
      summary: Create workshop
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkshopRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/WorkshopRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/WorkshopRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workshop'
          description: ''
  /api/v1/engagement/workshops/{id}/:
    get:
      operationId: engagement_workshops_retrieve
      description: Retrieve detailed information about a specific workshop.
      summary: Get workshop details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this workshop.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workshop'
          description: ''
    put:
      operationId: engagement_workshops_update
      description: Update all fields of a workshop record.
      summary: Update workshop
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this workshop.
        required: true
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkshopRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/WorkshopRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/WorkshopRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workshop'
          description: ''
    patch:
      operationId: engagement_workshops_partial_update
      description: Update specific fields of a workshop record.
      summary: Partially update workshop
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this workshop.
        required: true
      tags:
      - Engagement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedWorkshopRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedWorkshopRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedWorkshopRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workshop'
          description: ''
    delete:
      operationId: engagement_workshops_destroy
      description: Delete a workshop record.
      summary: Delete workshop
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this workshop.
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/engagement/workshops/by_engagement/:
    get:
      operationId: engagement_workshops_by_engagement_retrieve
      description: Retrieve all workshops for a specific engagement.
      summary: Get workshops by engagement
      parameters:
      - in: query
        name: engagement_id
        schema:
          type: string
          format: uuid
        description: ID of the engagement to filter workshops by
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workshop'
          description: ''
  /api/v1/engagement/workshops/by_type/:
    get:
      operationId: engagement_workshops_by_type_retrieve
      description: Filter workshops by workshop type.
      summary: Get workshops by type
      parameters:
      - in: query
        name: type
        schema:
          type: string
        description: Workshop type to filter by
        required: true
      tags:
      - Engagement
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workshop'
          description: ''
  /api/v1/gallery/collections/:
    get:
      operationId: gallery_collections_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: page_size
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedMediaCollectionList'
          description: ''
    post:
      operationId: gallery_collections_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MediaCollectionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MediaCollectionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MediaCollectionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaCollection'
          description: ''
  /api/v1/gallery/collections/{id}/:
    get:
      operationId: gallery_collections_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media collection.
        required: true
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaCollection'
          description: ''
    put:
      operationId: gallery_collections_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media collection.
        required: true
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MediaCollectionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MediaCollectionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MediaCollectionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaCollection'
          description: ''
    patch:
      operationId: gallery_collections_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media collection.
        required: true
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedMediaCollectionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedMediaCollectionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedMediaCollectionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaCollection'
          description: ''
    delete:
      operationId: gallery_collections_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media collection.
        required: true
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/gallery/media/:
    get:
      operationId: gallery_media_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: page_size
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      - name: search
        required: false
        in: query
        description: A search term.
        schema:
          type: string
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedMediaItemList'
          description: ''
    post:
      operationId: gallery_media_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MediaItemRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MediaItemRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MediaItemRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaItem'
          description: ''
  /api/v1/gallery/media/{id}/:
    get:
      operationId: gallery_media_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media item.
        required: true
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaItem'
          description: ''
    put:
      operationId: gallery_media_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media item.
        required: true
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MediaItemRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MediaItemRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MediaItemRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaItem'
          description: ''
    patch:
      operationId: gallery_media_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media item.
        required: true
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedMediaItemRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedMediaItemRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedMediaItemRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaItem'
          description: ''
    delete:
      operationId: gallery_media_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this media item.
        required: true
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/gallery/media/by_type/:
    get:
      operationId: gallery_media_by_type_retrieve
      description: Get media items filtered by type
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: No response body
  /api/v1/gallery/media/search/:
    get:
      operationId: gallery_media_search_retrieve
      description: Search for media items with optional filtering
      summary: Search media items
      parameters:
      - in: query
        name: limit
        schema:
          type: integer
        description: Maximum number of results
      - in: query
        name: q
        schema:
          type: string
        description: Search query
      - in: query
        name: type
        schema:
          type: string
        description: Filter by media type
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Search results
  /api/v1/gallery/search/:
    get:
      operationId: gallery_search_retrieve
      description: Search for media items with optional filtering
      summary: Search media items
      parameters:
      - in: query
        name: limit
        schema:
          type: integer
        description: Maximum number of results
      - in: query
        name: q
        schema:
          type: string
        description: Search query
      - in: query
        name: type
        schema:
          type: string
        description: Filter by media type
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Search results
  /api/v1/gallery/tags/:
    get:
      operationId: gallery_tags_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: page_size
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTagList'
          description: ''
    post:
      operationId: gallery_tags_create
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TagRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TagRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TagRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tag'
          description: ''
  /api/v1/gallery/tags/{id}/:
    get:
      operationId: gallery_tags_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this tag.
        required: true
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tag'
          description: ''
    put:
      operationId: gallery_tags_update
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this tag.
        required: true
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TagRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TagRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TagRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tag'
          description: ''
    patch:
      operationId: gallery_tags_partial_update
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this tag.
        required: true
      tags:
      - gallery
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTagRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTagRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTagRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tag'
          description: ''
    delete:
      operationId: gallery_tags_destroy
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this tag.
        required: true
      tags:
      - gallery
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/location-tool/location-sets/{location_set_pk}/csv/:
    get:
      operationId: location_tool_location_sets_csv_retrieve
      description: Export all locations in a location set to CSV format.
      summary: Export locations to CSV
      parameters:
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      tags:
      - CSV Operations
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: string
                format: binary
          description: ''
    post:
      operationId: location_tool_location_sets_csv_create
      description: Import location data from a CSV file with validation and error
        reporting.
      summary: Import locations from CSV
      parameters:
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      tags:
      - CSV Operations
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CSVImportRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CSVImportRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: ''
  /api/v1/location-tool/table-sources/:
    get:
      operationId: location_tool_table_sources_list
      description: Retrieve table source configurations for location tools.
      summary: List table sources
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - Table Sources
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedLocationTableSourceList'
          description: ''
    post:
      operationId: location_tool_table_sources_create
      description: Create a new table source configuration for a location tool.
      summary: Create table source
      tags:
      - Table Sources
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationTableSourceRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/LocationTableSourceRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/LocationTableSourceRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationTableSource'
          description: ''
  /api/v1/location-tool/table-sources/{id}/:
    get:
      operationId: location_tool_table_sources_retrieve
      description: Retrieve detailed information about a table source configuration.
      summary: Get table source details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location table source.
        required: true
      tags:
      - Table Sources
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationTableSource'
          description: ''
    put:
      operationId: location_tool_table_sources_update
      description: Update an existing table source configuration.
      summary: Update table source
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location table source.
        required: true
      tags:
      - Table Sources
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationTableSourceRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/LocationTableSourceRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/LocationTableSourceRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationTableSource'
          description: ''
    patch:
      operationId: location_tool_table_sources_partial_update
      description: |-
        Location Table Source management endpoints.

        Provides CRUD access to table source configurations including:
        - Field selection settings
        - Schema generation
        - Data access for other tools
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location table source.
        required: true
      tags:
      - location-tool
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedLocationTableSourceRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedLocationTableSourceRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedLocationTableSourceRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationTableSource'
          description: ''
    delete:
      operationId: location_tool_table_sources_destroy
      description: Delete a table source configuration.
      summary: Delete table source
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location table source.
        required: true
      tags:
      - Table Sources
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/location-tool/table-sources/{id}/data/:
    get:
      operationId: location_tool_table_sources_data_retrieve
      description: Retrieve the actual data from this table source.
      summary: Get table source data
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location table source.
        required: true
      tags:
      - Table Sources
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
          description: ''
  /api/v1/location-tool/tools/:
    get:
      operationId: location_tool_tools_list
      description: Retrieve a list of client location tools owned by the current user.
      summary: List client location tools
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: search
        required: false
        in: query
        description: A search term.
        schema:
          type: string
      tags:
      - Location Tools
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedClientLocationToolList'
          description: ''
    post:
      operationId: location_tool_tools_create
      description: Create a new client location tool.
      summary: Create location tool
      tags:
      - Location Tools
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientLocationTool'
          description: ''
  /api/v1/location-tool/tools/{id}/:
    get:
      operationId: location_tool_tools_retrieve
      description: Retrieve detailed information about a specific client location
        tool.
      summary: Get location tool details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Client Location Tool.
        required: true
      tags:
      - Location Tools
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientLocationTool'
          description: ''
    put:
      operationId: location_tool_tools_update
      description: Update an existing client location tool.
      summary: Update location tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Client Location Tool.
        required: true
      tags:
      - Location Tools
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientLocationTool'
          description: ''
    patch:
      operationId: location_tool_tools_partial_update
      description: Partially update an existing client location tool.
      summary: Partially update location tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Client Location Tool.
        required: true
      tags:
      - Location Tools
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedClientLocationToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedClientLocationToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedClientLocationToolRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientLocationTool'
          description: ''
    delete:
      operationId: location_tool_tools_destroy
      description: Delete a client location tool and all associated data.
      summary: Delete location tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Client Location Tool.
        required: true
      tags:
      - Location Tools
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/location-tool/tools/{id}/create_version/:
    post:
      operationId: location_tool_tools_create_version_create
      description: "\n        Create a new version of the location tool with automatic
        version numbering.\n        \n        This endpoint implements automatic version
        numbering where:\n        - Version numbers are automatically assigned as
        sequential integers (1, 2, 3, etc.)\n        - No version number should be
        provided in the request\n        - The system finds the highest existing version
        and increments by 1\n        - All data from the current version is copied
        to the new version\n        - The tool's current_version is updated to the
        new version\n        \n        The response includes the automatically assigned
        version number.\n        \n        Concurrent Safety:\n        Multiple simultaneous
        requests are handled safely using database constraints.\n        If a conflict
        occurs, an appropriate error message is returned.\n        "
      summary: Create new version
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Client Location Tool.
        required: true
      tags:
      - Location Tools
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationSet'
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Version creation failed due to duplicate version number.
                      This may be caused by concurrent version creation attempts.
          description: ''
  /api/v1/location-tool/tools/{id}/switch_version/:
    post:
      operationId: location_tool_tools_switch_version_create
      description: "\n        Switch the current active version of the location tool.\n
        \       \n        This endpoint allows switching between existing versions
        of a location tool.\n        The version parameter must be an integer corresponding
        to an existing version.\n        \n        Version numbers are sequential
        integers (1, 2, 3, etc.) that were automatically\n        assigned when the
        versions were created.\n        "
      summary: Switch version
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Client Location Tool.
        required: true
      - in: query
        name: version
        schema:
          type: integer
        description: Version number to switch to (integer, e.g., 1, 2, 3)
        required: true
      tags:
      - Location Tools
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientLocationToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientLocationTool'
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Version must be a valid integer
          description: ''
        '404':
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Version 5 does not exist
          description: ''
  /api/v1/location-tool/tools/{tool_pk}/location-sets/:
    get:
      operationId: location_tool_tools_location_sets_list
      description: Retrieve location sets for a specific tool.
      summary: List location sets
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Location Sets
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedLocationSetList'
          description: ''
    post:
      operationId: location_tool_tools_location_sets_create
      description: Create a new location set for a tool.
      summary: Create location set
      parameters:
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Location Sets
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationSetRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/LocationSetRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/LocationSetRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationSet'
          description: ''
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/custom-fields/:
    get:
      operationId: location_tool_tools_location_sets_custom_fields_list
      description: Retrieve custom field definitions for a location set.
      summary: List custom field definitions
      parameters:
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Custom Fields
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCustomFieldDefinitionList'
          description: ''
    post:
      operationId: location_tool_tools_location_sets_custom_fields_create
      description: Create a new custom field definition for a location set.
      summary: Create custom field definition
      parameters:
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Custom Fields
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomFieldDefinitionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CustomFieldDefinitionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CustomFieldDefinitionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomFieldDefinition'
          description: ''
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/custom-fields/{id}/:
    get:
      operationId: location_tool_tools_location_sets_custom_fields_retrieve
      description: Retrieve details about a specific custom field definition.
      summary: Get custom field definition
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this custom field definition.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Custom Fields
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomFieldDefinition'
          description: ''
    put:
      operationId: location_tool_tools_location_sets_custom_fields_update
      description: Update an existing custom field definition.
      summary: Update custom field definition
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this custom field definition.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Custom Fields
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomFieldDefinitionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CustomFieldDefinitionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CustomFieldDefinitionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomFieldDefinition'
          description: ''
    patch:
      operationId: location_tool_tools_location_sets_custom_fields_partial_update
      description: |-
        Custom Field Definition management endpoints.

        Provides CRUD access to custom field definitions including:
        - Field type configuration
        - Validation rules
        - Default values and ordering
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this custom field definition.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - location-tool
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedCustomFieldDefinitionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedCustomFieldDefinitionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedCustomFieldDefinitionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomFieldDefinition'
          description: ''
    delete:
      operationId: location_tool_tools_location_sets_custom_fields_destroy
      description: Delete a custom field definition and all associated values.
      summary: Delete custom field definition
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this custom field definition.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Custom Fields
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/:
    get:
      operationId: location_tool_tools_location_sets_locations_list
      description: Retrieve locations in a specific location set with filtering and
        search.
      summary: List locations
      parameters:
      - in: query
        name: client
        schema:
          type: integer
        description: Filter by client ID
      - in: query
        name: country
        schema:
          type: string
        description: Filter by country
      - in: query
        name: division
        schema:
          type: integer
        description: Filter by division ID
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search across site name and address
      - in: query
        name: state
        schema:
          type: string
        description: Filter by state
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedLocationList'
          description: ''
    post:
      operationId: location_tool_tools_location_sets_locations_create
      description: Create a new location in the location set.
      summary: Create location
      parameters:
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/LocationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/LocationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
          description: ''
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/{id}/:
    get:
      operationId: location_tool_tools_location_sets_locations_retrieve
      description: Retrieve detailed information about a specific location.
      summary: Get location details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
          description: ''
    put:
      operationId: location_tool_tools_location_sets_locations_update
      description: Update an existing location.
      summary: Update location
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/LocationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/LocationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
          description: ''
    patch:
      operationId: location_tool_tools_location_sets_locations_partial_update
      description: Partially update an existing location.
      summary: Partially update location
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedLocationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedLocationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedLocationRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
          description: ''
    delete:
      operationId: location_tool_tools_location_sets_locations_destroy
      description: Delete a location and all associated custom field values.
      summary: Delete location
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/{id}/set_custom_field/:
    post:
      operationId: location_tool_tools_location_sets_locations_set_custom_field_create
      description: Update a custom field value for this location.
      summary: Update custom field value
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this location.
        required: true
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                field_name:
                  type: string
                value:
                  type: string
              required:
              - field_name
              - value
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
          description: ''
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/bulk_operations/:
    post:
      operationId: location_tool_tools_location_sets_locations_bulk_operations_create
      description: Perform bulk operations on multiple locations.
      summary: Bulk operations
      parameters:
      - in: path
        name: location_set_pk
        schema:
          type: integer
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Locations
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkLocationOperationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/BulkLocationOperationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BulkLocationOperationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: ''
  /api/v1/location-tool/tools/{tool_pk}/location-sets/{id}/:
    get:
      operationId: location_tool_tools_location_sets_retrieve
      description: Retrieve detailed information about a specific location set.
      summary: Get location set details
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Location Sets
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationSet'
          description: ''
    put:
      operationId: location_tool_tools_location_sets_update
      description: Update an existing location set.
      summary: Update location set
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Location Sets
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationSetRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/LocationSetRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/LocationSetRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationSet'
          description: ''
    patch:
      operationId: location_tool_tools_location_sets_partial_update
      description: |-
        Location Set management endpoints.

        Provides CRUD access to location sets including:
        - Version management
        - Custom field definitions
        - Location aggregations
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - location-tool
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedLocationSetRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedLocationSetRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedLocationSetRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationSet'
          description: ''
    delete:
      operationId: location_tool_tools_location_sets_destroy
      description: Delete a location set and all associated locations.
      summary: Delete location set
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      - in: path
        name: tool_pk
        schema:
          type: string
        required: true
      tags:
      - Location Sets
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/calendar-events/:
    get:
      operationId: orbit_calendar_events_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCalendarEventList'
          description: ''
    post:
      operationId: orbit_calendar_events_create
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
  /api/v1/orbit/calendar-events/{id}/:
    get:
      operationId: orbit_calendar_events_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    put:
      operationId: orbit_calendar_events_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    patch:
      operationId: orbit_calendar_events_partial_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    delete:
      operationId: orbit_calendar_events_destroy
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/clients/:
    get:
      operationId: orbit_clients_list
      description: Retrieve a paginated list of clients owned by the current user.
      summary: List clients
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order results by: name, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search clients by name, legal name, or overview
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedClientList'
          description: ''
    post:
      operationId: orbit_clients_create
      description: Create a new client record.
      summary: Create client
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
  /api/v1/orbit/clients/{id}/:
    get:
      operationId: orbit_clients_retrieve
      description: Retrieve detailed information about a specific client.
      summary: Get client details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    put:
      operationId: orbit_clients_update
      description: Update all fields of a client record.
      summary: Update client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    patch:
      operationId: orbit_clients_partial_update
      description: Update specific fields of a client record.
      summary: Partially update client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    delete:
      operationId: orbit_clients_destroy
      description: Delete a client record.
      summary: Delete client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/contacts/:
    get:
      operationId: orbit_contacts_list
      description: Retrieve a paginated list of contacts from user's clients and vendors.
      summary: List contacts
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search contacts by name, job title, or email
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedContactList'
          description: ''
    post:
      operationId: orbit_contacts_create
      description: Create a new contact record.
      summary: Create contact
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
  /api/v1/orbit/contacts/{id}/:
    get:
      operationId: orbit_contacts_retrieve
      description: Retrieve detailed information about a specific contact.
      summary: Get contact details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    put:
      operationId: orbit_contacts_update
      description: Update all fields of a contact record.
      summary: Update contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    patch:
      operationId: orbit_contacts_partial_update
      description: Update specific fields of a contact record.
      summary: Partially update contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    delete:
      operationId: orbit_contacts_destroy
      description: Delete a contact record.
      summary: Delete contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/contacts/search/:
    get:
      operationId: orbit_contacts_search_retrieve
      description: Advanced contact search with organization type filtering.
      summary: Search contacts
      parameters:
      - in: query
        name: organization_type
        schema:
          type: string
        description: 'Filter by organization type: client or vendor'
      - in: query
        name: search_term
        schema:
          type: string
        description: Search term for name or job title
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
  /api/v1/orbit/digital-contact-types/:
    get:
      operationId: orbit_digital_contact_types_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDigitalContactTypeList'
          description: ''
  /api/v1/orbit/digital-contact-types/{id}/:
    get:
      operationId: orbit_digital_contact_types_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact type.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContactType'
          description: ''
  /api/v1/orbit/digital-contacts/:
    get:
      operationId: orbit_digital_contacts_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDigitalContactList'
          description: ''
    post:
      operationId: orbit_digital_contacts_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
  /api/v1/orbit/digital-contacts/{id}/:
    get:
      operationId: orbit_digital_contacts_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    put:
      operationId: orbit_digital_contacts_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    patch:
      operationId: orbit_digital_contacts_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    delete:
      operationId: orbit_digital_contacts_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/opportunities/:
    get:
      operationId: orbit_opportunities_list
      description: Retrieve a paginated list of sales opportunities.
      summary: List opportunities
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, expected_close_date, value'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search opportunities by name or description
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOpportunityList'
          description: ''
    post:
      operationId: orbit_opportunities_create
      description: Create a new sales opportunity.
      summary: Create opportunity
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
  /api/v1/orbit/opportunities/{id}/:
    get:
      operationId: orbit_opportunities_retrieve
      description: Retrieve detailed information about a specific opportunity.
      summary: Get opportunity details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    put:
      operationId: orbit_opportunities_update
      description: Update all fields of an opportunity record.
      summary: Update opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    patch:
      operationId: orbit_opportunities_partial_update
      description: Update specific fields of an opportunity record.
      summary: Partially update opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    delete:
      operationId: orbit_opportunities_destroy
      description: Delete an opportunity record.
      summary: Delete opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/opportunities/by_status/:
    get:
      operationId: orbit_opportunities_by_status_retrieve
      description: Retrieve opportunities filtered by status and optionally by client.
      summary: Filter opportunities by status
      parameters:
      - in: query
        name: client_id
        schema:
          type: integer
        description: Filter by specific client ID
      - in: query
        name: status
        schema:
          type: string
        description: 'Filter by opportunity status: active, won, lost, dropped'
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
  /api/v1/orbit/proposals/:
    get:
      operationId: orbit_proposals_list
      description: Retrieve a paginated list of proposals for opportunities owned
        by the current user.
      summary: List proposals
      parameters:
      - in: query
        name: opportunity_id
        schema:
          type: integer
        description: Filter by opportunity ID
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, due_date, submitted_date, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search proposals by name
      - in: query
        name: status
        schema:
          type: string
        description: 'Filter by status: Draft, In Review, Final'
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedProposalList'
          description: ''
    post:
      operationId: orbit_proposals_create
      description: Create a new proposal record.
      summary: Create proposal
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
  /api/v1/orbit/proposals/{id}/:
    get:
      operationId: orbit_proposals_retrieve
      description: Retrieve detailed information about a specific proposal.
      summary: Get proposal details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    put:
      operationId: orbit_proposals_update
      description: Update all fields of a proposal record.
      summary: Update proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    patch:
      operationId: orbit_proposals_partial_update
      description: Update specific fields of a proposal record.
      summary: Partially update proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    delete:
      operationId: orbit_proposals_destroy
      description: Delete a proposal record.
      summary: Delete proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/stock/overview/{symbol}/:
    get:
      operationId: orbit_stock_overview_retrieve
      description: Returns company overview data for a stock symbol
      summary: Get company overview
      parameters:
      - in: path
        name: symbol
        schema:
          type: string
        description: Stock symbol
        required: true
      tags:
      - stock
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Company overview data
        '403':
          description: Access denied
        '500':
          description: Unable to fetch company data
  /api/v1/orbit/stock/quote/{symbol}/:
    get:
      operationId: orbit_stock_quote_retrieve
      description: Returns current stock quote data for a symbol
      summary: Get stock quote
      parameters:
      - in: path
        name: symbol
        schema:
          type: string
        description: Stock symbol
        required: true
      tags:
      - stock
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Stock quote data
        '403':
          description: Access denied
        '500':
          description: Unable to fetch stock data
  /api/v1/orbit/suggest-timezone/:
    post:
      operationId: orbit_suggest_timezone_create
      description: Uses address components to suggest an appropriate timezone using
        geocoding.
      summary: Suggest timezone from address
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                street_address:
                  type: string
                locality:
                  type: string
                region:
                  type: string
                postal_code:
                  type: string
                country:
                  type: string
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  timezone:
                    type: string
                  success:
                    type: boolean
                  method:
                    type: string
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  success:
                    type: boolean
          description: ''
  /api/v1/orbit/vendor-solutions/:
    get:
      operationId: orbit_vendor_solutions_list
      description: Retrieve a paginated list of vendor solutions.
      summary: List vendor solutions
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search solutions by name or description
      - in: query
        name: vendor
        schema:
          type: integer
        description: Filter by vendor ID
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVendorSolutionList'
          description: ''
    post:
      operationId: orbit_vendor_solutions_create
      description: Create a new vendor solution.
      summary: Create vendor solution
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
  /api/v1/orbit/vendor-solutions/{id}/:
    get:
      operationId: orbit_vendor_solutions_retrieve
      description: Retrieve detailed information about a specific vendor solution.
      summary: Get vendor solution details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    put:
      operationId: orbit_vendor_solutions_update
      description: Update all fields of a vendor solution record.
      summary: Update vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    patch:
      operationId: orbit_vendor_solutions_partial_update
      description: Update specific fields of a vendor solution record.
      summary: Partially update vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    delete:
      operationId: orbit_vendor_solutions_destroy
      description: Delete a vendor solution record.
      summary: Delete vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/orbit/vendors/:
    get:
      operationId: orbit_vendors_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: search
        required: false
        in: query
        description: A search term.
        schema:
          type: string
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVendorList'
          description: ''
    post:
      operationId: orbit_vendors_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
  /api/v1/orbit/vendors/{id}/:
    get:
      operationId: orbit_vendors_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    put:
      operationId: orbit_vendors_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    patch:
      operationId: orbit_vendors_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    delete:
      operationId: orbit_vendors_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/pricing/line-items/:
    get:
      operationId: pricing_line_items_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPriceLineItemList'
          description: ''
    post:
      operationId: pricing_line_items_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceLineItemRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PriceLineItemRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PriceLineItemRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceLineItem'
          description: ''
  /api/v1/pricing/line-items/{id}/:
    get:
      operationId: pricing_line_items_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price line item.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceLineItem'
          description: ''
    put:
      operationId: pricing_line_items_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price line item.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceLineItemRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PriceLineItemRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PriceLineItemRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceLineItem'
          description: ''
    patch:
      operationId: pricing_line_items_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price line item.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPriceLineItemRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPriceLineItemRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPriceLineItemRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceLineItem'
          description: ''
    delete:
      operationId: pricing_line_items_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price line item.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/pricing/tools/:
    get:
      operationId: pricing_tools_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPricingToolList'
          description: ''
    post:
      operationId: pricing_tools_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingTool'
          description: ''
  /api/v1/pricing/tools/{id}/:
    get:
      operationId: pricing_tools_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this pricing tool.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingTool'
          description: ''
    put:
      operationId: pricing_tools_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this pricing tool.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingTool'
          description: ''
    patch:
      operationId: pricing_tools_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this pricing tool.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPricingToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPricingToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPricingToolRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingTool'
          description: ''
    delete:
      operationId: pricing_tools_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this pricing tool.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/pricing/tools/{id}/copy_version/:
    post:
      operationId: pricing_tools_copy_version_create
      description: Copy an existing version
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this pricing tool.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PricingToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingTool'
          description: ''
  /api/v1/pricing/tools/{id}/versions/:
    get:
      operationId: pricing_tools_versions_retrieve
      description: Get all price versions for this tool
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this pricing tool.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingTool'
          description: ''
  /api/v1/pricing/versions/:
    get:
      operationId: pricing_versions_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPriceVersionList'
          description: ''
    post:
      operationId: pricing_versions_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceVersionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PriceVersionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PriceVersionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceVersion'
          description: ''
  /api/v1/pricing/versions/{id}/:
    get:
      operationId: pricing_versions_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price version.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceVersion'
          description: ''
    put:
      operationId: pricing_versions_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price version.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceVersionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PriceVersionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PriceVersionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceVersion'
          description: ''
    patch:
      operationId: pricing_versions_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price version.
        required: true
      tags:
      - pricing
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPriceVersionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPriceVersionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPriceVersionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceVersion'
          description: ''
    delete:
      operationId: pricing_versions_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price version.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/pricing/versions/{id}/pricing_table/:
    get:
      operationId: pricing_versions_pricing_table_retrieve
      description: Get formatted pricing table data
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this price version.
        required: true
      tags:
      - pricing
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceVersion'
          description: ''
  /api/v1/raid/assumptions/:
    get:
      operationId: raid_assumptions_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedAssumptionList'
          description: ''
  /api/v1/raid/assumptions/{id}/:
    get:
      operationId: raid_assumptions_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this assumption.
        required: true
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assumption'
          description: ''
  /api/v1/raid/dependencies/:
    get:
      operationId: raid_dependencies_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDependencyList'
          description: ''
  /api/v1/raid/dependencies/{id}/:
    get:
      operationId: raid_dependencies_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this dependency.
        required: true
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Dependency'
          description: ''
  /api/v1/raid/issues/:
    get:
      operationId: raid_issues_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedIssueList'
          description: ''
  /api/v1/raid/issues/{id}/:
    get:
      operationId: raid_issues_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this issue.
        required: true
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Issue'
          description: ''
  /api/v1/raid/risks/:
    get:
      operationId: raid_risks_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedRiskList'
          description: ''
  /api/v1/raid/risks/{id}/:
    get:
      operationId: raid_risks_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this risk.
        required: true
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Risk'
          description: ''
  /api/v1/raid/tools/:
    get:
      operationId: raid_tools_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedRAIDToolList'
          description: ''
  /api/v1/raid/tools/{id}/:
    get:
      operationId: raid_tools_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this raid tool.
        required: true
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RAIDTool'
          description: ''
  /api/v1/raid/tools/{id}/table_data/:
    get:
      operationId: raid_tools_table_data_retrieve
      description: Return RAID data formatted for table display
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this raid tool.
        required: true
      tags:
      - raid
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RAIDTool'
          description: ''
  /api/v1/requirements/requirements/:
    get:
      operationId: requirements_requirements_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - requirements
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedRequirementList'
          description: ''
  /api/v1/requirements/requirements/{id}/:
    get:
      operationId: requirements_requirements_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this requirement.
        required: true
      tags:
      - requirements
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirement'
          description: ''
  /api/v1/requirements/tools/:
    get:
      operationId: requirements_tools_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - requirements
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedRequirementsToolList'
          description: ''
  /api/v1/requirements/tools/{id}/:
    get:
      operationId: requirements_tools_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this Requirements Tool.
        required: true
      tags:
      - requirements
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RequirementsTool'
          description: ''
  /api/v1/stakeholder/org-charts/:
    get:
      operationId: stakeholder_org_charts_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOrgChartList'
          description: ''
    post:
      operationId: stakeholder_org_charts_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrgChartRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OrgChartRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OrgChartRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrgChart'
          description: ''
  /api/v1/stakeholder/org-charts/{id}/:
    get:
      operationId: stakeholder_org_charts_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this org chart.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrgChart'
          description: ''
    put:
      operationId: stakeholder_org_charts_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this org chart.
        required: true
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrgChartRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OrgChartRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OrgChartRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrgChart'
          description: ''
    patch:
      operationId: stakeholder_org_charts_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this org chart.
        required: true
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedOrgChartRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedOrgChartRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedOrgChartRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrgChart'
          description: ''
    delete:
      operationId: stakeholder_org_charts_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this org chart.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/stakeholder/org-charts/{id}/levels/:
    get:
      operationId: stakeholder_org_charts_levels_retrieve
      description: Get org chart data organized by levels
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this org chart.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrgChart'
          description: ''
  /api/v1/stakeholder/stakeholders/:
    get:
      operationId: stakeholder_stakeholders_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedStakeholderList'
          description: ''
    post:
      operationId: stakeholder_stakeholders_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StakeholderRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StakeholderRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StakeholderRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stakeholder'
          description: ''
  /api/v1/stakeholder/stakeholders/{id}/:
    get:
      operationId: stakeholder_stakeholders_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stakeholder'
          description: ''
    put:
      operationId: stakeholder_stakeholders_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder.
        required: true
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StakeholderRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StakeholderRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StakeholderRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stakeholder'
          description: ''
    patch:
      operationId: stakeholder_stakeholders_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder.
        required: true
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedStakeholderRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedStakeholderRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedStakeholderRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stakeholder'
          description: ''
    delete:
      operationId: stakeholder_stakeholders_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/stakeholder/tools/:
    get:
      operationId: stakeholder_tools_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedStakeholderToolList'
          description: ''
    post:
      operationId: stakeholder_tools_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StakeholderToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StakeholderToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StakeholderToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StakeholderTool'
          description: ''
  /api/v1/stakeholder/tools/{id}/:
    get:
      operationId: stakeholder_tools_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder tool.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StakeholderTool'
          description: ''
    put:
      operationId: stakeholder_tools_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder tool.
        required: true
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StakeholderToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StakeholderToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StakeholderToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StakeholderTool'
          description: ''
    patch:
      operationId: stakeholder_tools_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder tool.
        required: true
      tags:
      - stakeholder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedStakeholderToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedStakeholderToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedStakeholderToolRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StakeholderTool'
          description: ''
    delete:
      operationId: stakeholder_tools_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder tool.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/stakeholder/tools/{id}/power_interest_matrix/:
    get:
      operationId: stakeholder_tools_power_interest_matrix_retrieve
      description: Get stakeholders organized by power/interest matrix
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stakeholder tool.
        required: true
      tags:
      - stakeholder
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StakeholderTool'
          description: ''
  /api/v1/tei/reports/:
    get:
      operationId: tei_reports_list
      description: CRUD for ``TEIReport``.  Admin-only write side per spec §Permissions.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTEIReportList'
          description: ''
    post:
      operationId: tei_reports_create
      description: CRUD for ``TEIReport``.  Admin-only write side per spec §Permissions.
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TEIReportRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TEIReportRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TEIReportRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReport'
          description: ''
  /api/v1/tei/reports/{public_id}/:
    get:
      operationId: tei_reports_retrieve
      description: CRUD for ``TEIReport``.  Admin-only write side per spec §Permissions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReport'
          description: ''
    put:
      operationId: tei_reports_update
      description: CRUD for ``TEIReport``.  Admin-only write side per spec §Permissions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TEIReportRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TEIReportRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TEIReportRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReport'
          description: ''
    patch:
      operationId: tei_reports_partial_update
      description: CRUD for ``TEIReport``.  Admin-only write side per spec §Permissions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReport'
          description: ''
    delete:
      operationId: tei_reports_destroy
      description: CRUD for ``TEIReport``.  Admin-only write side per spec §Permissions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/tei/reports/{report_public_id}/fields/:
    get:
      operationId: tei_reports_fields_list
      description: Nested field CRUD under ``/reports/{public_id}/fields/``.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTEIReportFieldList'
          description: ''
    post:
      operationId: tei_reports_fields_create
      description: Nested field CRUD under ``/reports/{public_id}/fields/``.
      parameters:
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TEIReportFieldRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TEIReportFieldRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TEIReportFieldRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReportField'
          description: ''
  /api/v1/tei/reports/{report_public_id}/fields/{id}/:
    get:
      operationId: tei_reports_fields_retrieve
      description: Nested field CRUD under ``/reports/{public_id}/fields/``.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        required: true
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReportField'
          description: ''
    put:
      operationId: tei_reports_fields_update
      description: Nested field CRUD under ``/reports/{public_id}/fields/``.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        required: true
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TEIReportFieldRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TEIReportFieldRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TEIReportFieldRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReportField'
          description: ''
    patch:
      operationId: tei_reports_fields_partial_update
      description: Nested field CRUD under ``/reports/{public_id}/fields/``.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        required: true
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportFieldRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportFieldRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportFieldRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReportField'
          description: ''
    delete:
      operationId: tei_reports_fields_destroy
      description: Nested field CRUD under ``/reports/{public_id}/fields/``.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        required: true
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/tei/reports/{report_public_id}/fields/reorder/:
    patch:
      operationId: tei_reports_fields_reorder_partial_update
      description: Bulk-reorder fields via ``PATCH .../fields/reorder/``.
      parameters:
      - in: path
        name: report_public_id
        schema:
          type: string
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportFieldRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportFieldRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTEIReportFieldRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIReportField'
          description: ''
  /api/v1/tei/summary/:
    get:
      operationId: tei_summary_retrieve
      description: GET ``/api/v1/tei/summary/`` — aggregate NPV across all tools.
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: No response body
  /api/v1/tei/tools/:
    get:
      operationId: tei_tools_list
      description: CRUD for ``TEITool`` with custom calculate / export / version actions.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTEIToolList'
          description: ''
    post:
      operationId: tei_tools_create
      description: CRUD for ``TEITool`` with custom calculate / export / version actions.
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TEIToolCreateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TEIToolCreateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TEIToolCreateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIToolCreate'
          description: ''
  /api/v1/tei/tools/{public_id}/:
    get:
      operationId: tei_tools_retrieve
      description: CRUD for ``TEITool`` with custom calculate / export / version actions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
    put:
      operationId: tei_tools_update
      description: CRUD for ``TEITool`` with custom calculate / export / version actions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TEIToolUpdateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TEIToolUpdateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TEIToolUpdateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIToolUpdate'
          description: ''
    patch:
      operationId: tei_tools_partial_update
      description: CRUD for ``TEITool`` with custom calculate / export / version actions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTEIToolUpdateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTEIToolUpdateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTEIToolUpdateRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEIToolUpdate'
          description: ''
    delete:
      operationId: tei_tools_destroy
      description: CRUD for ``TEITool`` with custom calculate / export / version actions.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/tei/tools/{public_id}/calculate/:
    post:
      operationId: tei_tools_calculate_create
      description: Recalculate and persist the financial summary.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/tei/tools/{public_id}/export/:
    get:
      operationId: tei_tools_export_retrieve
      description: Return the LLM-ready export payload.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/tei/tools/{public_id}/summary/:
    get:
      operationId: tei_tools_summary_retrieve
      description: Return the stored summary (404 if never calculated).
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/tei/tools/{public_id}/values/:
    get:
      operationId: tei_tools_values_retrieve
      description: GET current values / PUT bulk update.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
    put:
      operationId: tei_tools_values_update
      description: GET current values / PUT bulk update.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/tei/tools/{public_id}/values/{field_key}/:
    patch:
      operationId: tei_tools_values_partial_update
      description: PATCH one value row.
      parameters:
      - in: path
        name: field_key
        schema:
          type: string
          pattern: ^[\w-]+$
        required: true
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/tei/tools/{public_id}/versions/:
    get:
      operationId: tei_tools_versions_retrieve
      description: GET version list / POST save new version.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
    post:
      operationId: tei_tools_versions_create
      description: GET version list / POST save new version.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/tei/tools/{public_id}/versions/{version_number}/:
    get:
      operationId: tei_tools_versions_retrieve_2
      description: Return the full snapshot for one version.
      parameters:
      - in: path
        name: public_id
        schema:
          type: string
          description: 12-character short UUID used in public API URLs.
        required: true
      - in: path
        name: version_number
        schema:
          type: string
          pattern: ^\d+$
        required: true
      tags:
      - tei
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TEITool'
          description: ''
  /api/v1/timeline/milestones/:
    get:
      operationId: timeline_milestones_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedMilestoneList'
          description: ''
    post:
      operationId: timeline_milestones_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Milestone'
          description: ''
  /api/v1/timeline/milestones/{id}/:
    get:
      operationId: timeline_milestones_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this milestone.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Milestone'
          description: ''
    put:
      operationId: timeline_milestones_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this milestone.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Milestone'
          description: ''
    patch:
      operationId: timeline_milestones_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this milestone.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedMilestoneRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedMilestoneRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedMilestoneRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Milestone'
          description: ''
    delete:
      operationId: timeline_milestones_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this milestone.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/timeline/milestones/{id}/mark_completed/:
    post:
      operationId: timeline_milestones_mark_completed_create
      description: Mark milestone as completed
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this milestone.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MilestoneRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Milestone'
          description: ''
  /api/v1/timeline/milestones/upcoming/:
    get:
      operationId: timeline_milestones_upcoming_retrieve
      description: Get upcoming milestones
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Milestone'
          description: ''
  /api/v1/timeline/stages/:
    get:
      operationId: timeline_stages_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedStageList'
          description: ''
    post:
      operationId: timeline_stages_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StageRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StageRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StageRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stage'
          description: ''
  /api/v1/timeline/stages/{id}/:
    get:
      operationId: timeline_stages_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stage.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stage'
          description: ''
    put:
      operationId: timeline_stages_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stage.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StageRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StageRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StageRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stage'
          description: ''
    patch:
      operationId: timeline_stages_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stage.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedStageRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedStageRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedStageRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Stage'
          description: ''
    delete:
      operationId: timeline_stages_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this stage.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/timeline/timelines/:
    get:
      operationId: timeline_timelines_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTimelineList'
          description: ''
    post:
      operationId: timeline_timelines_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Timeline'
          description: ''
  /api/v1/timeline/timelines/{id}/:
    get:
      operationId: timeline_timelines_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Timeline'
          description: ''
    put:
      operationId: timeline_timelines_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Timeline'
          description: ''
    patch:
      operationId: timeline_timelines_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTimelineRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTimelineRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTimelineRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Timeline'
          description: ''
    delete:
      operationId: timeline_timelines_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /api/v1/timeline/timelines/{id}/update_progress/:
    post:
      operationId: timeline_timelines_update_progress_create
      description: Update timeline progress by updating milestone/stage statuses
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TimelineRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Timeline'
          description: ''
  /api/v1/timeline/tools/:
    get:
      operationId: timeline_tools_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTimelineToolList'
          description: ''
    post:
      operationId: timeline_tools_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TimelineToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TimelineToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TimelineToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimelineTool'
          description: ''
  /api/v1/timeline/tools/{id}/:
    get:
      operationId: timeline_tools_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline tool.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimelineTool'
          description: ''
    put:
      operationId: timeline_tools_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline tool.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TimelineToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TimelineToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TimelineToolRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimelineTool'
          description: ''
    patch:
      operationId: timeline_tools_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline tool.
        required: true
      tags:
      - timeline
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTimelineToolRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTimelineToolRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTimelineToolRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimelineTool'
          description: ''
    delete:
      operationId: timeline_tools_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this timeline tool.
        required: true
      tags:
      - timeline
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /deckcraft/api/decks/:
    get:
      operationId: deckcraft_api_decks_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDeckList'
          description: ''
    post:
      operationId: deckcraft_api_decks_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
  /deckcraft/api/decks/{id}/:
    get:
      operationId: deckcraft_api_decks_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
    put:
      operationId: deckcraft_api_decks_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
    patch:
      operationId: deckcraft_api_decks_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDeckRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
    delete:
      operationId: deckcraft_api_decks_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /deckcraft/api/decks/{id}/download/:
    get:
      operationId: deckcraft_api_decks_download_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
  /deckcraft/api/decks/{id}/generate/:
    post:
      operationId: deckcraft_api_decks_generate_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deck'
          description: ''
  /deckcraft/api/presentations/:
    get:
      operationId: deckcraft_api_presentations_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPresentationList'
          description: ''
    post:
      operationId: deckcraft_api_presentations_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
  /deckcraft/api/presentations/{id}/:
    get:
      operationId: deckcraft_api_presentations_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
    put:
      operationId: deckcraft_api_presentations_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PresentationRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
    patch:
      operationId: deckcraft_api_presentations_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPresentationRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPresentationRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPresentationRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Presentation'
          description: ''
    delete:
      operationId: deckcraft_api_presentations_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this presentation.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /deckcraft/api/slides/:
    get:
      operationId: deckcraft_api_slides_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDeckSlideList'
          description: ''
    post:
      operationId: deckcraft_api_slides_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
  /deckcraft/api/slides/{id}/:
    get:
      operationId: deckcraft_api_slides_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
    put:
      operationId: deckcraft_api_slides_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
    patch:
      operationId: deckcraft_api_slides_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDeckSlideRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
    delete:
      operationId: deckcraft_api_slides_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this deck slide.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /deckcraft/api/slides/reorder/:
    post:
      operationId: deckcraft_api_slides_reorder_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DeckSlideRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeckSlide'
          description: ''
  /deckcraft/api/table-sources/:
    get:
      operationId: deckcraft_api_table_sources_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTableSourceList'
          description: ''
  /deckcraft/api/table-sources/{id}/:
    get:
      operationId: deckcraft_api_table_sources_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TableSource'
          description: ''
  /deckcraft/api/table-sources/{id}/data/:
    get:
      operationId: deckcraft_api_table_sources_data_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TableSource'
          description: ''
  /deckcraft/api/templates/:
    get:
      operationId: deckcraft_api_templates_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedPowerPointTemplateList'
          description: ''
    post:
      operationId: deckcraft_api_templates_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
  /deckcraft/api/templates/{id}/:
    get:
      operationId: deckcraft_api_templates_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
    put:
      operationId: deckcraft_api_templates_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
    patch:
      operationId: deckcraft_api_templates_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPowerPointTemplateRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
    delete:
      operationId: deckcraft_api_templates_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /deckcraft/api/templates/{id}/layouts/:
    get:
      operationId: deckcraft_api_templates_layouts_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
  /deckcraft/api/templates/{id}/refresh/:
    post:
      operationId: deckcraft_api_templates_refresh_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this power point template.
        required: true
      tags:
      - deckcraft
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PowerPointTemplateRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerPointTemplate'
          description: ''
  /orbit/api/calendar-events/:
    get:
      operationId: orbit_api_calendar_events_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCalendarEventList'
          description: ''
    post:
      operationId: orbit_api_calendar_events_create
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
  /orbit/api/calendar-events/{id}/:
    get:
      operationId: orbit_api_calendar_events_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    put:
      operationId: orbit_api_calendar_events_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    patch:
      operationId: orbit_api_calendar_events_partial_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    delete:
      operationId: orbit_api_calendar_events_destroy
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/clients/:
    get:
      operationId: orbit_api_clients_list
      description: Retrieve a paginated list of clients owned by the current user.
      summary: List clients
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order results by: name, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search clients by name, legal name, or overview
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedClientList'
          description: ''
    post:
      operationId: orbit_api_clients_create
      description: Create a new client record.
      summary: Create client
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
  /orbit/api/clients/{id}/:
    get:
      operationId: orbit_api_clients_retrieve
      description: Retrieve detailed information about a specific client.
      summary: Get client details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    put:
      operationId: orbit_api_clients_update
      description: Update all fields of a client record.
      summary: Update client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    patch:
      operationId: orbit_api_clients_partial_update
      description: Update specific fields of a client record.
      summary: Partially update client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    delete:
      operationId: orbit_api_clients_destroy
      description: Delete a client record.
      summary: Delete client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/contacts/:
    get:
      operationId: orbit_api_contacts_list
      description: Retrieve a paginated list of contacts from user's clients and vendors.
      summary: List contacts
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search contacts by name, job title, or email
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedContactList'
          description: ''
    post:
      operationId: orbit_api_contacts_create
      description: Create a new contact record.
      summary: Create contact
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
  /orbit/api/contacts/{id}/:
    get:
      operationId: orbit_api_contacts_retrieve
      description: Retrieve detailed information about a specific contact.
      summary: Get contact details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    put:
      operationId: orbit_api_contacts_update
      description: Update all fields of a contact record.
      summary: Update contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    patch:
      operationId: orbit_api_contacts_partial_update
      description: Update specific fields of a contact record.
      summary: Partially update contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    delete:
      operationId: orbit_api_contacts_destroy
      description: Delete a contact record.
      summary: Delete contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/contacts/search/:
    get:
      operationId: orbit_api_contacts_search_retrieve
      description: Advanced contact search with organization type filtering.
      summary: Search contacts
      parameters:
      - in: query
        name: organization_type
        schema:
          type: string
        description: 'Filter by organization type: client or vendor'
      - in: query
        name: search_term
        schema:
          type: string
        description: Search term for name or job title
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
  /orbit/api/digital-contact-types/:
    get:
      operationId: orbit_api_digital_contact_types_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDigitalContactTypeList'
          description: ''
  /orbit/api/digital-contact-types/{id}/:
    get:
      operationId: orbit_api_digital_contact_types_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact type.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContactType'
          description: ''
  /orbit/api/digital-contacts/:
    get:
      operationId: orbit_api_digital_contacts_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDigitalContactList'
          description: ''
    post:
      operationId: orbit_api_digital_contacts_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
  /orbit/api/digital-contacts/{id}/:
    get:
      operationId: orbit_api_digital_contacts_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    put:
      operationId: orbit_api_digital_contacts_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    patch:
      operationId: orbit_api_digital_contacts_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    delete:
      operationId: orbit_api_digital_contacts_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/opportunities/:
    get:
      operationId: orbit_api_opportunities_list
      description: Retrieve a paginated list of sales opportunities.
      summary: List opportunities
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, expected_close_date, value'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search opportunities by name or description
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOpportunityList'
          description: ''
    post:
      operationId: orbit_api_opportunities_create
      description: Create a new sales opportunity.
      summary: Create opportunity
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
  /orbit/api/opportunities/{id}/:
    get:
      operationId: orbit_api_opportunities_retrieve
      description: Retrieve detailed information about a specific opportunity.
      summary: Get opportunity details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    put:
      operationId: orbit_api_opportunities_update
      description: Update all fields of an opportunity record.
      summary: Update opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    patch:
      operationId: orbit_api_opportunities_partial_update
      description: Update specific fields of an opportunity record.
      summary: Partially update opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    delete:
      operationId: orbit_api_opportunities_destroy
      description: Delete an opportunity record.
      summary: Delete opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/opportunities/by_status/:
    get:
      operationId: orbit_api_opportunities_by_status_retrieve
      description: Retrieve opportunities filtered by status and optionally by client.
      summary: Filter opportunities by status
      parameters:
      - in: query
        name: client_id
        schema:
          type: integer
        description: Filter by specific client ID
      - in: query
        name: status
        schema:
          type: string
        description: 'Filter by opportunity status: active, won, lost, dropped'
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
  /orbit/api/proposals/:
    get:
      operationId: orbit_api_proposals_list
      description: Retrieve a paginated list of proposals for opportunities owned
        by the current user.
      summary: List proposals
      parameters:
      - in: query
        name: opportunity_id
        schema:
          type: integer
        description: Filter by opportunity ID
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, due_date, submitted_date, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search proposals by name
      - in: query
        name: status
        schema:
          type: string
        description: 'Filter by status: Draft, In Review, Final'
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedProposalList'
          description: ''
    post:
      operationId: orbit_api_proposals_create
      description: Create a new proposal record.
      summary: Create proposal
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
  /orbit/api/proposals/{id}/:
    get:
      operationId: orbit_api_proposals_retrieve
      description: Retrieve detailed information about a specific proposal.
      summary: Get proposal details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    put:
      operationId: orbit_api_proposals_update
      description: Update all fields of a proposal record.
      summary: Update proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    patch:
      operationId: orbit_api_proposals_partial_update
      description: Update specific fields of a proposal record.
      summary: Partially update proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    delete:
      operationId: orbit_api_proposals_destroy
      description: Delete a proposal record.
      summary: Delete proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/stock/overview/{symbol}/:
    get:
      operationId: orbit_api_stock_overview_retrieve
      description: Returns company overview data for a stock symbol
      summary: Get company overview
      parameters:
      - in: path
        name: symbol
        schema:
          type: string
        description: Stock symbol
        required: true
      tags:
      - stock
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Company overview data
        '403':
          description: Access denied
        '500':
          description: Unable to fetch company data
  /orbit/api/stock/quote/{symbol}/:
    get:
      operationId: orbit_api_stock_quote_retrieve
      description: Returns current stock quote data for a symbol
      summary: Get stock quote
      parameters:
      - in: path
        name: symbol
        schema:
          type: string
        description: Stock symbol
        required: true
      tags:
      - stock
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Stock quote data
        '403':
          description: Access denied
        '500':
          description: Unable to fetch stock data
  /orbit/api/suggest-timezone/:
    post:
      operationId: orbit_api_suggest_timezone_create
      description: Uses address components to suggest an appropriate timezone using
        geocoding.
      summary: Suggest timezone from address
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                street_address:
                  type: string
                locality:
                  type: string
                region:
                  type: string
                postal_code:
                  type: string
                country:
                  type: string
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  timezone:
                    type: string
                  success:
                    type: boolean
                  method:
                    type: string
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  success:
                    type: boolean
          description: ''
  /orbit/api/v1/calendar-events/:
    get:
      operationId: orbit_api_v1_calendar_events_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCalendarEventList'
          description: ''
    post:
      operationId: orbit_api_v1_calendar_events_create
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
  /orbit/api/v1/calendar-events/{id}/:
    get:
      operationId: orbit_api_v1_calendar_events_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    put:
      operationId: orbit_api_v1_calendar_events_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CalendarEventRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    patch:
      operationId: orbit_api_v1_calendar_events_partial_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedCalendarEventRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalendarEvent'
          description: ''
    delete:
      operationId: orbit_api_v1_calendar_events_destroy
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/clients/:
    get:
      operationId: orbit_api_v1_clients_list
      description: Retrieve a paginated list of clients owned by the current user.
      summary: List clients
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order results by: name, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search clients by name, legal name, or overview
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedClientList'
          description: ''
    post:
      operationId: orbit_api_v1_clients_create
      description: Create a new client record.
      summary: Create client
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
  /orbit/api/v1/clients/{id}/:
    get:
      operationId: orbit_api_v1_clients_retrieve
      description: Retrieve detailed information about a specific client.
      summary: Get client details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    put:
      operationId: orbit_api_v1_clients_update
      description: Update all fields of a client record.
      summary: Update client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    patch:
      operationId: orbit_api_v1_clients_partial_update
      description: Update specific fields of a client record.
      summary: Partially update client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedClientRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
          description: ''
    delete:
      operationId: orbit_api_v1_clients_destroy
      description: Delete a client record.
      summary: Delete client
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this client.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/contacts/:
    get:
      operationId: orbit_api_v1_contacts_list
      description: Retrieve a paginated list of contacts from user's clients and vendors.
      summary: List contacts
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search contacts by name, job title, or email
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedContactList'
          description: ''
    post:
      operationId: orbit_api_v1_contacts_create
      description: Create a new contact record.
      summary: Create contact
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
  /orbit/api/v1/contacts/{id}/:
    get:
      operationId: orbit_api_v1_contacts_retrieve
      description: Retrieve detailed information about a specific contact.
      summary: Get contact details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    put:
      operationId: orbit_api_v1_contacts_update
      description: Update all fields of a contact record.
      summary: Update contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    patch:
      operationId: orbit_api_v1_contacts_partial_update
      description: Update specific fields of a contact record.
      summary: Partially update contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedContactRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
    delete:
      operationId: orbit_api_v1_contacts_destroy
      description: Delete a contact record.
      summary: Delete contact
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this contact.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/contacts/search/:
    get:
      operationId: orbit_api_v1_contacts_search_retrieve
      description: Advanced contact search with organization type filtering.
      summary: Search contacts
      parameters:
      - in: query
        name: organization_type
        schema:
          type: string
        description: 'Filter by organization type: client or vendor'
      - in: query
        name: search_term
        schema:
          type: string
        description: Search term for name or job title
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
          description: ''
  /orbit/api/v1/digital-contact-types/:
    get:
      operationId: orbit_api_v1_digital_contact_types_list
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDigitalContactTypeList'
          description: ''
  /orbit/api/v1/digital-contact-types/{id}/:
    get:
      operationId: orbit_api_v1_digital_contact_types_retrieve
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact type.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContactType'
          description: ''
  /orbit/api/v1/digital-contacts/:
    get:
      operationId: orbit_api_v1_digital_contacts_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDigitalContactList'
          description: ''
    post:
      operationId: orbit_api_v1_digital_contacts_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
  /orbit/api/v1/digital-contacts/{id}/:
    get:
      operationId: orbit_api_v1_digital_contacts_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    put:
      operationId: orbit_api_v1_digital_contacts_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DigitalContactRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    patch:
      operationId: orbit_api_v1_digital_contacts_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedDigitalContactRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalContact'
          description: ''
    delete:
      operationId: orbit_api_v1_digital_contacts_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this digital contact.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/opportunities/:
    get:
      operationId: orbit_api_v1_opportunities_list
      description: Retrieve a paginated list of sales opportunities.
      summary: List opportunities
      parameters:
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, expected_close_date, value'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search opportunities by name or description
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOpportunityList'
          description: ''
    post:
      operationId: orbit_api_v1_opportunities_create
      description: Create a new sales opportunity.
      summary: Create opportunity
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
  /orbit/api/v1/opportunities/{id}/:
    get:
      operationId: orbit_api_v1_opportunities_retrieve
      description: Retrieve detailed information about a specific opportunity.
      summary: Get opportunity details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    put:
      operationId: orbit_api_v1_opportunities_update
      description: Update all fields of an opportunity record.
      summary: Update opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/OpportunityRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    patch:
      operationId: orbit_api_v1_opportunities_partial_update
      description: Update specific fields of an opportunity record.
      summary: Partially update opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedOpportunityRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
    delete:
      operationId: orbit_api_v1_opportunities_destroy
      description: Delete an opportunity record.
      summary: Delete opportunity
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this opportunity.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/opportunities/by_status/:
    get:
      operationId: orbit_api_v1_opportunities_by_status_retrieve
      description: Retrieve opportunities filtered by status and optionally by client.
      summary: Filter opportunities by status
      parameters:
      - in: query
        name: client_id
        schema:
          type: integer
        description: Filter by specific client ID
      - in: query
        name: status
        schema:
          type: string
        description: 'Filter by opportunity status: active, won, lost, dropped'
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opportunity'
          description: ''
  /orbit/api/v1/proposals/:
    get:
      operationId: orbit_api_v1_proposals_list
      description: Retrieve a paginated list of proposals for opportunities owned
        by the current user.
      summary: List proposals
      parameters:
      - in: query
        name: opportunity_id
        schema:
          type: integer
        description: Filter by opportunity ID
      - in: query
        name: ordering
        schema:
          type: string
        description: 'Order by: name, due_date, submitted_date, created_date'
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search proposals by name
      - in: query
        name: status
        schema:
          type: string
        description: 'Filter by status: Draft, In Review, Final'
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedProposalList'
          description: ''
    post:
      operationId: orbit_api_v1_proposals_create
      description: Create a new proposal record.
      summary: Create proposal
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
  /orbit/api/v1/proposals/{id}/:
    get:
      operationId: orbit_api_v1_proposals_retrieve
      description: Retrieve detailed information about a specific proposal.
      summary: Get proposal details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    put:
      operationId: orbit_api_v1_proposals_update
      description: Update all fields of a proposal record.
      summary: Update proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ProposalRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    patch:
      operationId: orbit_api_v1_proposals_partial_update
      description: Update specific fields of a proposal record.
      summary: Partially update proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedProposalRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Proposal'
          description: ''
    delete:
      operationId: orbit_api_v1_proposals_destroy
      description: Delete a proposal record.
      summary: Delete proposal
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this proposal.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/stock/overview/{symbol}/:
    get:
      operationId: orbit_api_v1_stock_overview_retrieve
      description: Returns company overview data for a stock symbol
      summary: Get company overview
      parameters:
      - in: path
        name: symbol
        schema:
          type: string
        description: Stock symbol
        required: true
      tags:
      - stock
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Company overview data
        '403':
          description: Access denied
        '500':
          description: Unable to fetch company data
  /orbit/api/v1/stock/quote/{symbol}/:
    get:
      operationId: orbit_api_v1_stock_quote_retrieve
      description: Returns current stock quote data for a symbol
      summary: Get stock quote
      parameters:
      - in: path
        name: symbol
        schema:
          type: string
        description: Stock symbol
        required: true
      tags:
      - stock
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          description: Stock quote data
        '403':
          description: Access denied
        '500':
          description: Unable to fetch stock data
  /orbit/api/v1/suggest-timezone/:
    post:
      operationId: orbit_api_v1_suggest_timezone_create
      description: Uses address components to suggest an appropriate timezone using
        geocoding.
      summary: Suggest timezone from address
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                street_address:
                  type: string
                locality:
                  type: string
                region:
                  type: string
                postal_code:
                  type: string
                country:
                  type: string
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  timezone:
                    type: string
                  success:
                    type: boolean
                  method:
                    type: string
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  success:
                    type: boolean
          description: ''
  /orbit/api/v1/vendor-solutions/:
    get:
      operationId: orbit_api_v1_vendor_solutions_list
      description: Retrieve a paginated list of vendor solutions.
      summary: List vendor solutions
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search solutions by name or description
      - in: query
        name: vendor
        schema:
          type: integer
        description: Filter by vendor ID
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVendorSolutionList'
          description: ''
    post:
      operationId: orbit_api_v1_vendor_solutions_create
      description: Create a new vendor solution.
      summary: Create vendor solution
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
  /orbit/api/v1/vendor-solutions/{id}/:
    get:
      operationId: orbit_api_v1_vendor_solutions_retrieve
      description: Retrieve detailed information about a specific vendor solution.
      summary: Get vendor solution details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    put:
      operationId: orbit_api_v1_vendor_solutions_update
      description: Update all fields of a vendor solution record.
      summary: Update vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    patch:
      operationId: orbit_api_v1_vendor_solutions_partial_update
      description: Update specific fields of a vendor solution record.
      summary: Partially update vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    delete:
      operationId: orbit_api_v1_vendor_solutions_destroy
      description: Delete a vendor solution record.
      summary: Delete vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/v1/vendors/:
    get:
      operationId: orbit_api_v1_vendors_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: search
        required: false
        in: query
        description: A search term.
        schema:
          type: string
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVendorList'
          description: ''
    post:
      operationId: orbit_api_v1_vendors_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
  /orbit/api/v1/vendors/{id}/:
    get:
      operationId: orbit_api_v1_vendors_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    put:
      operationId: orbit_api_v1_vendors_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    patch:
      operationId: orbit_api_v1_vendors_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    delete:
      operationId: orbit_api_v1_vendors_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/vendor-solutions/:
    get:
      operationId: orbit_api_vendor_solutions_list
      description: Retrieve a paginated list of vendor solutions.
      summary: List vendor solutions
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: search
        schema:
          type: string
        description: Search solutions by name or description
      - in: query
        name: vendor
        schema:
          type: integer
        description: Filter by vendor ID
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVendorSolutionList'
          description: ''
    post:
      operationId: orbit_api_vendor_solutions_create
      description: Create a new vendor solution.
      summary: Create vendor solution
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
  /orbit/api/vendor-solutions/{id}/:
    get:
      operationId: orbit_api_vendor_solutions_retrieve
      description: Retrieve detailed information about a specific vendor solution.
      summary: Get vendor solution details
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    put:
      operationId: orbit_api_vendor_solutions_update
      description: Update all fields of a vendor solution record.
      summary: Update vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorSolutionRequest'
        required: true
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    patch:
      operationId: orbit_api_vendor_solutions_partial_update
      description: Update specific fields of a vendor solution record.
      summary: Partially update vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVendorSolutionRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorSolution'
          description: ''
    delete:
      operationId: orbit_api_vendor_solutions_destroy
      description: Delete a vendor solution record.
      summary: Delete vendor solution
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor solution.
        required: true
      tags:
      - Orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
  /orbit/api/vendors/:
    get:
      operationId: orbit_api_vendors_list
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: search
        required: false
        in: query
        description: A search term.
        schema:
          type: string
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVendorList'
          description: ''
    post:
      operationId: orbit_api_vendors_create
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
  /orbit/api/vendors/{id}/:
    get:
      operationId: orbit_api_vendors_retrieve
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    put:
      operationId: orbit_api_vendors_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/VendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    patch:
      operationId: orbit_api_vendors_partial_update
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVendorRequest'
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vendor'
          description: ''
    delete:
      operationId: orbit_api_vendors_destroy
      description: |-
        Mixin that adds automatic tenant scoping to any DRF ViewSet.

        Attributes:
            tenant_field (str):
                The ORM lookup path from the model to the ``subscriber`` FK.
                Defaults to ``'subscriber'`` for models with a direct FK.
                Set to a longer path for child models, e.g.
                ``'advisor_tool__subscriber'``.

            tenant_owner_field (str | None):
                Optional. The field name for the ``owner`` / ``user`` FK on the
                model. When set, queryset is *also* filtered by
                ``request.user`` (preserving existing per-user isolation within
                a tenant). Set to ``None`` to skip user-level filtering.
      parameters:
      - in: path
        name: id
        schema:
          type: integer
        description: A unique integer value identifying this vendor.
        required: true
      tags:
      - orbit
      security:
      - ApiKeyAuth: []
      - ApiKeyAuth:
          type: apiKey
          in: header
          name: Authorization
          description: 'API key authentication. Use format: Api-Key {your-api-key}'
      responses:
        '204':
          description: No response body
components:
  schemas:
    APIKey:
      type: object
      description: |-
        API key information serializer.

        Provides API key metadata without exposing the actual key value:
        - Key name and type
        - Creation and usage timestamps
        - Active status
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 100
        app_type:
          $ref: '#/components/schemas/AppTypeEnum'
        created_date:
          type: string
          format: date-time
          readOnly: true
        last_used:
          type: string
          format: date-time
          readOnly: true
          nullable: true
        is_active:
          type: boolean
        days_since_created:
          type: string
          readOnly: true
        days_since_used:
          type: string
          readOnly: true
      required:
      - app_type
      - created_date
      - days_since_created
      - days_since_used
      - id
      - last_used
      - name
    AdvisorTool:
      type: object
      description: Serialize an AdvisorTool with computed counts and client/association
        display fields.
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        categories:
          description: Custom categories for findings and requirements
        timeframe_short:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Short timeframe in days
        timeframe_medium:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Medium timeframe in days
        timeframe_long:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Long timeframe in days
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        findings_count:
          type: string
          readOnly: true
        requirements_count:
          type: string
          readOnly: true
        recommendations_count:
          type: string
          readOnly: true
        principles_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - association_display
      - client_name
      - created_date
      - description
      - findings_count
      - id
      - modified_date
      - name
      - principles_count
      - recommendations_count
      - requirements_count
    AdvisorToolRequest:
      type: object
      description: Serialize an AdvisorTool with computed counts and client/association
        display fields.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        categories:
          description: Custom categories for findings and requirements
        timeframe_short:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Short timeframe in days
        timeframe_medium:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Medium timeframe in days
        timeframe_long:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Long timeframe in days
      required:
      - description
      - name
    AppTypeEnum:
      enum:
      - DAV
      - API
      - MCP
      type: string
      description: |-
        * `DAV` - DAV Key (Calendar & Contacts)
        * `API` - API Key (REST API)
        * `MCP` - MCP Key (AI Assistant)
    Assumption:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        potential_impact:
          $ref: '#/components/schemas/PotentialImpactEnum'
        impact_details:
          type: string
      required:
      - description
      - id
      - impact_details
      - potential_impact
      - title
    BMC:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        version:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        customer_segments:
          type: string
        value_propositions:
          type: string
        channels:
          type: string
        customer_relationships:
          type: string
        revenue_streams:
          type: string
        key_resources:
          type: string
        key_activities:
          type: string
        key_partnerships:
          type: string
        cost_structure:
          type: string
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - id
      - modified_date
    BMCRequest:
      type: object
      properties:
        version:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        customer_segments:
          type: string
        value_propositions:
          type: string
        channels:
          type: string
        customer_relationships:
          type: string
        revenue_streams:
          type: string
        key_resources:
          type: string
        key_activities:
          type: string
        key_partnerships:
          type: string
        cost_structure:
          type: string
    BMCTemplate:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        customer_segments:
          type: string
        value_propositions:
          type: string
        channels:
          type: string
        customer_relationships:
          type: string
        revenue_streams:
          type: string
        key_resources:
          type: string
        key_activities:
          type: string
        key_partnerships:
          type: string
        cost_structure:
          type: string
        is_active:
          type: boolean
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - id
      - modified_date
      - name
    BMCTemplateRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        customer_segments:
          type: string
        value_propositions:
          type: string
        channels:
          type: string
        customer_relationships:
          type: string
        revenue_streams:
          type: string
        key_resources:
          type: string
        key_activities:
          type: string
        key_partnerships:
          type: string
        cost_structure:
          type: string
        is_active:
          type: boolean
      required:
      - name
    BMCTool:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        latest_bmc:
          type: string
          readOnly: true
        bmc_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - association_display
      - bmc_count
      - client_name
      - created_date
      - description
      - id
      - latest_bmc
      - modified_date
      - name
    BMCToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
      required:
      - description
      - name
    BillingCycleEnum:
      enum:
      - one_time
      - monthly
      - annual
      type: string
      description: |-
        * `one_time` - One Time
        * `monthly` - Monthly
        * `annual` - Annual
    BlankEnum:
      enum:
      - ''
    BulkLocationOperationRequest:
      type: object
      description: |-
        Bulk location operation serializer.

        Handles bulk operations on multiple locations.
      properties:
        operation:
          $ref: '#/components/schemas/OperationEnum'
        location_ids:
          type: array
          items:
            type: integer
          description: List of location IDs to operate on
          minItems: 1
        parameters:
          type: object
          additionalProperties: {}
          description: Operation-specific parameters
      required:
      - location_ids
      - operation
    CSVImportRequest:
      type: object
      description: |-
        CSV import request serializer.

        Handles CSV file upload and import configuration.
      properties:
        csv_file:
          type: string
          format: binary
          description: CSV file containing location data
      required:
      - csv_file
    CalendarEvent:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        start_time:
          type: string
          format: date-time
        end_time:
          type: string
          format: date-time
        location:
          type: string
          maxLength: 255
        event_type:
          $ref: '#/components/schemas/EventTypeEnum'
      required:
      - end_time
      - id
      - start_time
      - title
    CalendarEventRequest:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        start_time:
          type: string
          format: date-time
        end_time:
          type: string
          format: date-time
        location:
          type: string
          maxLength: 255
        event_type:
          $ref: '#/components/schemas/EventTypeEnum'
      required:
      - end_time
      - start_time
      - title
    Client:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
        legal_name:
          type: string
        abbreviated_name:
          type: string
        overview:
          type: string
        history:
          type: string
        services_provided:
          type: string
        client_type:
          type: string
        vertical:
          type: string
          nullable: true
        stock_exchange:
          type: string
          nullable: true
        stock_symbol:
          type: string
          nullable: true
        employee_count:
          type: integer
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        fiscal_year_end:
          type: string
          format: date
          nullable: true
        contact_center_agent_count:
          type: integer
          nullable: true
        service_desk_agent_count:
          type: integer
          nullable: true
        supervisor_count:
          type: integer
          nullable: true
        location_count:
          type: integer
          nullable: true
        repository_url:
          type: string
        parent_organization:
          type: string
          readOnly: true
        parent_relationship_type:
          type: string
          readOnly: true
        is_multi_role_organization:
          type: string
          readOnly: true
        child_organizations_count:
          type: string
          readOnly: true
      required:
      - child_organizations_count
      - id
      - is_multi_role_organization
      - parent_organization
      - parent_relationship_type
    ClientLocationTool:
      type: object
      description: |-
        Client Location Tool serializer with automatic version management.

        Provides tool information including:
        - Basic tool metadata
        - Current version number (automatically managed)
        - All location sets with automatic version numbering
        - Table source configuration

        Automatic Version Management:
        - current_version field shows the active version number (integer)
        - location_sets array shows all versions ordered by version number
        - Version creation is handled by the create_version API endpoint
        - Version switching is handled by the switch_version API endpoint
        - All version numbers are automatically assigned and read-only
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        current_version:
          type: integer
          readOnly: true
          description: Current active version number (automatically managed)
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        owner:
          type: integer
          readOnly: true
        current_location_set:
          allOf:
          - $ref: '#/components/schemas/LocationSet'
          readOnly: true
        location_sets:
          type: array
          items:
            $ref: '#/components/schemas/LocationSet'
          readOnly: true
        table_source:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - current_location_set
      - current_version
      - description
      - id
      - location_sets
      - modified_date
      - name
      - owner
      - table_source
    ClientLocationToolRequest:
      type: object
      description: |-
        Client Location Tool serializer with automatic version management.

        Provides tool information including:
        - Basic tool metadata
        - Current version number (automatically managed)
        - All location sets with automatic version numbering
        - Table source configuration

        Automatic Version Management:
        - current_version field shows the active version number (integer)
        - location_sets array shows all versions ordered by version number
        - Version creation is handled by the create_version API endpoint
        - Version switching is handled by the switch_version API endpoint
        - All version numbers are automatically assigned and read-only
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
      required:
      - description
      - name
    ClientRequest:
      type: object
      properties:
        name:
          type: string
        legal_name:
          type: string
        abbreviated_name:
          type: string
        overview:
          type: string
        history:
          type: string
        services_provided:
          type: string
        client_type:
          type: string
        vertical:
          type: string
          nullable: true
        stock_exchange:
          type: string
          nullable: true
        stock_symbol:
          type: string
          nullable: true
        employee_count:
          type: integer
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        fiscal_year_end:
          type: string
          format: date
          nullable: true
        contact_center_agent_count:
          type: integer
          nullable: true
        service_desk_agent_count:
          type: integer
          nullable: true
        supervisor_count:
          type: integer
          nullable: true
        location_count:
          type: integer
          nullable: true
        repository_url:
          type: string
    ComplexityEnum:
      enum:
      - High
      - Medium
      - Low
      type: string
      description: |-
        * `High` - High
        * `Medium` - Medium
        * `Low` - Low
    Contact:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        first_name:
          type: string
          maxLength: 100
        last_name:
          type: string
          maxLength: 100
        job_title:
          type: string
          maxLength: 100
        email:
          type: string
          format: email
          maxLength: 254
        phones:
          type: array
          items:
            $ref: '#/components/schemas/ContactPhone'
          readOnly: true
        preferred_phone:
          type: string
          readOnly: true
        organization:
          type: string
          readOnly: true
        reports_to:
          type: integer
          nullable: true
        reports_to_name:
          type: string
          readOnly: true
        direct_reports_count:
          type: string
          readOnly: true
        is_client_contact:
          type: string
          readOnly: true
        is_vendor_contact:
          type: string
          readOnly: true
        is_multi_role_contact:
          type: string
          readOnly: true
        organization_profiles:
          type: string
          readOnly: true
      required:
      - direct_reports_count
      - first_name
      - id
      - is_client_contact
      - is_multi_role_contact
      - is_vendor_contact
      - last_name
      - organization
      - organization_profiles
      - phones
      - preferred_phone
      - reports_to_name
    ContactPhone:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        number:
          type: string
          maxLength: 20
        type:
          $ref: '#/components/schemas/ContactPhoneTypeEnum'
        is_preferred:
          type: boolean
      required:
      - id
      - number
    ContactPhoneRequest:
      type: object
      properties:
        number:
          type: string
          minLength: 1
          maxLength: 20
        type:
          $ref: '#/components/schemas/ContactPhoneTypeEnum'
        is_preferred:
          type: boolean
      required:
      - number
    ContactPhoneTypeEnum:
      enum:
      - cell
      - home
      - work
      - other
      type: string
      description: |-
        * `cell` - Cell
        * `home` - Home
        * `work` - Work
        * `other` - Other
    ContactRequest:
      type: object
      properties:
        first_name:
          type: string
          minLength: 1
          maxLength: 100
        last_name:
          type: string
          minLength: 1
          maxLength: 100
        job_title:
          type: string
          maxLength: 100
        email:
          type: string
          format: email
          maxLength: 254
        organization_id:
          type: integer
          writeOnly: true
        reports_to:
          type: integer
          nullable: true
      required:
      - first_name
      - last_name
    Content3TypeEnum:
      enum:
      - text
      - image
      - table
      type: string
      description: |-
        * `text` - Text
        * `image` - Image
        * `table` - Table
    Currency:
      type: object
      description: |-
        Currency information serializer.

        Provides currency details including:
        - ISO currency codes
        - Display names and symbols
        - Active status
      properties:
        code:
          type: string
          maxLength: 3
        name:
          type: string
          maxLength: 50
        symbol:
          type: string
          maxLength: 5
        is_active:
          type: boolean
      required:
      - code
      - name
      - symbol
    CustomFieldDefinition:
      type: object
      description: |-
        Custom field definition serializer.

        Provides custom field schema information including:
        - Field name, type, and description
        - Validation rules and default values
        - Display order
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 100
        field_type:
          $ref: '#/components/schemas/CustomFieldDefinitionFieldTypeEnum'
        description:
          type: string
        is_required:
          type: boolean
        default_value:
          type: string
        order:
          type: integer
          maximum: 2147483647
          minimum: 0
      required:
      - field_type
      - id
      - name
    CustomFieldDefinitionFieldTypeEnum:
      enum:
      - count
      - boolean
      - text
      - rich_text
      type: string
      description: |-
        * `count` - Count
        * `boolean` - Boolean
        * `text` - Text
        * `rich_text` - Rich Text
    CustomFieldDefinitionRequest:
      type: object
      description: |-
        Custom field definition serializer.

        Provides custom field schema information including:
        - Field name, type, and description
        - Validation rules and default values
        - Display order
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 100
        field_type:
          $ref: '#/components/schemas/CustomFieldDefinitionFieldTypeEnum'
        description:
          type: string
        is_required:
          type: boolean
        default_value:
          type: string
        order:
          type: integer
          maximum: 2147483647
          minimum: 0
      required:
      - field_type
      - name
    DateFormatEnum:
      enum:
      - YYYY-MM-DD
      - DD/MM/YYYY
      - MM/DD/YYYY
      - DD.MM.YYYY
      - DD-MM-YYYY
      type: string
      description: |-
        * `YYYY-MM-DD` - 2024-12-25
        * `DD/MM/YYYY` - 25/12/2024
        * `MM/DD/YYYY` - 12/25/2024
        * `DD.MM.YYYY` - 25.12.2024
        * `DD-MM-YYYY` - 25-12-2024
    Deck:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        presentation:
          type: integer
        template:
          type: integer
        title:
          type: string
          maxLength: 255
        subtitle:
          type: string
          maxLength: 255
        presenter:
          type: integer
          nullable: true
        status:
          $ref: '#/components/schemas/DeckStatusEnum'
        date:
          type: string
          format: date
        slide_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - id
      - modified_date
      - presentation
      - slide_count
      - status
      - template
    DeckRequest:
      type: object
      properties:
        presentation:
          type: integer
        template:
          type: integer
        title:
          type: string
          maxLength: 255
        subtitle:
          type: string
          maxLength: 255
        presenter:
          type: integer
          nullable: true
        status:
          $ref: '#/components/schemas/DeckStatusEnum'
        date:
          type: string
          format: date
      required:
      - presentation
      - status
      - template
    DeckSlide:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        deck:
          type: integer
        slide_type:
          type: string
          maxLength: 50
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        content_mapping: {}
        layout_name:
          type: string
          readOnly: true
        content1_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content1_image:
          type: integer
          nullable: true
        content1_table:
          type: integer
          nullable: true
        content2_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content2_image:
          type: integer
          nullable: true
        content2_table:
          type: integer
          nullable: true
        content3_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content3_image:
          type: integer
          nullable: true
        content3_table:
          type: integer
          nullable: true
      required:
      - deck
      - id
      - layout_name
      - order
      - slide_type
    DeckSlideRequest:
      type: object
      properties:
        deck:
          type: integer
        slide_type:
          type: string
          minLength: 1
          maxLength: 50
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        content_mapping: {}
        content1_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content1_image:
          type: integer
          nullable: true
        content1_table:
          type: integer
          nullable: true
        content2_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content2_image:
          type: integer
          nullable: true
        content2_table:
          type: integer
          nullable: true
        content3_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content3_image:
          type: integer
          nullable: true
        content3_table:
          type: integer
          nullable: true
      required:
      - deck
      - order
      - slide_type
    DeckStatusEnum:
      enum:
      - Draft
      - Final
      type: string
      description: |-
        * `Draft` - Draft
        * `Final` - Final
    Dependency:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        potential_impact:
          $ref: '#/components/schemas/PotentialImpactEnum'
        owner:
          type: integer
        owner_name:
          type: string
          readOnly: true
        priority:
          $ref: '#/components/schemas/Priority758Enum'
        external:
          type: boolean
      required:
      - description
      - id
      - owner
      - owner_name
      - potential_impact
      - priority
      - title
    DigitalContact:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 100
        contact_type:
          allOf:
          - $ref: '#/components/schemas/DigitalContactType'
          readOnly: true
        url:
          type: string
          maxLength: 500
        display_url:
          type: string
          readOnly: true
        notes:
          type: string
        client:
          type: integer
          nullable: true
        vendor:
          type: integer
          nullable: true
      required:
      - contact_type
      - display_url
      - id
      - name
      - url
    DigitalContactRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 100
        contact_type_id:
          type: integer
          writeOnly: true
        url:
          type: string
          minLength: 1
          maxLength: 500
        notes:
          type: string
        client:
          type: integer
          nullable: true
        vendor:
          type: integer
          nullable: true
      required:
      - contact_type_id
      - name
      - url
    DigitalContactType:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 50
        icon:
          type: string
          maxLength: 50
      required:
      - id
      - name
    DigitalContactTypeRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
        icon:
          type: string
          maxLength: 50
      required:
      - name
    DurationEnum:
      enum:
      - 45
      - 60
      - 90
      type: integer
      description: |-
        * `45` - 45 minutes
        * `60` - 60 minutes
        * `90` - 90 minutes
    Engagement:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        client:
          allOf:
          - $ref: '#/components/schemas/Client'
          readOnly: true
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/Status557Enum'
        description:
          type: string
        interviews:
          type: array
          items:
            $ref: '#/components/schemas/Interview'
          readOnly: true
        workshops:
          type: array
          items:
            $ref: '#/components/schemas/Workshop'
          readOnly: true
        interview_count:
          type: string
          readOnly: true
        workshop_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - client
      - created_date
      - end_date
      - id
      - interview_count
      - interviews
      - modified_date
      - name
      - start_date
      - workshop_count
      - workshops
    EngagementRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        client_id:
          type: integer
          writeOnly: true
        opportunity_id:
          type: integer
          writeOnly: true
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/Status557Enum'
        description:
          type: string
      required:
      - client_id
      - end_date
      - name
      - opportunity_id
      - start_date
    EngagementSummary:
      type: object
      description: Lightweight serializer for engagement summaries
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        client_name:
          type: string
          readOnly: true
        status:
          $ref: '#/components/schemas/Status557Enum'
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        interview_count:
          type: string
          readOnly: true
        workshop_count:
          type: string
          readOnly: true
      required:
      - client_name
      - end_date
      - id
      - interview_count
      - name
      - start_date
      - workshop_count
    EventTypeEnum:
      enum:
      - meeting
      - deadline
      - reminder
      - opportunity
      - birthday
      type: string
      description: |-
        * `meeting` - Meeting
        * `deadline` - Deadline
        * `reminder` - Reminder
        * `opportunity` - Opportunity
        * `birthday` - Birthday
    Finding:
      type: object
      description: Serialize all Finding fields for read and write.
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        source:
          $ref: '#/components/schemas/SourceEnum'
        source_detail:
          type: string
          maxLength: 255
        category:
          type: string
          maxLength: 100
        impact_level:
          $ref: '#/components/schemas/ImpactLevelEnum'
        impact_description:
          type: string
        created_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - description
      - id
      - impact_description
      - impact_level
      - name
      - source
    FindingRequest:
      type: object
      description: Serialize all Finding fields for read and write.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        source:
          $ref: '#/components/schemas/SourceEnum'
        source_detail:
          type: string
          maxLength: 255
        category:
          type: string
          maxLength: 100
        impact_level:
          $ref: '#/components/schemas/ImpactLevelEnum'
        impact_description:
          type: string
          minLength: 1
      required:
      - description
      - impact_description
      - impact_level
      - name
      - source
    FiscalYear:
      type: object
      description: |-
        Fiscal year information serializer.

        Provides fiscal year details including:
        - Year designation
        - Start date and calculated quarters
        - Fiscal year periods
      properties:
        fiscal_year:
          type: integer
          readOnly: true
          nullable: true
        fiscal_year_start:
          type: string
          format: date
        fiscal_quarter_1:
          type: string
          readOnly: true
          nullable: true
        fiscal_quarter_2:
          type: string
          readOnly: true
          nullable: true
        fiscal_quarter_3:
          type: string
          readOnly: true
          nullable: true
        fiscal_quarter_4:
          type: string
          readOnly: true
          nullable: true
      required:
      - fiscal_quarter_1
      - fiscal_quarter_2
      - fiscal_quarter_3
      - fiscal_quarter_4
      - fiscal_year
      - fiscal_year_start
    HomeTimezoneEnum:
      enum:
      - Africa/Abidjan
      - Africa/Accra
      - Africa/Addis_Ababa
      - Africa/Algiers
      - Africa/Asmara
      - Africa/Bamako
      - Africa/Bangui
      - Africa/Banjul
      - Africa/Bissau
      - Africa/Blantyre
      - Africa/Brazzaville
      - Africa/Bujumbura
      - Africa/Cairo
      - Africa/Casablanca
      - Africa/Ceuta
      - Africa/Conakry
      - Africa/Dakar
      - Africa/Dar_es_Salaam
      - Africa/Djibouti
      - Africa/Douala
      - Africa/El_Aaiun
      - Africa/Freetown
      - Africa/Gaborone
      - Africa/Harare
      - Africa/Johannesburg
      - Africa/Juba
      - Africa/Kampala
      - Africa/Khartoum
      - Africa/Kigali
      - Africa/Kinshasa
      - Africa/Lagos
      - Africa/Libreville
      - Africa/Lome
      - Africa/Luanda
      - Africa/Lubumbashi
      - Africa/Lusaka
      - Africa/Malabo
      - Africa/Maputo
      - Africa/Maseru
      - Africa/Mbabane
      - Africa/Mogadishu
      - Africa/Monrovia
      - Africa/Nairobi
      - Africa/Ndjamena
      - Africa/Niamey
      - Africa/Nouakchott
      - Africa/Ouagadougou
      - Africa/Porto-Novo
      - Africa/Sao_Tome
      - Africa/Tripoli
      - Africa/Tunis
      - Africa/Windhoek
      - America/Adak
      - America/Anchorage
      - America/Anguilla
      - America/Antigua
      - America/Araguaina
      - America/Argentina/Buenos_Aires
      - America/Argentina/Catamarca
      - America/Argentina/Cordoba
      - America/Argentina/Jujuy
      - America/Argentina/La_Rioja
      - America/Argentina/Mendoza
      - America/Argentina/Rio_Gallegos
      - America/Argentina/Salta
      - America/Argentina/San_Juan
      - America/Argentina/San_Luis
      - America/Argentina/Tucuman
      - America/Argentina/Ushuaia
      - America/Aruba
      - America/Asuncion
      - America/Atikokan
      - America/Bahia
      - America/Bahia_Banderas
      - America/Barbados
      - America/Belem
      - America/Belize
      - America/Blanc-Sablon
      - America/Boa_Vista
      - America/Bogota
      - America/Boise
      - America/Cambridge_Bay
      - America/Campo_Grande
      - America/Cancun
      - America/Caracas
      - America/Cayenne
      - America/Cayman
      - America/Chicago
      - America/Chihuahua
      - America/Ciudad_Juarez
      - America/Costa_Rica
      - America/Coyhaique
      - America/Creston
      - America/Cuiaba
      - America/Curacao
      - America/Danmarkshavn
      - America/Dawson
      - America/Dawson_Creek
      - America/Denver
      - America/Detroit
      - America/Dominica
      - America/Edmonton
      - America/Eirunepe
      - America/El_Salvador
      - America/Fort_Nelson
      - America/Fortaleza
      - America/Glace_Bay
      - America/Goose_Bay
      - America/Grand_Turk
      - America/Grenada
      - America/Guadeloupe
      - America/Guatemala
      - America/Guayaquil
      - America/Guyana
      - America/Halifax
      - America/Havana
      - America/Hermosillo
      - America/Indiana/Indianapolis
      - America/Indiana/Knox
      - America/Indiana/Marengo
      - America/Indiana/Petersburg
      - America/Indiana/Tell_City
      - America/Indiana/Vevay
      - America/Indiana/Vincennes
      - America/Indiana/Winamac
      - America/Inuvik
      - America/Iqaluit
      - America/Jamaica
      - America/Juneau
      - America/Kentucky/Louisville
      - America/Kentucky/Monticello
      - America/Kralendijk
      - America/La_Paz
      - America/Lima
      - America/Los_Angeles
      - America/Lower_Princes
      - America/Maceio
      - America/Managua
      - America/Manaus
      - America/Marigot
      - America/Martinique
      - America/Matamoros
      - America/Mazatlan
      - America/Menominee
      - America/Merida
      - America/Metlakatla
      - America/Mexico_City
      - America/Miquelon
      - America/Moncton
      - America/Monterrey
      - America/Montevideo
      - America/Montserrat
      - America/Nassau
      - America/New_York
      - America/Nome
      - America/Noronha
      - America/North_Dakota/Beulah
      - America/North_Dakota/Center
      - America/North_Dakota/New_Salem
      - America/Nuuk
      - America/Ojinaga
      - America/Panama
      - America/Paramaribo
      - America/Phoenix
      - America/Port-au-Prince
      - America/Port_of_Spain
      - America/Porto_Velho
      - America/Puerto_Rico
      - America/Punta_Arenas
      - America/Rankin_Inlet
      - America/Recife
      - America/Regina
      - America/Resolute
      - America/Rio_Branco
      - America/Santarem
      - America/Santiago
      - America/Santo_Domingo
      - America/Sao_Paulo
      - America/Scoresbysund
      - America/Sitka
      - America/St_Barthelemy
      - America/St_Johns
      - America/St_Kitts
      - America/St_Lucia
      - America/St_Thomas
      - America/St_Vincent
      - America/Swift_Current
      - America/Tegucigalpa
      - America/Thule
      - America/Tijuana
      - America/Toronto
      - America/Tortola
      - America/Vancouver
      - America/Whitehorse
      - America/Winnipeg
      - America/Yakutat
      - Antarctica/Casey
      - Antarctica/Davis
      - Antarctica/DumontDUrville
      - Antarctica/Macquarie
      - Antarctica/Mawson
      - Antarctica/McMurdo
      - Antarctica/Palmer
      - Antarctica/Rothera
      - Antarctica/Syowa
      - Antarctica/Troll
      - Antarctica/Vostok
      - Arctic/Longyearbyen
      - Asia/Aden
      - Asia/Almaty
      - Asia/Amman
      - Asia/Anadyr
      - Asia/Aqtau
      - Asia/Aqtobe
      - Asia/Ashgabat
      - Asia/Atyrau
      - Asia/Baghdad
      - Asia/Bahrain
      - Asia/Baku
      - Asia/Bangkok
      - Asia/Barnaul
      - Asia/Beirut
      - Asia/Bishkek
      - Asia/Brunei
      - Asia/Chita
      - Asia/Colombo
      - Asia/Damascus
      - Asia/Dhaka
      - Asia/Dili
      - Asia/Dubai
      - Asia/Dushanbe
      - Asia/Famagusta
      - Asia/Gaza
      - Asia/Hebron
      - Asia/Ho_Chi_Minh
      - Asia/Hong_Kong
      - Asia/Hovd
      - Asia/Irkutsk
      - Asia/Jakarta
      - Asia/Jayapura
      - Asia/Jerusalem
      - Asia/Kabul
      - Asia/Kamchatka
      - Asia/Karachi
      - Asia/Kathmandu
      - Asia/Khandyga
      - Asia/Kolkata
      - Asia/Krasnoyarsk
      - Asia/Kuala_Lumpur
      - Asia/Kuching
      - Asia/Kuwait
      - Asia/Macau
      - Asia/Magadan
      - Asia/Makassar
      - Asia/Manila
      - Asia/Muscat
      - Asia/Nicosia
      - Asia/Novokuznetsk
      - Asia/Novosibirsk
      - Asia/Omsk
      - Asia/Oral
      - Asia/Phnom_Penh
      - Asia/Pontianak
      - Asia/Pyongyang
      - Asia/Qatar
      - Asia/Qostanay
      - Asia/Qyzylorda
      - Asia/Riyadh
      - Asia/Sakhalin
      - Asia/Samarkand
      - Asia/Seoul
      - Asia/Shanghai
      - Asia/Singapore
      - Asia/Srednekolymsk
      - Asia/Taipei
      - Asia/Tashkent
      - Asia/Tbilisi
      - Asia/Tehran
      - Asia/Thimphu
      - Asia/Tokyo
      - Asia/Tomsk
      - Asia/Ulaanbaatar
      - Asia/Urumqi
      - Asia/Ust-Nera
      - Asia/Vientiane
      - Asia/Vladivostok
      - Asia/Yakutsk
      - Asia/Yangon
      - Asia/Yekaterinburg
      - Asia/Yerevan
      - Atlantic/Azores
      - Atlantic/Bermuda
      - Atlantic/Canary
      - Atlantic/Cape_Verde
      - Atlantic/Faroe
      - Atlantic/Madeira
      - Atlantic/Reykjavik
      - Atlantic/South_Georgia
      - Atlantic/St_Helena
      - Atlantic/Stanley
      - Australia/Adelaide
      - Australia/Brisbane
      - Australia/Broken_Hill
      - Australia/Darwin
      - Australia/Eucla
      - Australia/Hobart
      - Australia/Lindeman
      - Australia/Lord_Howe
      - Australia/Melbourne
      - Australia/Perth
      - Australia/Sydney
      - Europe/Amsterdam
      - Europe/Andorra
      - Europe/Astrakhan
      - Europe/Athens
      - Europe/Belgrade
      - Europe/Berlin
      - Europe/Bratislava
      - Europe/Brussels
      - Europe/Bucharest
      - Europe/Budapest
      - Europe/Busingen
      - Europe/Chisinau
      - Europe/Copenhagen
      - Europe/Dublin
      - Europe/Gibraltar
      - Europe/Guernsey
      - Europe/Helsinki
      - Europe/Isle_of_Man
      - Europe/Istanbul
      - Europe/Jersey
      - Europe/Kaliningrad
      - Europe/Kirov
      - Europe/Kyiv
      - Europe/Lisbon
      - Europe/Ljubljana
      - Europe/London
      - Europe/Luxembourg
      - Europe/Madrid
      - Europe/Malta
      - Europe/Mariehamn
      - Europe/Minsk
      - Europe/Monaco
      - Europe/Moscow
      - Europe/Oslo
      - Europe/Paris
      - Europe/Podgorica
      - Europe/Prague
      - Europe/Riga
      - Europe/Rome
      - Europe/Samara
      - Europe/San_Marino
      - Europe/Sarajevo
      - Europe/Saratov
      - Europe/Simferopol
      - Europe/Skopje
      - Europe/Sofia
      - Europe/Stockholm
      - Europe/Tallinn
      - Europe/Tirane
      - Europe/Ulyanovsk
      - Europe/Vaduz
      - Europe/Vatican
      - Europe/Vienna
      - Europe/Vilnius
      - Europe/Volgograd
      - Europe/Warsaw
      - Europe/Zagreb
      - Europe/Zurich
      - GMT
      - Indian/Antananarivo
      - Indian/Chagos
      - Indian/Christmas
      - Indian/Cocos
      - Indian/Comoro
      - Indian/Kerguelen
      - Indian/Mahe
      - Indian/Maldives
      - Indian/Mauritius
      - Indian/Mayotte
      - Indian/Reunion
      - Pacific/Apia
      - Pacific/Auckland
      - Pacific/Bougainville
      - Pacific/Chatham
      - Pacific/Chuuk
      - Pacific/Easter
      - Pacific/Efate
      - Pacific/Fakaofo
      - Pacific/Fiji
      - Pacific/Funafuti
      - Pacific/Galapagos
      - Pacific/Gambier
      - Pacific/Guadalcanal
      - Pacific/Guam
      - Pacific/Honolulu
      - Pacific/Kanton
      - Pacific/Kiritimati
      - Pacific/Kosrae
      - Pacific/Kwajalein
      - Pacific/Majuro
      - Pacific/Marquesas
      - Pacific/Midway
      - Pacific/Nauru
      - Pacific/Niue
      - Pacific/Norfolk
      - Pacific/Noumea
      - Pacific/Pago_Pago
      - Pacific/Palau
      - Pacific/Pitcairn
      - Pacific/Pohnpei
      - Pacific/Port_Moresby
      - Pacific/Rarotonga
      - Pacific/Saipan
      - Pacific/Tahiti
      - Pacific/Tarawa
      - Pacific/Tongatapu
      - Pacific/Wake
      - Pacific/Wallis
      - UTC
      type: string
      description: |-
        * `Africa/Abidjan` - Africa/Abidjan
        * `Africa/Accra` - Africa/Accra
        * `Africa/Addis_Ababa` - Africa/Addis_Ababa
        * `Africa/Algiers` - Africa/Algiers
        * `Africa/Asmara` - Africa/Asmara
        * `Africa/Bamako` - Africa/Bamako
        * `Africa/Bangui` - Africa/Bangui
        * `Africa/Banjul` - Africa/Banjul
        * `Africa/Bissau` - Africa/Bissau
        * `Africa/Blantyre` - Africa/Blantyre
        * `Africa/Brazzaville` - Africa/Brazzaville
        * `Africa/Bujumbura` - Africa/Bujumbura
        * `Africa/Cairo` - Africa/Cairo
        * `Africa/Casablanca` - Africa/Casablanca
        * `Africa/Ceuta` - Africa/Ceuta
        * `Africa/Conakry` - Africa/Conakry
        * `Africa/Dakar` - Africa/Dakar
        * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
        * `Africa/Djibouti` - Africa/Djibouti
        * `Africa/Douala` - Africa/Douala
        * `Africa/El_Aaiun` - Africa/El_Aaiun
        * `Africa/Freetown` - Africa/Freetown
        * `Africa/Gaborone` - Africa/Gaborone
        * `Africa/Harare` - Africa/Harare
        * `Africa/Johannesburg` - Africa/Johannesburg
        * `Africa/Juba` - Africa/Juba
        * `Africa/Kampala` - Africa/Kampala
        * `Africa/Khartoum` - Africa/Khartoum
        * `Africa/Kigali` - Africa/Kigali
        * `Africa/Kinshasa` - Africa/Kinshasa
        * `Africa/Lagos` - Africa/Lagos
        * `Africa/Libreville` - Africa/Libreville
        * `Africa/Lome` - Africa/Lome
        * `Africa/Luanda` - Africa/Luanda
        * `Africa/Lubumbashi` - Africa/Lubumbashi
        * `Africa/Lusaka` - Africa/Lusaka
        * `Africa/Malabo` - Africa/Malabo
        * `Africa/Maputo` - Africa/Maputo
        * `Africa/Maseru` - Africa/Maseru
        * `Africa/Mbabane` - Africa/Mbabane
        * `Africa/Mogadishu` - Africa/Mogadishu
        * `Africa/Monrovia` - Africa/Monrovia
        * `Africa/Nairobi` - Africa/Nairobi
        * `Africa/Ndjamena` - Africa/Ndjamena
        * `Africa/Niamey` - Africa/Niamey
        * `Africa/Nouakchott` - Africa/Nouakchott
        * `Africa/Ouagadougou` - Africa/Ouagadougou
        * `Africa/Porto-Novo` - Africa/Porto-Novo
        * `Africa/Sao_Tome` - Africa/Sao_Tome
        * `Africa/Tripoli` - Africa/Tripoli
        * `Africa/Tunis` - Africa/Tunis
        * `Africa/Windhoek` - Africa/Windhoek
        * `America/Adak` - America/Adak
        * `America/Anchorage` - America/Anchorage
        * `America/Anguilla` - America/Anguilla
        * `America/Antigua` - America/Antigua
        * `America/Araguaina` - America/Araguaina
        * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
        * `America/Argentina/Catamarca` - America/Argentina/Catamarca
        * `America/Argentina/Cordoba` - America/Argentina/Cordoba
        * `America/Argentina/Jujuy` - America/Argentina/Jujuy
        * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
        * `America/Argentina/Mendoza` - America/Argentina/Mendoza
        * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
        * `America/Argentina/Salta` - America/Argentina/Salta
        * `America/Argentina/San_Juan` - America/Argentina/San_Juan
        * `America/Argentina/San_Luis` - America/Argentina/San_Luis
        * `America/Argentina/Tucuman` - America/Argentina/Tucuman
        * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
        * `America/Aruba` - America/Aruba
        * `America/Asuncion` - America/Asuncion
        * `America/Atikokan` - America/Atikokan
        * `America/Bahia` - America/Bahia
        * `America/Bahia_Banderas` - America/Bahia_Banderas
        * `America/Barbados` - America/Barbados
        * `America/Belem` - America/Belem
        * `America/Belize` - America/Belize
        * `America/Blanc-Sablon` - America/Blanc-Sablon
        * `America/Boa_Vista` - America/Boa_Vista
        * `America/Bogota` - America/Bogota
        * `America/Boise` - America/Boise
        * `America/Cambridge_Bay` - America/Cambridge_Bay
        * `America/Campo_Grande` - America/Campo_Grande
        * `America/Cancun` - America/Cancun
        * `America/Caracas` - America/Caracas
        * `America/Cayenne` - America/Cayenne
        * `America/Cayman` - America/Cayman
        * `America/Chicago` - America/Chicago
        * `America/Chihuahua` - America/Chihuahua
        * `America/Ciudad_Juarez` - America/Ciudad_Juarez
        * `America/Costa_Rica` - America/Costa_Rica
        * `America/Coyhaique` - America/Coyhaique
        * `America/Creston` - America/Creston
        * `America/Cuiaba` - America/Cuiaba
        * `America/Curacao` - America/Curacao
        * `America/Danmarkshavn` - America/Danmarkshavn
        * `America/Dawson` - America/Dawson
        * `America/Dawson_Creek` - America/Dawson_Creek
        * `America/Denver` - America/Denver
        * `America/Detroit` - America/Detroit
        * `America/Dominica` - America/Dominica
        * `America/Edmonton` - America/Edmonton
        * `America/Eirunepe` - America/Eirunepe
        * `America/El_Salvador` - America/El_Salvador
        * `America/Fort_Nelson` - America/Fort_Nelson
        * `America/Fortaleza` - America/Fortaleza
        * `America/Glace_Bay` - America/Glace_Bay
        * `America/Goose_Bay` - America/Goose_Bay
        * `America/Grand_Turk` - America/Grand_Turk
        * `America/Grenada` - America/Grenada
        * `America/Guadeloupe` - America/Guadeloupe
        * `America/Guatemala` - America/Guatemala
        * `America/Guayaquil` - America/Guayaquil
        * `America/Guyana` - America/Guyana
        * `America/Halifax` - America/Halifax
        * `America/Havana` - America/Havana
        * `America/Hermosillo` - America/Hermosillo
        * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
        * `America/Indiana/Knox` - America/Indiana/Knox
        * `America/Indiana/Marengo` - America/Indiana/Marengo
        * `America/Indiana/Petersburg` - America/Indiana/Petersburg
        * `America/Indiana/Tell_City` - America/Indiana/Tell_City
        * `America/Indiana/Vevay` - America/Indiana/Vevay
        * `America/Indiana/Vincennes` - America/Indiana/Vincennes
        * `America/Indiana/Winamac` - America/Indiana/Winamac
        * `America/Inuvik` - America/Inuvik
        * `America/Iqaluit` - America/Iqaluit
        * `America/Jamaica` - America/Jamaica
        * `America/Juneau` - America/Juneau
        * `America/Kentucky/Louisville` - America/Kentucky/Louisville
        * `America/Kentucky/Monticello` - America/Kentucky/Monticello
        * `America/Kralendijk` - America/Kralendijk
        * `America/La_Paz` - America/La_Paz
        * `America/Lima` - America/Lima
        * `America/Los_Angeles` - America/Los_Angeles
        * `America/Lower_Princes` - America/Lower_Princes
        * `America/Maceio` - America/Maceio
        * `America/Managua` - America/Managua
        * `America/Manaus` - America/Manaus
        * `America/Marigot` - America/Marigot
        * `America/Martinique` - America/Martinique
        * `America/Matamoros` - America/Matamoros
        * `America/Mazatlan` - America/Mazatlan
        * `America/Menominee` - America/Menominee
        * `America/Merida` - America/Merida
        * `America/Metlakatla` - America/Metlakatla
        * `America/Mexico_City` - America/Mexico_City
        * `America/Miquelon` - America/Miquelon
        * `America/Moncton` - America/Moncton
        * `America/Monterrey` - America/Monterrey
        * `America/Montevideo` - America/Montevideo
        * `America/Montserrat` - America/Montserrat
        * `America/Nassau` - America/Nassau
        * `America/New_York` - America/New_York
        * `America/Nome` - America/Nome
        * `America/Noronha` - America/Noronha
        * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
        * `America/North_Dakota/Center` - America/North_Dakota/Center
        * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
        * `America/Nuuk` - America/Nuuk
        * `America/Ojinaga` - America/Ojinaga
        * `America/Panama` - America/Panama
        * `America/Paramaribo` - America/Paramaribo
        * `America/Phoenix` - America/Phoenix
        * `America/Port-au-Prince` - America/Port-au-Prince
        * `America/Port_of_Spain` - America/Port_of_Spain
        * `America/Porto_Velho` - America/Porto_Velho
        * `America/Puerto_Rico` - America/Puerto_Rico
        * `America/Punta_Arenas` - America/Punta_Arenas
        * `America/Rankin_Inlet` - America/Rankin_Inlet
        * `America/Recife` - America/Recife
        * `America/Regina` - America/Regina
        * `America/Resolute` - America/Resolute
        * `America/Rio_Branco` - America/Rio_Branco
        * `America/Santarem` - America/Santarem
        * `America/Santiago` - America/Santiago
        * `America/Santo_Domingo` - America/Santo_Domingo
        * `America/Sao_Paulo` - America/Sao_Paulo
        * `America/Scoresbysund` - America/Scoresbysund
        * `America/Sitka` - America/Sitka
        * `America/St_Barthelemy` - America/St_Barthelemy
        * `America/St_Johns` - America/St_Johns
        * `America/St_Kitts` - America/St_Kitts
        * `America/St_Lucia` - America/St_Lucia
        * `America/St_Thomas` - America/St_Thomas
        * `America/St_Vincent` - America/St_Vincent
        * `America/Swift_Current` - America/Swift_Current
        * `America/Tegucigalpa` - America/Tegucigalpa
        * `America/Thule` - America/Thule
        * `America/Tijuana` - America/Tijuana
        * `America/Toronto` - America/Toronto
        * `America/Tortola` - America/Tortola
        * `America/Vancouver` - America/Vancouver
        * `America/Whitehorse` - America/Whitehorse
        * `America/Winnipeg` - America/Winnipeg
        * `America/Yakutat` - America/Yakutat
        * `Antarctica/Casey` - Antarctica/Casey
        * `Antarctica/Davis` - Antarctica/Davis
        * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
        * `Antarctica/Macquarie` - Antarctica/Macquarie
        * `Antarctica/Mawson` - Antarctica/Mawson
        * `Antarctica/McMurdo` - Antarctica/McMurdo
        * `Antarctica/Palmer` - Antarctica/Palmer
        * `Antarctica/Rothera` - Antarctica/Rothera
        * `Antarctica/Syowa` - Antarctica/Syowa
        * `Antarctica/Troll` - Antarctica/Troll
        * `Antarctica/Vostok` - Antarctica/Vostok
        * `Arctic/Longyearbyen` - Arctic/Longyearbyen
        * `Asia/Aden` - Asia/Aden
        * `Asia/Almaty` - Asia/Almaty
        * `Asia/Amman` - Asia/Amman
        * `Asia/Anadyr` - Asia/Anadyr
        * `Asia/Aqtau` - Asia/Aqtau
        * `Asia/Aqtobe` - Asia/Aqtobe
        * `Asia/Ashgabat` - Asia/Ashgabat
        * `Asia/Atyrau` - Asia/Atyrau
        * `Asia/Baghdad` - Asia/Baghdad
        * `Asia/Bahrain` - Asia/Bahrain
        * `Asia/Baku` - Asia/Baku
        * `Asia/Bangkok` - Asia/Bangkok
        * `Asia/Barnaul` - Asia/Barnaul
        * `Asia/Beirut` - Asia/Beirut
        * `Asia/Bishkek` - Asia/Bishkek
        * `Asia/Brunei` - Asia/Brunei
        * `Asia/Chita` - Asia/Chita
        * `Asia/Colombo` - Asia/Colombo
        * `Asia/Damascus` - Asia/Damascus
        * `Asia/Dhaka` - Asia/Dhaka
        * `Asia/Dili` - Asia/Dili
        * `Asia/Dubai` - Asia/Dubai
        * `Asia/Dushanbe` - Asia/Dushanbe
        * `Asia/Famagusta` - Asia/Famagusta
        * `Asia/Gaza` - Asia/Gaza
        * `Asia/Hebron` - Asia/Hebron
        * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
        * `Asia/Hong_Kong` - Asia/Hong_Kong
        * `Asia/Hovd` - Asia/Hovd
        * `Asia/Irkutsk` - Asia/Irkutsk
        * `Asia/Jakarta` - Asia/Jakarta
        * `Asia/Jayapura` - Asia/Jayapura
        * `Asia/Jerusalem` - Asia/Jerusalem
        * `Asia/Kabul` - Asia/Kabul
        * `Asia/Kamchatka` - Asia/Kamchatka
        * `Asia/Karachi` - Asia/Karachi
        * `Asia/Kathmandu` - Asia/Kathmandu
        * `Asia/Khandyga` - Asia/Khandyga
        * `Asia/Kolkata` - Asia/Kolkata
        * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
        * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
        * `Asia/Kuching` - Asia/Kuching
        * `Asia/Kuwait` - Asia/Kuwait
        * `Asia/Macau` - Asia/Macau
        * `Asia/Magadan` - Asia/Magadan
        * `Asia/Makassar` - Asia/Makassar
        * `Asia/Manila` - Asia/Manila
        * `Asia/Muscat` - Asia/Muscat
        * `Asia/Nicosia` - Asia/Nicosia
        * `Asia/Novokuznetsk` - Asia/Novokuznetsk
        * `Asia/Novosibirsk` - Asia/Novosibirsk
        * `Asia/Omsk` - Asia/Omsk
        * `Asia/Oral` - Asia/Oral
        * `Asia/Phnom_Penh` - Asia/Phnom_Penh
        * `Asia/Pontianak` - Asia/Pontianak
        * `Asia/Pyongyang` - Asia/Pyongyang
        * `Asia/Qatar` - Asia/Qatar
        * `Asia/Qostanay` - Asia/Qostanay
        * `Asia/Qyzylorda` - Asia/Qyzylorda
        * `Asia/Riyadh` - Asia/Riyadh
        * `Asia/Sakhalin` - Asia/Sakhalin
        * `Asia/Samarkand` - Asia/Samarkand
        * `Asia/Seoul` - Asia/Seoul
        * `Asia/Shanghai` - Asia/Shanghai
        * `Asia/Singapore` - Asia/Singapore
        * `Asia/Srednekolymsk` - Asia/Srednekolymsk
        * `Asia/Taipei` - Asia/Taipei
        * `Asia/Tashkent` - Asia/Tashkent
        * `Asia/Tbilisi` - Asia/Tbilisi
        * `Asia/Tehran` - Asia/Tehran
        * `Asia/Thimphu` - Asia/Thimphu
        * `Asia/Tokyo` - Asia/Tokyo
        * `Asia/Tomsk` - Asia/Tomsk
        * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
        * `Asia/Urumqi` - Asia/Urumqi
        * `Asia/Ust-Nera` - Asia/Ust-Nera
        * `Asia/Vientiane` - Asia/Vientiane
        * `Asia/Vladivostok` - Asia/Vladivostok
        * `Asia/Yakutsk` - Asia/Yakutsk
        * `Asia/Yangon` - Asia/Yangon
        * `Asia/Yekaterinburg` - Asia/Yekaterinburg
        * `Asia/Yerevan` - Asia/Yerevan
        * `Atlantic/Azores` - Atlantic/Azores
        * `Atlantic/Bermuda` - Atlantic/Bermuda
        * `Atlantic/Canary` - Atlantic/Canary
        * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
        * `Atlantic/Faroe` - Atlantic/Faroe
        * `Atlantic/Madeira` - Atlantic/Madeira
        * `Atlantic/Reykjavik` - Atlantic/Reykjavik
        * `Atlantic/South_Georgia` - Atlantic/South_Georgia
        * `Atlantic/St_Helena` - Atlantic/St_Helena
        * `Atlantic/Stanley` - Atlantic/Stanley
        * `Australia/Adelaide` - Australia/Adelaide
        * `Australia/Brisbane` - Australia/Brisbane
        * `Australia/Broken_Hill` - Australia/Broken_Hill
        * `Australia/Darwin` - Australia/Darwin
        * `Australia/Eucla` - Australia/Eucla
        * `Australia/Hobart` - Australia/Hobart
        * `Australia/Lindeman` - Australia/Lindeman
        * `Australia/Lord_Howe` - Australia/Lord_Howe
        * `Australia/Melbourne` - Australia/Melbourne
        * `Australia/Perth` - Australia/Perth
        * `Australia/Sydney` - Australia/Sydney
        * `Europe/Amsterdam` - Europe/Amsterdam
        * `Europe/Andorra` - Europe/Andorra
        * `Europe/Astrakhan` - Europe/Astrakhan
        * `Europe/Athens` - Europe/Athens
        * `Europe/Belgrade` - Europe/Belgrade
        * `Europe/Berlin` - Europe/Berlin
        * `Europe/Bratislava` - Europe/Bratislava
        * `Europe/Brussels` - Europe/Brussels
        * `Europe/Bucharest` - Europe/Bucharest
        * `Europe/Budapest` - Europe/Budapest
        * `Europe/Busingen` - Europe/Busingen
        * `Europe/Chisinau` - Europe/Chisinau
        * `Europe/Copenhagen` - Europe/Copenhagen
        * `Europe/Dublin` - Europe/Dublin
        * `Europe/Gibraltar` - Europe/Gibraltar
        * `Europe/Guernsey` - Europe/Guernsey
        * `Europe/Helsinki` - Europe/Helsinki
        * `Europe/Isle_of_Man` - Europe/Isle_of_Man
        * `Europe/Istanbul` - Europe/Istanbul
        * `Europe/Jersey` - Europe/Jersey
        * `Europe/Kaliningrad` - Europe/Kaliningrad
        * `Europe/Kirov` - Europe/Kirov
        * `Europe/Kyiv` - Europe/Kyiv
        * `Europe/Lisbon` - Europe/Lisbon
        * `Europe/Ljubljana` - Europe/Ljubljana
        * `Europe/London` - Europe/London
        * `Europe/Luxembourg` - Europe/Luxembourg
        * `Europe/Madrid` - Europe/Madrid
        * `Europe/Malta` - Europe/Malta
        * `Europe/Mariehamn` - Europe/Mariehamn
        * `Europe/Minsk` - Europe/Minsk
        * `Europe/Monaco` - Europe/Monaco
        * `Europe/Moscow` - Europe/Moscow
        * `Europe/Oslo` - Europe/Oslo
        * `Europe/Paris` - Europe/Paris
        * `Europe/Podgorica` - Europe/Podgorica
        * `Europe/Prague` - Europe/Prague
        * `Europe/Riga` - Europe/Riga
        * `Europe/Rome` - Europe/Rome
        * `Europe/Samara` - Europe/Samara
        * `Europe/San_Marino` - Europe/San_Marino
        * `Europe/Sarajevo` - Europe/Sarajevo
        * `Europe/Saratov` - Europe/Saratov
        * `Europe/Simferopol` - Europe/Simferopol
        * `Europe/Skopje` - Europe/Skopje
        * `Europe/Sofia` - Europe/Sofia
        * `Europe/Stockholm` - Europe/Stockholm
        * `Europe/Tallinn` - Europe/Tallinn
        * `Europe/Tirane` - Europe/Tirane
        * `Europe/Ulyanovsk` - Europe/Ulyanovsk
        * `Europe/Vaduz` - Europe/Vaduz
        * `Europe/Vatican` - Europe/Vatican
        * `Europe/Vienna` - Europe/Vienna
        * `Europe/Vilnius` - Europe/Vilnius
        * `Europe/Volgograd` - Europe/Volgograd
        * `Europe/Warsaw` - Europe/Warsaw
        * `Europe/Zagreb` - Europe/Zagreb
        * `Europe/Zurich` - Europe/Zurich
        * `GMT` - GMT
        * `Indian/Antananarivo` - Indian/Antananarivo
        * `Indian/Chagos` - Indian/Chagos
        * `Indian/Christmas` - Indian/Christmas
        * `Indian/Cocos` - Indian/Cocos
        * `Indian/Comoro` - Indian/Comoro
        * `Indian/Kerguelen` - Indian/Kerguelen
        * `Indian/Mahe` - Indian/Mahe
        * `Indian/Maldives` - Indian/Maldives
        * `Indian/Mauritius` - Indian/Mauritius
        * `Indian/Mayotte` - Indian/Mayotte
        * `Indian/Reunion` - Indian/Reunion
        * `Pacific/Apia` - Pacific/Apia
        * `Pacific/Auckland` - Pacific/Auckland
        * `Pacific/Bougainville` - Pacific/Bougainville
        * `Pacific/Chatham` - Pacific/Chatham
        * `Pacific/Chuuk` - Pacific/Chuuk
        * `Pacific/Easter` - Pacific/Easter
        * `Pacific/Efate` - Pacific/Efate
        * `Pacific/Fakaofo` - Pacific/Fakaofo
        * `Pacific/Fiji` - Pacific/Fiji
        * `Pacific/Funafuti` - Pacific/Funafuti
        * `Pacific/Galapagos` - Pacific/Galapagos
        * `Pacific/Gambier` - Pacific/Gambier
        * `Pacific/Guadalcanal` - Pacific/Guadalcanal
        * `Pacific/Guam` - Pacific/Guam
        * `Pacific/Honolulu` - Pacific/Honolulu
        * `Pacific/Kanton` - Pacific/Kanton
        * `Pacific/Kiritimati` - Pacific/Kiritimati
        * `Pacific/Kosrae` - Pacific/Kosrae
        * `Pacific/Kwajalein` - Pacific/Kwajalein
        * `Pacific/Majuro` - Pacific/Majuro
        * `Pacific/Marquesas` - Pacific/Marquesas
        * `Pacific/Midway` - Pacific/Midway
        * `Pacific/Nauru` - Pacific/Nauru
        * `Pacific/Niue` - Pacific/Niue
        * `Pacific/Norfolk` - Pacific/Norfolk
        * `Pacific/Noumea` - Pacific/Noumea
        * `Pacific/Pago_Pago` - Pacific/Pago_Pago
        * `Pacific/Palau` - Pacific/Palau
        * `Pacific/Pitcairn` - Pacific/Pitcairn
        * `Pacific/Pohnpei` - Pacific/Pohnpei
        * `Pacific/Port_Moresby` - Pacific/Port_Moresby
        * `Pacific/Rarotonga` - Pacific/Rarotonga
        * `Pacific/Saipan` - Pacific/Saipan
        * `Pacific/Tahiti` - Pacific/Tahiti
        * `Pacific/Tarawa` - Pacific/Tarawa
        * `Pacific/Tongatapu` - Pacific/Tongatapu
        * `Pacific/Wake` - Pacific/Wake
        * `Pacific/Wallis` - Pacific/Wallis
        * `UTC` - UTC
    ImpactEnum:
      enum:
      - High
      - Medium
      - Low
      type: string
      description: |-
        * `High` - High
        * `Medium` - Medium
        * `Low` - Low
    ImpactLevelEnum:
      enum:
      - High
      - Medium
      - Low
      type: string
      description: |-
        * `High` - High
        * `Medium` - Medium
        * `Low` - Low
    ImpactTypeEnum:
      enum:
      - Revenue
      - CX Improvement
      - EX Improvement
      - Cost Reduction
      - Risk Reduction
      type: string
      description: |-
        * `Revenue` - Revenue
        * `CX Improvement` - CX Improvement
        * `EX Improvement` - EX Improvement
        * `Cost Reduction` - Cost Reduction
        * `Risk Reduction` - Risk Reduction
    InterestEnum:
      enum:
      - High
      - Medium
      - Low
      type: string
      description: |-
        * `High` - High
        * `Medium` - Medium
        * `Low` - Low
    Interview:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        contact:
          allOf:
          - $ref: '#/components/schemas/Contact'
          readOnly: true
        date:
          type: string
          format: date
        time:
          type: string
          format: time
        notes:
          type: string
      required:
      - contact
      - date
      - id
      - name
      - time
    InterviewRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        contact_id:
          type: integer
          writeOnly: true
        date:
          type: string
          format: date
        time:
          type: string
          format: time
        notes:
          type: string
      required:
      - contact_id
      - date
      - name
      - time
    Issue:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        potential_impact:
          $ref: '#/components/schemas/PotentialImpactEnum'
        owner:
          type: integer
        owner_name:
          type: string
          readOnly: true
        priority:
          $ref: '#/components/schemas/Priority758Enum'
        status:
          $ref: '#/components/schemas/IssueStatusEnum'
        due_date:
          type: string
          format: date
      required:
      - description
      - due_date
      - id
      - owner
      - owner_name
      - potential_impact
      - priority
      - status
      - title
    IssueStatusEnum:
      enum:
      - Open
      - In Progress
      - Resolved
      - Closed
      type: string
      description: |-
        * `Open` - Open
        * `In Progress` - In Progress
        * `Resolved` - Resolved
        * `Closed` - Closed
    LocalTimezoneEnum:
      enum:
      - Africa/Abidjan
      - Africa/Accra
      - Africa/Addis_Ababa
      - Africa/Algiers
      - Africa/Asmara
      - Africa/Bamako
      - Africa/Bangui
      - Africa/Banjul
      - Africa/Bissau
      - Africa/Blantyre
      - Africa/Brazzaville
      - Africa/Bujumbura
      - Africa/Cairo
      - Africa/Casablanca
      - Africa/Ceuta
      - Africa/Conakry
      - Africa/Dakar
      - Africa/Dar_es_Salaam
      - Africa/Djibouti
      - Africa/Douala
      - Africa/El_Aaiun
      - Africa/Freetown
      - Africa/Gaborone
      - Africa/Harare
      - Africa/Johannesburg
      - Africa/Juba
      - Africa/Kampala
      - Africa/Khartoum
      - Africa/Kigali
      - Africa/Kinshasa
      - Africa/Lagos
      - Africa/Libreville
      - Africa/Lome
      - Africa/Luanda
      - Africa/Lubumbashi
      - Africa/Lusaka
      - Africa/Malabo
      - Africa/Maputo
      - Africa/Maseru
      - Africa/Mbabane
      - Africa/Mogadishu
      - Africa/Monrovia
      - Africa/Nairobi
      - Africa/Ndjamena
      - Africa/Niamey
      - Africa/Nouakchott
      - Africa/Ouagadougou
      - Africa/Porto-Novo
      - Africa/Sao_Tome
      - Africa/Tripoli
      - Africa/Tunis
      - Africa/Windhoek
      - America/Adak
      - America/Anchorage
      - America/Anguilla
      - America/Antigua
      - America/Araguaina
      - America/Argentina/Buenos_Aires
      - America/Argentina/Catamarca
      - America/Argentina/Cordoba
      - America/Argentina/Jujuy
      - America/Argentina/La_Rioja
      - America/Argentina/Mendoza
      - America/Argentina/Rio_Gallegos
      - America/Argentina/Salta
      - America/Argentina/San_Juan
      - America/Argentina/San_Luis
      - America/Argentina/Tucuman
      - America/Argentina/Ushuaia
      - America/Aruba
      - America/Asuncion
      - America/Atikokan
      - America/Bahia
      - America/Bahia_Banderas
      - America/Barbados
      - America/Belem
      - America/Belize
      - America/Blanc-Sablon
      - America/Boa_Vista
      - America/Bogota
      - America/Boise
      - America/Cambridge_Bay
      - America/Campo_Grande
      - America/Cancun
      - America/Caracas
      - America/Cayenne
      - America/Cayman
      - America/Chicago
      - America/Chihuahua
      - America/Ciudad_Juarez
      - America/Costa_Rica
      - America/Coyhaique
      - America/Creston
      - America/Cuiaba
      - America/Curacao
      - America/Danmarkshavn
      - America/Dawson
      - America/Dawson_Creek
      - America/Denver
      - America/Detroit
      - America/Dominica
      - America/Edmonton
      - America/Eirunepe
      - America/El_Salvador
      - America/Fort_Nelson
      - America/Fortaleza
      - America/Glace_Bay
      - America/Goose_Bay
      - America/Grand_Turk
      - America/Grenada
      - America/Guadeloupe
      - America/Guatemala
      - America/Guayaquil
      - America/Guyana
      - America/Halifax
      - America/Havana
      - America/Hermosillo
      - America/Indiana/Indianapolis
      - America/Indiana/Knox
      - America/Indiana/Marengo
      - America/Indiana/Petersburg
      - America/Indiana/Tell_City
      - America/Indiana/Vevay
      - America/Indiana/Vincennes
      - America/Indiana/Winamac
      - America/Inuvik
      - America/Iqaluit
      - America/Jamaica
      - America/Juneau
      - America/Kentucky/Louisville
      - America/Kentucky/Monticello
      - America/Kralendijk
      - America/La_Paz
      - America/Lima
      - America/Los_Angeles
      - America/Lower_Princes
      - America/Maceio
      - America/Managua
      - America/Manaus
      - America/Marigot
      - America/Martinique
      - America/Matamoros
      - America/Mazatlan
      - America/Menominee
      - America/Merida
      - America/Metlakatla
      - America/Mexico_City
      - America/Miquelon
      - America/Moncton
      - America/Monterrey
      - America/Montevideo
      - America/Montserrat
      - America/Nassau
      - America/New_York
      - America/Nome
      - America/Noronha
      - America/North_Dakota/Beulah
      - America/North_Dakota/Center
      - America/North_Dakota/New_Salem
      - America/Nuuk
      - America/Ojinaga
      - America/Panama
      - America/Paramaribo
      - America/Phoenix
      - America/Port-au-Prince
      - America/Port_of_Spain
      - America/Porto_Velho
      - America/Puerto_Rico
      - America/Punta_Arenas
      - America/Rankin_Inlet
      - America/Recife
      - America/Regina
      - America/Resolute
      - America/Rio_Branco
      - America/Santarem
      - America/Santiago
      - America/Santo_Domingo
      - America/Sao_Paulo
      - America/Scoresbysund
      - America/Sitka
      - America/St_Barthelemy
      - America/St_Johns
      - America/St_Kitts
      - America/St_Lucia
      - America/St_Thomas
      - America/St_Vincent
      - America/Swift_Current
      - America/Tegucigalpa
      - America/Thule
      - America/Tijuana
      - America/Toronto
      - America/Tortola
      - America/Vancouver
      - America/Whitehorse
      - America/Winnipeg
      - America/Yakutat
      - Antarctica/Casey
      - Antarctica/Davis
      - Antarctica/DumontDUrville
      - Antarctica/Macquarie
      - Antarctica/Mawson
      - Antarctica/McMurdo
      - Antarctica/Palmer
      - Antarctica/Rothera
      - Antarctica/Syowa
      - Antarctica/Troll
      - Antarctica/Vostok
      - Arctic/Longyearbyen
      - Asia/Aden
      - Asia/Almaty
      - Asia/Amman
      - Asia/Anadyr
      - Asia/Aqtau
      - Asia/Aqtobe
      - Asia/Ashgabat
      - Asia/Atyrau
      - Asia/Baghdad
      - Asia/Bahrain
      - Asia/Baku
      - Asia/Bangkok
      - Asia/Barnaul
      - Asia/Beirut
      - Asia/Bishkek
      - Asia/Brunei
      - Asia/Chita
      - Asia/Colombo
      - Asia/Damascus
      - Asia/Dhaka
      - Asia/Dili
      - Asia/Dubai
      - Asia/Dushanbe
      - Asia/Famagusta
      - Asia/Gaza
      - Asia/Hebron
      - Asia/Ho_Chi_Minh
      - Asia/Hong_Kong
      - Asia/Hovd
      - Asia/Irkutsk
      - Asia/Jakarta
      - Asia/Jayapura
      - Asia/Jerusalem
      - Asia/Kabul
      - Asia/Kamchatka
      - Asia/Karachi
      - Asia/Kathmandu
      - Asia/Khandyga
      - Asia/Kolkata
      - Asia/Krasnoyarsk
      - Asia/Kuala_Lumpur
      - Asia/Kuching
      - Asia/Kuwait
      - Asia/Macau
      - Asia/Magadan
      - Asia/Makassar
      - Asia/Manila
      - Asia/Muscat
      - Asia/Nicosia
      - Asia/Novokuznetsk
      - Asia/Novosibirsk
      - Asia/Omsk
      - Asia/Oral
      - Asia/Phnom_Penh
      - Asia/Pontianak
      - Asia/Pyongyang
      - Asia/Qatar
      - Asia/Qostanay
      - Asia/Qyzylorda
      - Asia/Riyadh
      - Asia/Sakhalin
      - Asia/Samarkand
      - Asia/Seoul
      - Asia/Shanghai
      - Asia/Singapore
      - Asia/Srednekolymsk
      - Asia/Taipei
      - Asia/Tashkent
      - Asia/Tbilisi
      - Asia/Tehran
      - Asia/Thimphu
      - Asia/Tokyo
      - Asia/Tomsk
      - Asia/Ulaanbaatar
      - Asia/Urumqi
      - Asia/Ust-Nera
      - Asia/Vientiane
      - Asia/Vladivostok
      - Asia/Yakutsk
      - Asia/Yangon
      - Asia/Yekaterinburg
      - Asia/Yerevan
      - Atlantic/Azores
      - Atlantic/Bermuda
      - Atlantic/Canary
      - Atlantic/Cape_Verde
      - Atlantic/Faroe
      - Atlantic/Madeira
      - Atlantic/Reykjavik
      - Atlantic/South_Georgia
      - Atlantic/St_Helena
      - Atlantic/Stanley
      - Australia/Adelaide
      - Australia/Brisbane
      - Australia/Broken_Hill
      - Australia/Darwin
      - Australia/Eucla
      - Australia/Hobart
      - Australia/Lindeman
      - Australia/Lord_Howe
      - Australia/Melbourne
      - Australia/Perth
      - Australia/Sydney
      - Europe/Amsterdam
      - Europe/Andorra
      - Europe/Astrakhan
      - Europe/Athens
      - Europe/Belgrade
      - Europe/Berlin
      - Europe/Bratislava
      - Europe/Brussels
      - Europe/Bucharest
      - Europe/Budapest
      - Europe/Busingen
      - Europe/Chisinau
      - Europe/Copenhagen
      - Europe/Dublin
      - Europe/Gibraltar
      - Europe/Guernsey
      - Europe/Helsinki
      - Europe/Isle_of_Man
      - Europe/Istanbul
      - Europe/Jersey
      - Europe/Kaliningrad
      - Europe/Kirov
      - Europe/Kyiv
      - Europe/Lisbon
      - Europe/Ljubljana
      - Europe/London
      - Europe/Luxembourg
      - Europe/Madrid
      - Europe/Malta
      - Europe/Mariehamn
      - Europe/Minsk
      - Europe/Monaco
      - Europe/Moscow
      - Europe/Oslo
      - Europe/Paris
      - Europe/Podgorica
      - Europe/Prague
      - Europe/Riga
      - Europe/Rome
      - Europe/Samara
      - Europe/San_Marino
      - Europe/Sarajevo
      - Europe/Saratov
      - Europe/Simferopol
      - Europe/Skopje
      - Europe/Sofia
      - Europe/Stockholm
      - Europe/Tallinn
      - Europe/Tirane
      - Europe/Ulyanovsk
      - Europe/Vaduz
      - Europe/Vatican
      - Europe/Vienna
      - Europe/Vilnius
      - Europe/Volgograd
      - Europe/Warsaw
      - Europe/Zagreb
      - Europe/Zurich
      - GMT
      - Indian/Antananarivo
      - Indian/Chagos
      - Indian/Christmas
      - Indian/Cocos
      - Indian/Comoro
      - Indian/Kerguelen
      - Indian/Mahe
      - Indian/Maldives
      - Indian/Mauritius
      - Indian/Mayotte
      - Indian/Reunion
      - Pacific/Apia
      - Pacific/Auckland
      - Pacific/Bougainville
      - Pacific/Chatham
      - Pacific/Chuuk
      - Pacific/Easter
      - Pacific/Efate
      - Pacific/Fakaofo
      - Pacific/Fiji
      - Pacific/Funafuti
      - Pacific/Galapagos
      - Pacific/Gambier
      - Pacific/Guadalcanal
      - Pacific/Guam
      - Pacific/Honolulu
      - Pacific/Kanton
      - Pacific/Kiritimati
      - Pacific/Kosrae
      - Pacific/Kwajalein
      - Pacific/Majuro
      - Pacific/Marquesas
      - Pacific/Midway
      - Pacific/Nauru
      - Pacific/Niue
      - Pacific/Norfolk
      - Pacific/Noumea
      - Pacific/Pago_Pago
      - Pacific/Palau
      - Pacific/Pitcairn
      - Pacific/Pohnpei
      - Pacific/Port_Moresby
      - Pacific/Rarotonga
      - Pacific/Saipan
      - Pacific/Tahiti
      - Pacific/Tarawa
      - Pacific/Tongatapu
      - Pacific/Wake
      - Pacific/Wallis
      - UTC
      type: string
      description: |-
        * `Africa/Abidjan` - Africa/Abidjan
        * `Africa/Accra` - Africa/Accra
        * `Africa/Addis_Ababa` - Africa/Addis_Ababa
        * `Africa/Algiers` - Africa/Algiers
        * `Africa/Asmara` - Africa/Asmara
        * `Africa/Bamako` - Africa/Bamako
        * `Africa/Bangui` - Africa/Bangui
        * `Africa/Banjul` - Africa/Banjul
        * `Africa/Bissau` - Africa/Bissau
        * `Africa/Blantyre` - Africa/Blantyre
        * `Africa/Brazzaville` - Africa/Brazzaville
        * `Africa/Bujumbura` - Africa/Bujumbura
        * `Africa/Cairo` - Africa/Cairo
        * `Africa/Casablanca` - Africa/Casablanca
        * `Africa/Ceuta` - Africa/Ceuta
        * `Africa/Conakry` - Africa/Conakry
        * `Africa/Dakar` - Africa/Dakar
        * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
        * `Africa/Djibouti` - Africa/Djibouti
        * `Africa/Douala` - Africa/Douala
        * `Africa/El_Aaiun` - Africa/El_Aaiun
        * `Africa/Freetown` - Africa/Freetown
        * `Africa/Gaborone` - Africa/Gaborone
        * `Africa/Harare` - Africa/Harare
        * `Africa/Johannesburg` - Africa/Johannesburg
        * `Africa/Juba` - Africa/Juba
        * `Africa/Kampala` - Africa/Kampala
        * `Africa/Khartoum` - Africa/Khartoum
        * `Africa/Kigali` - Africa/Kigali
        * `Africa/Kinshasa` - Africa/Kinshasa
        * `Africa/Lagos` - Africa/Lagos
        * `Africa/Libreville` - Africa/Libreville
        * `Africa/Lome` - Africa/Lome
        * `Africa/Luanda` - Africa/Luanda
        * `Africa/Lubumbashi` - Africa/Lubumbashi
        * `Africa/Lusaka` - Africa/Lusaka
        * `Africa/Malabo` - Africa/Malabo
        * `Africa/Maputo` - Africa/Maputo
        * `Africa/Maseru` - Africa/Maseru
        * `Africa/Mbabane` - Africa/Mbabane
        * `Africa/Mogadishu` - Africa/Mogadishu
        * `Africa/Monrovia` - Africa/Monrovia
        * `Africa/Nairobi` - Africa/Nairobi
        * `Africa/Ndjamena` - Africa/Ndjamena
        * `Africa/Niamey` - Africa/Niamey
        * `Africa/Nouakchott` - Africa/Nouakchott
        * `Africa/Ouagadougou` - Africa/Ouagadougou
        * `Africa/Porto-Novo` - Africa/Porto-Novo
        * `Africa/Sao_Tome` - Africa/Sao_Tome
        * `Africa/Tripoli` - Africa/Tripoli
        * `Africa/Tunis` - Africa/Tunis
        * `Africa/Windhoek` - Africa/Windhoek
        * `America/Adak` - America/Adak
        * `America/Anchorage` - America/Anchorage
        * `America/Anguilla` - America/Anguilla
        * `America/Antigua` - America/Antigua
        * `America/Araguaina` - America/Araguaina
        * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
        * `America/Argentina/Catamarca` - America/Argentina/Catamarca
        * `America/Argentina/Cordoba` - America/Argentina/Cordoba
        * `America/Argentina/Jujuy` - America/Argentina/Jujuy
        * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
        * `America/Argentina/Mendoza` - America/Argentina/Mendoza
        * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
        * `America/Argentina/Salta` - America/Argentina/Salta
        * `America/Argentina/San_Juan` - America/Argentina/San_Juan
        * `America/Argentina/San_Luis` - America/Argentina/San_Luis
        * `America/Argentina/Tucuman` - America/Argentina/Tucuman
        * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
        * `America/Aruba` - America/Aruba
        * `America/Asuncion` - America/Asuncion
        * `America/Atikokan` - America/Atikokan
        * `America/Bahia` - America/Bahia
        * `America/Bahia_Banderas` - America/Bahia_Banderas
        * `America/Barbados` - America/Barbados
        * `America/Belem` - America/Belem
        * `America/Belize` - America/Belize
        * `America/Blanc-Sablon` - America/Blanc-Sablon
        * `America/Boa_Vista` - America/Boa_Vista
        * `America/Bogota` - America/Bogota
        * `America/Boise` - America/Boise
        * `America/Cambridge_Bay` - America/Cambridge_Bay
        * `America/Campo_Grande` - America/Campo_Grande
        * `America/Cancun` - America/Cancun
        * `America/Caracas` - America/Caracas
        * `America/Cayenne` - America/Cayenne
        * `America/Cayman` - America/Cayman
        * `America/Chicago` - America/Chicago
        * `America/Chihuahua` - America/Chihuahua
        * `America/Ciudad_Juarez` - America/Ciudad_Juarez
        * `America/Costa_Rica` - America/Costa_Rica
        * `America/Coyhaique` - America/Coyhaique
        * `America/Creston` - America/Creston
        * `America/Cuiaba` - America/Cuiaba
        * `America/Curacao` - America/Curacao
        * `America/Danmarkshavn` - America/Danmarkshavn
        * `America/Dawson` - America/Dawson
        * `America/Dawson_Creek` - America/Dawson_Creek
        * `America/Denver` - America/Denver
        * `America/Detroit` - America/Detroit
        * `America/Dominica` - America/Dominica
        * `America/Edmonton` - America/Edmonton
        * `America/Eirunepe` - America/Eirunepe
        * `America/El_Salvador` - America/El_Salvador
        * `America/Fort_Nelson` - America/Fort_Nelson
        * `America/Fortaleza` - America/Fortaleza
        * `America/Glace_Bay` - America/Glace_Bay
        * `America/Goose_Bay` - America/Goose_Bay
        * `America/Grand_Turk` - America/Grand_Turk
        * `America/Grenada` - America/Grenada
        * `America/Guadeloupe` - America/Guadeloupe
        * `America/Guatemala` - America/Guatemala
        * `America/Guayaquil` - America/Guayaquil
        * `America/Guyana` - America/Guyana
        * `America/Halifax` - America/Halifax
        * `America/Havana` - America/Havana
        * `America/Hermosillo` - America/Hermosillo
        * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
        * `America/Indiana/Knox` - America/Indiana/Knox
        * `America/Indiana/Marengo` - America/Indiana/Marengo
        * `America/Indiana/Petersburg` - America/Indiana/Petersburg
        * `America/Indiana/Tell_City` - America/Indiana/Tell_City
        * `America/Indiana/Vevay` - America/Indiana/Vevay
        * `America/Indiana/Vincennes` - America/Indiana/Vincennes
        * `America/Indiana/Winamac` - America/Indiana/Winamac
        * `America/Inuvik` - America/Inuvik
        * `America/Iqaluit` - America/Iqaluit
        * `America/Jamaica` - America/Jamaica
        * `America/Juneau` - America/Juneau
        * `America/Kentucky/Louisville` - America/Kentucky/Louisville
        * `America/Kentucky/Monticello` - America/Kentucky/Monticello
        * `America/Kralendijk` - America/Kralendijk
        * `America/La_Paz` - America/La_Paz
        * `America/Lima` - America/Lima
        * `America/Los_Angeles` - America/Los_Angeles
        * `America/Lower_Princes` - America/Lower_Princes
        * `America/Maceio` - America/Maceio
        * `America/Managua` - America/Managua
        * `America/Manaus` - America/Manaus
        * `America/Marigot` - America/Marigot
        * `America/Martinique` - America/Martinique
        * `America/Matamoros` - America/Matamoros
        * `America/Mazatlan` - America/Mazatlan
        * `America/Menominee` - America/Menominee
        * `America/Merida` - America/Merida
        * `America/Metlakatla` - America/Metlakatla
        * `America/Mexico_City` - America/Mexico_City
        * `America/Miquelon` - America/Miquelon
        * `America/Moncton` - America/Moncton
        * `America/Monterrey` - America/Monterrey
        * `America/Montevideo` - America/Montevideo
        * `America/Montserrat` - America/Montserrat
        * `America/Nassau` - America/Nassau
        * `America/New_York` - America/New_York
        * `America/Nome` - America/Nome
        * `America/Noronha` - America/Noronha
        * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
        * `America/North_Dakota/Center` - America/North_Dakota/Center
        * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
        * `America/Nuuk` - America/Nuuk
        * `America/Ojinaga` - America/Ojinaga
        * `America/Panama` - America/Panama
        * `America/Paramaribo` - America/Paramaribo
        * `America/Phoenix` - America/Phoenix
        * `America/Port-au-Prince` - America/Port-au-Prince
        * `America/Port_of_Spain` - America/Port_of_Spain
        * `America/Porto_Velho` - America/Porto_Velho
        * `America/Puerto_Rico` - America/Puerto_Rico
        * `America/Punta_Arenas` - America/Punta_Arenas
        * `America/Rankin_Inlet` - America/Rankin_Inlet
        * `America/Recife` - America/Recife
        * `America/Regina` - America/Regina
        * `America/Resolute` - America/Resolute
        * `America/Rio_Branco` - America/Rio_Branco
        * `America/Santarem` - America/Santarem
        * `America/Santiago` - America/Santiago
        * `America/Santo_Domingo` - America/Santo_Domingo
        * `America/Sao_Paulo` - America/Sao_Paulo
        * `America/Scoresbysund` - America/Scoresbysund
        * `America/Sitka` - America/Sitka
        * `America/St_Barthelemy` - America/St_Barthelemy
        * `America/St_Johns` - America/St_Johns
        * `America/St_Kitts` - America/St_Kitts
        * `America/St_Lucia` - America/St_Lucia
        * `America/St_Thomas` - America/St_Thomas
        * `America/St_Vincent` - America/St_Vincent
        * `America/Swift_Current` - America/Swift_Current
        * `America/Tegucigalpa` - America/Tegucigalpa
        * `America/Thule` - America/Thule
        * `America/Tijuana` - America/Tijuana
        * `America/Toronto` - America/Toronto
        * `America/Tortola` - America/Tortola
        * `America/Vancouver` - America/Vancouver
        * `America/Whitehorse` - America/Whitehorse
        * `America/Winnipeg` - America/Winnipeg
        * `America/Yakutat` - America/Yakutat
        * `Antarctica/Casey` - Antarctica/Casey
        * `Antarctica/Davis` - Antarctica/Davis
        * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
        * `Antarctica/Macquarie` - Antarctica/Macquarie
        * `Antarctica/Mawson` - Antarctica/Mawson
        * `Antarctica/McMurdo` - Antarctica/McMurdo
        * `Antarctica/Palmer` - Antarctica/Palmer
        * `Antarctica/Rothera` - Antarctica/Rothera
        * `Antarctica/Syowa` - Antarctica/Syowa
        * `Antarctica/Troll` - Antarctica/Troll
        * `Antarctica/Vostok` - Antarctica/Vostok
        * `Arctic/Longyearbyen` - Arctic/Longyearbyen
        * `Asia/Aden` - Asia/Aden
        * `Asia/Almaty` - Asia/Almaty
        * `Asia/Amman` - Asia/Amman
        * `Asia/Anadyr` - Asia/Anadyr
        * `Asia/Aqtau` - Asia/Aqtau
        * `Asia/Aqtobe` - Asia/Aqtobe
        * `Asia/Ashgabat` - Asia/Ashgabat
        * `Asia/Atyrau` - Asia/Atyrau
        * `Asia/Baghdad` - Asia/Baghdad
        * `Asia/Bahrain` - Asia/Bahrain
        * `Asia/Baku` - Asia/Baku
        * `Asia/Bangkok` - Asia/Bangkok
        * `Asia/Barnaul` - Asia/Barnaul
        * `Asia/Beirut` - Asia/Beirut
        * `Asia/Bishkek` - Asia/Bishkek
        * `Asia/Brunei` - Asia/Brunei
        * `Asia/Chita` - Asia/Chita
        * `Asia/Colombo` - Asia/Colombo
        * `Asia/Damascus` - Asia/Damascus
        * `Asia/Dhaka` - Asia/Dhaka
        * `Asia/Dili` - Asia/Dili
        * `Asia/Dubai` - Asia/Dubai
        * `Asia/Dushanbe` - Asia/Dushanbe
        * `Asia/Famagusta` - Asia/Famagusta
        * `Asia/Gaza` - Asia/Gaza
        * `Asia/Hebron` - Asia/Hebron
        * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
        * `Asia/Hong_Kong` - Asia/Hong_Kong
        * `Asia/Hovd` - Asia/Hovd
        * `Asia/Irkutsk` - Asia/Irkutsk
        * `Asia/Jakarta` - Asia/Jakarta
        * `Asia/Jayapura` - Asia/Jayapura
        * `Asia/Jerusalem` - Asia/Jerusalem
        * `Asia/Kabul` - Asia/Kabul
        * `Asia/Kamchatka` - Asia/Kamchatka
        * `Asia/Karachi` - Asia/Karachi
        * `Asia/Kathmandu` - Asia/Kathmandu
        * `Asia/Khandyga` - Asia/Khandyga
        * `Asia/Kolkata` - Asia/Kolkata
        * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
        * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
        * `Asia/Kuching` - Asia/Kuching
        * `Asia/Kuwait` - Asia/Kuwait
        * `Asia/Macau` - Asia/Macau
        * `Asia/Magadan` - Asia/Magadan
        * `Asia/Makassar` - Asia/Makassar
        * `Asia/Manila` - Asia/Manila
        * `Asia/Muscat` - Asia/Muscat
        * `Asia/Nicosia` - Asia/Nicosia
        * `Asia/Novokuznetsk` - Asia/Novokuznetsk
        * `Asia/Novosibirsk` - Asia/Novosibirsk
        * `Asia/Omsk` - Asia/Omsk
        * `Asia/Oral` - Asia/Oral
        * `Asia/Phnom_Penh` - Asia/Phnom_Penh
        * `Asia/Pontianak` - Asia/Pontianak
        * `Asia/Pyongyang` - Asia/Pyongyang
        * `Asia/Qatar` - Asia/Qatar
        * `Asia/Qostanay` - Asia/Qostanay
        * `Asia/Qyzylorda` - Asia/Qyzylorda
        * `Asia/Riyadh` - Asia/Riyadh
        * `Asia/Sakhalin` - Asia/Sakhalin
        * `Asia/Samarkand` - Asia/Samarkand
        * `Asia/Seoul` - Asia/Seoul
        * `Asia/Shanghai` - Asia/Shanghai
        * `Asia/Singapore` - Asia/Singapore
        * `Asia/Srednekolymsk` - Asia/Srednekolymsk
        * `Asia/Taipei` - Asia/Taipei
        * `Asia/Tashkent` - Asia/Tashkent
        * `Asia/Tbilisi` - Asia/Tbilisi
        * `Asia/Tehran` - Asia/Tehran
        * `Asia/Thimphu` - Asia/Thimphu
        * `Asia/Tokyo` - Asia/Tokyo
        * `Asia/Tomsk` - Asia/Tomsk
        * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
        * `Asia/Urumqi` - Asia/Urumqi
        * `Asia/Ust-Nera` - Asia/Ust-Nera
        * `Asia/Vientiane` - Asia/Vientiane
        * `Asia/Vladivostok` - Asia/Vladivostok
        * `Asia/Yakutsk` - Asia/Yakutsk
        * `Asia/Yangon` - Asia/Yangon
        * `Asia/Yekaterinburg` - Asia/Yekaterinburg
        * `Asia/Yerevan` - Asia/Yerevan
        * `Atlantic/Azores` - Atlantic/Azores
        * `Atlantic/Bermuda` - Atlantic/Bermuda
        * `Atlantic/Canary` - Atlantic/Canary
        * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
        * `Atlantic/Faroe` - Atlantic/Faroe
        * `Atlantic/Madeira` - Atlantic/Madeira
        * `Atlantic/Reykjavik` - Atlantic/Reykjavik
        * `Atlantic/South_Georgia` - Atlantic/South_Georgia
        * `Atlantic/St_Helena` - Atlantic/St_Helena
        * `Atlantic/Stanley` - Atlantic/Stanley
        * `Australia/Adelaide` - Australia/Adelaide
        * `Australia/Brisbane` - Australia/Brisbane
        * `Australia/Broken_Hill` - Australia/Broken_Hill
        * `Australia/Darwin` - Australia/Darwin
        * `Australia/Eucla` - Australia/Eucla
        * `Australia/Hobart` - Australia/Hobart
        * `Australia/Lindeman` - Australia/Lindeman
        * `Australia/Lord_Howe` - Australia/Lord_Howe
        * `Australia/Melbourne` - Australia/Melbourne
        * `Australia/Perth` - Australia/Perth
        * `Australia/Sydney` - Australia/Sydney
        * `Europe/Amsterdam` - Europe/Amsterdam
        * `Europe/Andorra` - Europe/Andorra
        * `Europe/Astrakhan` - Europe/Astrakhan
        * `Europe/Athens` - Europe/Athens
        * `Europe/Belgrade` - Europe/Belgrade
        * `Europe/Berlin` - Europe/Berlin
        * `Europe/Bratislava` - Europe/Bratislava
        * `Europe/Brussels` - Europe/Brussels
        * `Europe/Bucharest` - Europe/Bucharest
        * `Europe/Budapest` - Europe/Budapest
        * `Europe/Busingen` - Europe/Busingen
        * `Europe/Chisinau` - Europe/Chisinau
        * `Europe/Copenhagen` - Europe/Copenhagen
        * `Europe/Dublin` - Europe/Dublin
        * `Europe/Gibraltar` - Europe/Gibraltar
        * `Europe/Guernsey` - Europe/Guernsey
        * `Europe/Helsinki` - Europe/Helsinki
        * `Europe/Isle_of_Man` - Europe/Isle_of_Man
        * `Europe/Istanbul` - Europe/Istanbul
        * `Europe/Jersey` - Europe/Jersey
        * `Europe/Kaliningrad` - Europe/Kaliningrad
        * `Europe/Kirov` - Europe/Kirov
        * `Europe/Kyiv` - Europe/Kyiv
        * `Europe/Lisbon` - Europe/Lisbon
        * `Europe/Ljubljana` - Europe/Ljubljana
        * `Europe/London` - Europe/London
        * `Europe/Luxembourg` - Europe/Luxembourg
        * `Europe/Madrid` - Europe/Madrid
        * `Europe/Malta` - Europe/Malta
        * `Europe/Mariehamn` - Europe/Mariehamn
        * `Europe/Minsk` - Europe/Minsk
        * `Europe/Monaco` - Europe/Monaco
        * `Europe/Moscow` - Europe/Moscow
        * `Europe/Oslo` - Europe/Oslo
        * `Europe/Paris` - Europe/Paris
        * `Europe/Podgorica` - Europe/Podgorica
        * `Europe/Prague` - Europe/Prague
        * `Europe/Riga` - Europe/Riga
        * `Europe/Rome` - Europe/Rome
        * `Europe/Samara` - Europe/Samara
        * `Europe/San_Marino` - Europe/San_Marino
        * `Europe/Sarajevo` - Europe/Sarajevo
        * `Europe/Saratov` - Europe/Saratov
        * `Europe/Simferopol` - Europe/Simferopol
        * `Europe/Skopje` - Europe/Skopje
        * `Europe/Sofia` - Europe/Sofia
        * `Europe/Stockholm` - Europe/Stockholm
        * `Europe/Tallinn` - Europe/Tallinn
        * `Europe/Tirane` - Europe/Tirane
        * `Europe/Ulyanovsk` - Europe/Ulyanovsk
        * `Europe/Vaduz` - Europe/Vaduz
        * `Europe/Vatican` - Europe/Vatican
        * `Europe/Vienna` - Europe/Vienna
        * `Europe/Vilnius` - Europe/Vilnius
        * `Europe/Volgograd` - Europe/Volgograd
        * `Europe/Warsaw` - Europe/Warsaw
        * `Europe/Zagreb` - Europe/Zagreb
        * `Europe/Zurich` - Europe/Zurich
        * `GMT` - GMT
        * `Indian/Antananarivo` - Indian/Antananarivo
        * `Indian/Chagos` - Indian/Chagos
        * `Indian/Christmas` - Indian/Christmas
        * `Indian/Cocos` - Indian/Cocos
        * `Indian/Comoro` - Indian/Comoro
        * `Indian/Kerguelen` - Indian/Kerguelen
        * `Indian/Mahe` - Indian/Mahe
        * `Indian/Maldives` - Indian/Maldives
        * `Indian/Mauritius` - Indian/Mauritius
        * `Indian/Mayotte` - Indian/Mayotte
        * `Indian/Reunion` - Indian/Reunion
        * `Pacific/Apia` - Pacific/Apia
        * `Pacific/Auckland` - Pacific/Auckland
        * `Pacific/Bougainville` - Pacific/Bougainville
        * `Pacific/Chatham` - Pacific/Chatham
        * `Pacific/Chuuk` - Pacific/Chuuk
        * `Pacific/Easter` - Pacific/Easter
        * `Pacific/Efate` - Pacific/Efate
        * `Pacific/Fakaofo` - Pacific/Fakaofo
        * `Pacific/Fiji` - Pacific/Fiji
        * `Pacific/Funafuti` - Pacific/Funafuti
        * `Pacific/Galapagos` - Pacific/Galapagos
        * `Pacific/Gambier` - Pacific/Gambier
        * `Pacific/Guadalcanal` - Pacific/Guadalcanal
        * `Pacific/Guam` - Pacific/Guam
        * `Pacific/Honolulu` - Pacific/Honolulu
        * `Pacific/Kanton` - Pacific/Kanton
        * `Pacific/Kiritimati` - Pacific/Kiritimati
        * `Pacific/Kosrae` - Pacific/Kosrae
        * `Pacific/Kwajalein` - Pacific/Kwajalein
        * `Pacific/Majuro` - Pacific/Majuro
        * `Pacific/Marquesas` - Pacific/Marquesas
        * `Pacific/Midway` - Pacific/Midway
        * `Pacific/Nauru` - Pacific/Nauru
        * `Pacific/Niue` - Pacific/Niue
        * `Pacific/Norfolk` - Pacific/Norfolk
        * `Pacific/Noumea` - Pacific/Noumea
        * `Pacific/Pago_Pago` - Pacific/Pago_Pago
        * `Pacific/Palau` - Pacific/Palau
        * `Pacific/Pitcairn` - Pacific/Pitcairn
        * `Pacific/Pohnpei` - Pacific/Pohnpei
        * `Pacific/Port_Moresby` - Pacific/Port_Moresby
        * `Pacific/Rarotonga` - Pacific/Rarotonga
        * `Pacific/Saipan` - Pacific/Saipan
        * `Pacific/Tahiti` - Pacific/Tahiti
        * `Pacific/Tarawa` - Pacific/Tarawa
        * `Pacific/Tongatapu` - Pacific/Tongatapu
        * `Pacific/Wake` - Pacific/Wake
        * `Pacific/Wallis` - Pacific/Wallis
        * `UTC` - UTC
    Location:
      type: object
      description: |-
        Location information serializer.

        Provides location details including:
        - Basic location information
        - Client and division relationships
        - Custom field values
      properties:
        id:
          type: integer
          readOnly: true
        client:
          type: integer
        client_name:
          type: string
          readOnly: true
        division:
          type: integer
        division_name:
          type: string
          readOnly: true
        site_name:
          type: string
          maxLength: 255
        address:
          type: string
        state:
          type: string
          maxLength: 100
        country:
          type: string
          maxLength: 100
        custom_field_values:
          type: array
          items:
            $ref: '#/components/schemas/LocationCustomFieldValue'
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - address
      - client
      - client_name
      - country
      - created_date
      - custom_field_values
      - division
      - division_name
      - id
      - modified_date
      - site_name
      - state
    LocationCustomFieldValue:
      type: object
      description: |-
        Custom field value serializer.

        Provides dynamic field values with type-aware serialization.
      properties:
        field_name:
          type: string
          readOnly: true
        field_type:
          type: string
          readOnly: true
        value:
          type: string
          readOnly: true
      required:
      - field_name
      - field_type
      - value
    LocationRequest:
      type: object
      description: |-
        Location information serializer.

        Provides location details including:
        - Basic location information
        - Client and division relationships
        - Custom field values
      properties:
        client:
          type: integer
        division:
          type: integer
        site_name:
          type: string
          minLength: 1
          maxLength: 255
        address:
          type: string
          minLength: 1
        state:
          type: string
          minLength: 1
          maxLength: 100
        country:
          type: string
          minLength: 1
          maxLength: 100
      required:
      - address
      - client
      - country
      - division
      - site_name
      - state
    LocationSet:
      type: object
      description: |-
        Location set information serializer with automatic version numbering.

        Provides location set details including:
        - Automatically assigned version number (integer)
        - Version metadata and creation date
        - Custom field definitions
        - Location count and aggregations

        Version Numbering:
        - Version numbers are automatically assigned as sequential integers (1, 2, 3, etc.)
        - Version field is read-only and cannot be manually set
        - Versions are unique within each location tool
        - Proper numerical sorting is supported (1, 2, 10 not 1, 10, 2)
      properties:
        id:
          type: integer
          readOnly: true
        version:
          type: integer
          readOnly: true
          description: Automatically assigned sequential version number (1, 2, 3,
            etc.)
        name:
          type: string
          description: Display name for this version (automatically generated)
          maxLength: 255
        description:
          type: string
          description: Optional description of this version
        is_active:
          type: boolean
          description: Whether this version is active
        location_count:
          type: string
          readOnly: true
        custom_field_definitions:
          type: array
          items:
            $ref: '#/components/schemas/CustomFieldDefinition'
          readOnly: true
        count_field_aggregations:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
          description: When this version was created
      required:
      - count_field_aggregations
      - created_date
      - custom_field_definitions
      - id
      - location_count
      - name
      - version
    LocationSetRequest:
      type: object
      description: |-
        Location set information serializer with automatic version numbering.

        Provides location set details including:
        - Automatically assigned version number (integer)
        - Version metadata and creation date
        - Custom field definitions
        - Location count and aggregations

        Version Numbering:
        - Version numbers are automatically assigned as sequential integers (1, 2, 3, etc.)
        - Version field is read-only and cannot be manually set
        - Versions are unique within each location tool
        - Proper numerical sorting is supported (1, 2, 10 not 1, 10, 2)
      properties:
        name:
          type: string
          minLength: 1
          description: Display name for this version (automatically generated)
          maxLength: 255
        description:
          type: string
          description: Optional description of this version
        is_active:
          type: boolean
          description: Whether this version is active
      required:
      - name
    LocationTableSource:
      type: object
      description: |-
        Location table source configuration serializer.

        Provides table source configuration including:
        - Field selection settings
        - Schema generation
        - Data access information
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        include_client:
          type: boolean
        include_division:
          type: boolean
        include_site_name:
          type: boolean
        include_address:
          type: boolean
        include_state:
          type: boolean
        include_country:
          type: boolean
        selected_custom_fields:
          type: array
          items:
            type: integer
        schema:
          type: string
          readOnly: true
        data_preview:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - data_preview
      - id
      - modified_date
      - name
      - schema
    LocationTableSourceRequest:
      type: object
      description: |-
        Location table source configuration serializer.

        Provides table source configuration including:
        - Field selection settings
        - Schema generation
        - Data access information
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        include_client:
          type: boolean
        include_division:
          type: boolean
        include_site_name:
          type: boolean
        include_address:
          type: boolean
        include_state:
          type: boolean
        include_country:
          type: boolean
        selected_custom_fields:
          type: array
          items:
            type: integer
      required:
      - name
    MediaCollection:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        items:
          type: array
          items:
            $ref: '#/components/schemas/MediaItem'
          readOnly: true
        item_count:
          type: string
          readOnly: true
      required:
      - id
      - item_count
      - items
      - name
    MediaCollectionRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
      required:
      - name
    MediaItem:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        file:
          type: string
          format: uri
          pattern: (?:jpg|jpeg|png|gif|svg|emf|pdf|docx|xlsx|pptx)$
        file_url:
          type: string
          readOnly: true
        preview_url:
          type: string
          readOnly: true
        file_size:
          type: integer
          readOnly: true
          nullable: true
          description: File size in bytes
        size_mb:
          type: string
          readOnly: true
        mime_type:
          type: string
          readOnly: true
        type:
          $ref: '#/components/schemas/MediaItemTypeEnum'
        description:
          type: string
        tags:
          type: string
          description: Comma-separated tags for searching
          maxLength: 500
        tag_list:
          type: string
          readOnly: true
        rating:
          type: integer
          maximum: 5
          minimum: 0
          description: Star rating 0-5
        is_logo:
          type: boolean
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - file
      - file_size
      - file_url
      - id
      - mime_type
      - modified_date
      - name
      - preview_url
      - size_mb
      - tag_list
    MediaItemRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        file:
          type: string
          format: binary
          pattern: (?:jpg|jpeg|png|gif|svg|emf|pdf|docx|xlsx|pptx)$
        type:
          $ref: '#/components/schemas/MediaItemTypeEnum'
        description:
          type: string
        tags:
          type: string
          description: Comma-separated tags for searching
          maxLength: 500
        rating:
          type: integer
          maximum: 5
          minimum: 0
          description: Star rating 0-5
        is_logo:
          type: boolean
      required:
      - file
      - name
    MediaItemTypeEnum:
      enum:
      - image
      - document
      - presentation
      - spreadsheet
      - logo
      - contact
      type: string
      description: |-
        * `image` - Image
        * `document` - Document
        * `presentation` - Presentation
        * `spreadsheet` - Spreadsheet
        * `logo` - Logo
        * `contact` - Contact
    Milestone:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        date:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/MilestoneStatusEnum'
        milestone_type:
          $ref: '#/components/schemas/MilestoneTypeEnum'
        priority:
          $ref: '#/components/schemas/MilestonePriorityEnum'
        progress:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Completion percentage (0-100)
        assignee:
          type: integer
          nullable: true
        assignee_name:
          type: string
          readOnly: true
        acceptance_criteria:
          type: string
          description: Define what needs to be completed for this milestone
        weeks_from_reference:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          nullable: true
        reference_milestone:
          type: integer
          nullable: true
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        is_completed:
          type: string
          readOnly: true
        is_today:
          type: string
          readOnly: true
        status_color:
          type: string
          readOnly: true
      required:
      - assignee_name
      - date
      - id
      - is_completed
      - is_today
      - name
      - order
      - status_color
    MilestonePriorityEnum:
      enum:
      - high
      - medium
      - low
      type: string
      description: |-
        * `high` - High
        * `medium` - Medium
        * `low` - Low
    MilestoneRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        date:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/MilestoneStatusEnum'
        milestone_type:
          $ref: '#/components/schemas/MilestoneTypeEnum'
        priority:
          $ref: '#/components/schemas/MilestonePriorityEnum'
        progress:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Completion percentage (0-100)
        assignee:
          type: integer
          nullable: true
        acceptance_criteria:
          type: string
          description: Define what needs to be completed for this milestone
        weeks_from_reference:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          nullable: true
        reference_milestone:
          type: integer
          nullable: true
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
      required:
      - date
      - name
      - order
    MilestoneStatusEnum:
      enum:
      - not_started
      - in_progress
      - completed
      - overdue
      - on_hold
      type: string
      description: |-
        * `not_started` - Not Started
        * `in_progress` - In Progress
        * `completed` - Completed
        * `overdue` - Overdue
        * `on_hold` - On Hold
    MilestoneTypeEnum:
      enum:
      - deliverable
      - review
      - decision
      - checkpoint
      - other
      type: string
      description: |-
        * `deliverable` - Deliverable
        * `review` - Review
        * `decision` - Decision Point
        * `checkpoint` - Checkpoint
        * `other` - Other
    NullEnum:
      enum:
      - null
    OperationEnum:
      enum:
      - delete
      - update_state
      - update_country
      - export
      type: string
      description: |-
        * `delete` - Delete
        * `update_state` - Update State
        * `update_country` - Update Country
        * `export` - Export
    Opportunity:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        notes:
          type: string
          description: Opportunity notes and details with URL support
        stage:
          $ref: '#/components/schemas/StageEnum'
        status:
          $ref: '#/components/schemas/OpportunityStatusEnum'
        is_rfp:
          type: boolean
          title: Is this an RFP?
          description: Check if this opportunity involves an RFP process
        client:
          allOf:
          - $ref: '#/components/schemas/Client'
          readOnly: true
        competitors:
          type: array
          items:
            $ref: '#/components/schemas/Vendor'
          readOnly: true
        incumbent_vendor:
          allOf:
          - $ref: '#/components/schemas/Vendor'
          readOnly: true
        one_time_revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        annual_revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        one_time_margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        annual_margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        term_years:
          allOf:
          - $ref: '#/components/schemas/TermYearsEnum'
          description: |-
            Contract term in years

            * `1` - 1 Year
            * `2` - 2 Years
            * `3` - 3 Years
            * `4` - 4 Years
            * `5` - 5 Years
          minimum: -2147483648
          maximum: 2147483647
        currency:
          type: string
          readOnly: true
        value:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        expected_close_date:
          type: string
          format: date
          nullable: true
        close_date:
          type: string
          format: date
          nullable: true
        deal_registered:
          type: boolean
          description: Has this deal been registered with the vendor?
        registered_vendor:
          allOf:
          - $ref: '#/components/schemas/Vendor'
          readOnly: true
        deal_registration_name:
          type: string
          description: Deal registration identifier or name
          maxLength: 255
        deal_registration_url:
          type: string
          format: uri
          description: Link to deal registration portal or details
          maxLength: 200
        deal_registration_date:
          type: string
          format: date
          nullable: true
          description: Date the deal was registered with vendor
        deal_registration_expiry:
          type: string
          format: date
          nullable: true
          description: Expiration date for deal registration
        deal_registration_amount:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          description: Monetary value of the deal registration
        opportunity_identified_date:
          type: string
          format: date
          nullable: true
          description: Date when opportunity was first identified
        rfp_release_date:
          type: string
          format: date
          nullable: true
          description: Date RFP was officially released
        rfp_vendor_info_session_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP vendor information session date and time
        rfp_vendor_questions_due_datetime:
          type: string
          format: date-time
          nullable: true
          description: Deadline for vendors to submit questions
        rfp_due_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP submission deadline
        rfp_presentation_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP presentation date and time
        rfp_award_announcement_date:
          type: string
          format: date
          nullable: true
          description: Date RFP award will be announced
      required:
      - client
      - competitors
      - currency
      - id
      - incumbent_vendor
      - name
      - registered_vendor
      - stage
      - status
    OpportunityRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        notes:
          type: string
          minLength: 1
          description: Opportunity notes and details with URL support
        stage:
          $ref: '#/components/schemas/StageEnum'
        status:
          $ref: '#/components/schemas/OpportunityStatusEnum'
        is_rfp:
          type: boolean
          title: Is this an RFP?
          description: Check if this opportunity involves an RFP process
        client_id:
          type: integer
          writeOnly: true
        primary_vendor_solution_id:
          type: integer
          writeOnly: true
        competitor_ids:
          type: array
          items:
            type: integer
          writeOnly: true
          description: List of competitor vendor IDs
        incumbent_vendor_id:
          type: integer
          writeOnly: true
          description: Incumbent vendor ID
        one_time_revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        annual_revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        one_time_margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        annual_margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        term_years:
          allOf:
          - $ref: '#/components/schemas/TermYearsEnum'
          description: |-
            Contract term in years

            * `1` - 1 Year
            * `2` - 2 Years
            * `3` - 3 Years
            * `4` - 4 Years
            * `5` - 5 Years
          minimum: -2147483648
          maximum: 2147483647
        currency_id:
          type: string
          writeOnly: true
          minLength: 1
          description: Currency code (e.g., USD, EUR)
        value:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        expected_close_date:
          type: string
          format: date
          nullable: true
        close_date:
          type: string
          format: date
          nullable: true
        deal_registered:
          type: boolean
          description: Has this deal been registered with the vendor?
        registered_vendor_id:
          type: integer
          writeOnly: true
          description: Registered vendor ID
        deal_registration_name:
          type: string
          description: Deal registration identifier or name
          maxLength: 255
        deal_registration_url:
          type: string
          format: uri
          description: Link to deal registration portal or details
          maxLength: 200
        deal_registration_date:
          type: string
          format: date
          nullable: true
          description: Date the deal was registered with vendor
        deal_registration_expiry:
          type: string
          format: date
          nullable: true
          description: Expiration date for deal registration
        deal_registration_amount:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          description: Monetary value of the deal registration
        opportunity_identified_date:
          type: string
          format: date
          nullable: true
          description: Date when opportunity was first identified
        rfp_release_date:
          type: string
          format: date
          nullable: true
          description: Date RFP was officially released
        rfp_vendor_info_session_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP vendor information session date and time
        rfp_vendor_questions_due_datetime:
          type: string
          format: date-time
          nullable: true
          description: Deadline for vendors to submit questions
        rfp_due_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP submission deadline
        rfp_presentation_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP presentation date and time
        rfp_award_announcement_date:
          type: string
          format: date
          nullable: true
          description: Date RFP award will be announced
      required:
      - client_id
      - name
      - stage
      - status
    OpportunityStatusEnum:
      enum:
      - Active
      - Won
      - Lost
      - Dropped
      type: string
      description: |-
        * `Active` - Active
        * `Won` - Won
        * `Lost` - Lost
        * `Dropped` - Dropped
    OrgChart:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        root_contact:
          type: integer
        root_contact_name:
          type: string
          readOnly: true
        depth:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        include_fields: {}
        title:
          type: string
          maxLength: 255
        description:
          type: string
        chart_data:
          type: string
          readOnly: true
      required:
      - chart_data
      - id
      - root_contact
      - root_contact_name
      - title
    OrgChartRequest:
      type: object
      properties:
        root_contact:
          type: integer
        depth:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        include_fields: {}
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
      required:
      - root_contact
      - title
    Organization:
      type: object
      description: |-
        Organization information serializer.

        Provides organization details including:
        - Basic information (name, type, sector)
        - Contact and location details
        - Financial information
        - Hierarchy relationships
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        legal_name:
          type: string
          maxLength: 255
        abbreviated_name:
          type: string
          maxLength: 50
        type:
          $ref: '#/components/schemas/OrganizationTypeEnum'
        sector:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/SectorEnum'
          - $ref: '#/components/schemas/BlankEnum'
          - $ref: '#/components/schemas/NullEnum'
        country:
          type: string
          maxLength: 100
        size:
          $ref: '#/components/schemas/SizeEnum'
        employee_count:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        stock_exchange:
          type: string
          nullable: true
        stock_symbol:
          type: string
          nullable: true
          maxLength: 10
        parent_organization:
          type: integer
          nullable: true
        parent_relationship_type:
          nullable: true
          description: |-
            Type of relationship with parent organization

            * `subsidiary` - True Subsidiary
            * `controlled_affiliate` - Controlled Affiliate
            * `wholly_owned` - Wholly-Owned Subsidiary
            * `branch` - Branch
            * `agency` - Agency
            * `ministry` - Ministry/Department
            * `executive_agency` - Executive Agency
            * `regulatory_agency` - Regulatory Agency
            * `soc` - State-Owned Company
            * `gbe` - Government Business Enterprise
          oneOf:
          - $ref: '#/components/schemas/ParentRelationshipTypeEnum'
          - $ref: '#/components/schemas/BlankEnum'
          - $ref: '#/components/schemas/NullEnum'
        has_client_profile:
          type: string
          readOnly: true
        has_vendor_profile:
          type: string
          readOnly: true
        legal_street_address:
          type: string
          maxLength: 255
        legal_city:
          type: string
          maxLength: 100
        legal_state:
          type: string
          maxLength: 100
        legal_country:
          type: string
          maxLength: 100
        legal_postal_code:
          type: string
          maxLength: 20
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - country
      - created_date
      - has_client_profile
      - has_vendor_profile
      - id
      - modified_date
      - name
      - size
      - type
    OrganizationDivision:
      type: object
      description: |-
        Organization division information serializer.

        Provides division details including:
        - Division name, abbreviation, and description
        - Organizational hierarchy (parent division)
        - Full hierarchical path
        - Contact and opportunity counts
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          description: Division name (e.g., "IT Department", "Western Region Sales")
          maxLength: 255
        abbreviation:
          type: string
          description: Short abbreviation for the division (e.g., "IT", "West")
          maxLength: 50
        description:
          type: string
          description: Description of the division's purpose and scope
        organization:
          type: integer
          description: Parent organization this division belongs to
        organization_name:
          type: string
          readOnly: true
        parent_division:
          type: integer
          nullable: true
          description: Parent division for nested organizational structures
        parent_division_name:
          type: string
          readOnly: true
          nullable: true
        full_path:
          type: string
          readOnly: true
        hierarchy_level:
          type: integer
          readOnly: true
        contact_count:
          type: string
          readOnly: true
        opportunity_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - contact_count
      - created_date
      - full_path
      - hierarchy_level
      - id
      - modified_date
      - name
      - opportunity_count
      - organization
      - organization_name
      - parent_division_name
    OrganizationDivisionRequest:
      type: object
      description: |-
        Organization division information serializer.

        Provides division details including:
        - Division name, abbreviation, and description
        - Organizational hierarchy (parent division)
        - Full hierarchical path
        - Contact and opportunity counts
      properties:
        name:
          type: string
          minLength: 1
          description: Division name (e.g., "IT Department", "Western Region Sales")
          maxLength: 255
        abbreviation:
          type: string
          description: Short abbreviation for the division (e.g., "IT", "West")
          maxLength: 50
        description:
          type: string
          description: Description of the division's purpose and scope
        organization:
          type: integer
          description: Parent organization this division belongs to
        parent_division:
          type: integer
          nullable: true
          description: Parent division for nested organizational structures
      required:
      - name
      - organization
    OrganizationTypeEnum:
      enum:
      - For-Profit
      - Non-Profit
      - Government
      - NGO
      - Educational
      - Healthcare
      - Cooperative
      type: string
      description: |-
        * `For-Profit` - For-Profit
        * `Non-Profit` - Non-Profit
        * `Government` - Government
        * `NGO` - NGO
        * `Educational` - Educational
        * `Healthcare` - Healthcare
        * `Cooperative` - Cooperative
    PaginatedAPIKeyList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/APIKey'
    PaginatedAdvisorToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/AdvisorTool'
    PaginatedAssumptionList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Assumption'
    PaginatedBMCList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/BMC'
    PaginatedBMCTemplateList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/BMCTemplate'
    PaginatedBMCToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/BMCTool'
    PaginatedCalendarEventList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/CalendarEvent'
    PaginatedClientList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Client'
    PaginatedClientLocationToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/ClientLocationTool'
    PaginatedContactList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Contact'
    PaginatedCurrencyList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Currency'
    PaginatedCustomFieldDefinitionList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/CustomFieldDefinition'
    PaginatedDeckList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Deck'
    PaginatedDeckSlideList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/DeckSlide'
    PaginatedDependencyList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Dependency'
    PaginatedDigitalContactList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/DigitalContact'
    PaginatedDigitalContactTypeList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/DigitalContactType'
    PaginatedEngagementSummaryList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/EngagementSummary'
    PaginatedFindingList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Finding'
    PaginatedFiscalYearList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/FiscalYear'
    PaginatedInterviewList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Interview'
    PaginatedIssueList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Issue'
    PaginatedLocationList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Location'
    PaginatedLocationSetList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/LocationSet'
    PaginatedLocationTableSourceList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/LocationTableSource'
    PaginatedMediaCollectionList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/MediaCollection'
    PaginatedMediaItemList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/MediaItem'
    PaginatedMilestoneList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Milestone'
    PaginatedOpportunityList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Opportunity'
    PaginatedOrgChartList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/OrgChart'
    PaginatedOrganizationDivisionList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/OrganizationDivision'
    PaginatedOrganizationList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Organization'
    PaginatedPowerPointTemplateList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/PowerPointTemplate'
    PaginatedPresentationList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Presentation'
    PaginatedPriceLineItemList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/PriceLineItem'
    PaginatedPriceVersionList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/PriceVersion'
    PaginatedPricingToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/PricingTool'
    PaginatedPrincipleList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Principle'
    PaginatedProposalList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Proposal'
    PaginatedRAIDToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/RAIDTool'
    PaginatedRecommendationList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Recommendation'
    PaginatedRequirementList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Requirement'
    PaginatedRequirementsToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/RequirementsTool'
    PaginatedRiskList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Risk'
    PaginatedStageList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Stage'
    PaginatedStakeholderList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Stakeholder'
    PaginatedStakeholderToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/StakeholderTool'
    PaginatedTEIReportFieldList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/TEIReportField'
    PaginatedTEIReportList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/TEIReport'
    PaginatedTEIToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/TEITool'
    PaginatedTableSourceList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/TableSource'
    PaginatedTagList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Tag'
    PaginatedTimelineList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Timeline'
    PaginatedTimelineToolList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/TimelineTool'
    PaginatedVendorList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Vendor'
    PaginatedVendorSolutionList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/VendorSolution'
    PaginatedWorkshopList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=4
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?page=2
        results:
          type: array
          items:
            $ref: '#/components/schemas/Workshop'
    ParentRelationshipTypeEnum:
      enum:
      - subsidiary
      - controlled_affiliate
      - wholly_owned
      - branch
      - agency
      - ministry
      - executive_agency
      - regulatory_agency
      - soc
      - gbe
      type: string
      description: |-
        * `subsidiary` - True Subsidiary
        * `controlled_affiliate` - Controlled Affiliate
        * `wholly_owned` - Wholly-Owned Subsidiary
        * `branch` - Branch
        * `agency` - Agency
        * `ministry` - Ministry/Department
        * `executive_agency` - Executive Agency
        * `regulatory_agency` - Regulatory Agency
        * `soc` - State-Owned Company
        * `gbe` - Government Business Enterprise
    PatchedAdvisorToolRequest:
      type: object
      description: Serialize an AdvisorTool with computed counts and client/association
        display fields.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        categories:
          description: Custom categories for findings and requirements
        timeframe_short:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Short timeframe in days
        timeframe_medium:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Medium timeframe in days
        timeframe_long:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Long timeframe in days
    PatchedBMCRequest:
      type: object
      properties:
        version:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        customer_segments:
          type: string
        value_propositions:
          type: string
        channels:
          type: string
        customer_relationships:
          type: string
        revenue_streams:
          type: string
        key_resources:
          type: string
        key_activities:
          type: string
        key_partnerships:
          type: string
        cost_structure:
          type: string
    PatchedBMCTemplateRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        customer_segments:
          type: string
        value_propositions:
          type: string
        channels:
          type: string
        customer_relationships:
          type: string
        revenue_streams:
          type: string
        key_resources:
          type: string
        key_activities:
          type: string
        key_partnerships:
          type: string
        cost_structure:
          type: string
        is_active:
          type: boolean
    PatchedBMCToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
    PatchedCalendarEventRequest:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        start_time:
          type: string
          format: date-time
        end_time:
          type: string
          format: date-time
        location:
          type: string
          maxLength: 255
        event_type:
          $ref: '#/components/schemas/EventTypeEnum'
    PatchedClientLocationToolRequest:
      type: object
      description: |-
        Client Location Tool serializer with automatic version management.

        Provides tool information including:
        - Basic tool metadata
        - Current version number (automatically managed)
        - All location sets with automatic version numbering
        - Table source configuration

        Automatic Version Management:
        - current_version field shows the active version number (integer)
        - location_sets array shows all versions ordered by version number
        - Version creation is handled by the create_version API endpoint
        - Version switching is handled by the switch_version API endpoint
        - All version numbers are automatically assigned and read-only
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
    PatchedClientRequest:
      type: object
      properties:
        name:
          type: string
        legal_name:
          type: string
        abbreviated_name:
          type: string
        overview:
          type: string
        history:
          type: string
        services_provided:
          type: string
        client_type:
          type: string
        vertical:
          type: string
          nullable: true
        stock_exchange:
          type: string
          nullable: true
        stock_symbol:
          type: string
          nullable: true
        employee_count:
          type: integer
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        fiscal_year_end:
          type: string
          format: date
          nullable: true
        contact_center_agent_count:
          type: integer
          nullable: true
        service_desk_agent_count:
          type: integer
          nullable: true
        supervisor_count:
          type: integer
          nullable: true
        location_count:
          type: integer
          nullable: true
        repository_url:
          type: string
    PatchedContactRequest:
      type: object
      properties:
        first_name:
          type: string
          minLength: 1
          maxLength: 100
        last_name:
          type: string
          minLength: 1
          maxLength: 100
        job_title:
          type: string
          maxLength: 100
        email:
          type: string
          format: email
          maxLength: 254
        organization_id:
          type: integer
          writeOnly: true
        reports_to:
          type: integer
          nullable: true
    PatchedCustomFieldDefinitionRequest:
      type: object
      description: |-
        Custom field definition serializer.

        Provides custom field schema information including:
        - Field name, type, and description
        - Validation rules and default values
        - Display order
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 100
        field_type:
          $ref: '#/components/schemas/CustomFieldDefinitionFieldTypeEnum'
        description:
          type: string
        is_required:
          type: boolean
        default_value:
          type: string
        order:
          type: integer
          maximum: 2147483647
          minimum: 0
    PatchedDeckRequest:
      type: object
      properties:
        presentation:
          type: integer
        template:
          type: integer
        title:
          type: string
          maxLength: 255
        subtitle:
          type: string
          maxLength: 255
        presenter:
          type: integer
          nullable: true
        status:
          $ref: '#/components/schemas/DeckStatusEnum'
        date:
          type: string
          format: date
    PatchedDeckSlideRequest:
      type: object
      properties:
        deck:
          type: integer
        slide_type:
          type: string
          minLength: 1
          maxLength: 50
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        content_mapping: {}
        content1_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content1_image:
          type: integer
          nullable: true
        content1_table:
          type: integer
          nullable: true
        content2_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content2_image:
          type: integer
          nullable: true
        content2_table:
          type: integer
          nullable: true
        content3_type:
          $ref: '#/components/schemas/Content3TypeEnum'
        content3_image:
          type: integer
          nullable: true
        content3_table:
          type: integer
          nullable: true
    PatchedDigitalContactRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 100
        contact_type_id:
          type: integer
          writeOnly: true
        url:
          type: string
          minLength: 1
          maxLength: 500
        notes:
          type: string
        client:
          type: integer
          nullable: true
        vendor:
          type: integer
          nullable: true
    PatchedEngagementRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        client_id:
          type: integer
          writeOnly: true
        opportunity_id:
          type: integer
          writeOnly: true
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/Status557Enum'
        description:
          type: string
    PatchedFindingRequest:
      type: object
      description: Serialize all Finding fields for read and write.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        source:
          $ref: '#/components/schemas/SourceEnum'
        source_detail:
          type: string
          maxLength: 255
        category:
          type: string
          maxLength: 100
        impact_level:
          $ref: '#/components/schemas/ImpactLevelEnum'
        impact_description:
          type: string
          minLength: 1
    PatchedInterviewRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        contact_id:
          type: integer
          writeOnly: true
        date:
          type: string
          format: date
        time:
          type: string
          format: time
        notes:
          type: string
    PatchedLocationRequest:
      type: object
      description: |-
        Location information serializer.

        Provides location details including:
        - Basic location information
        - Client and division relationships
        - Custom field values
      properties:
        client:
          type: integer
        division:
          type: integer
        site_name:
          type: string
          minLength: 1
          maxLength: 255
        address:
          type: string
          minLength: 1
        state:
          type: string
          minLength: 1
          maxLength: 100
        country:
          type: string
          minLength: 1
          maxLength: 100
    PatchedLocationSetRequest:
      type: object
      description: |-
        Location set information serializer with automatic version numbering.

        Provides location set details including:
        - Automatically assigned version number (integer)
        - Version metadata and creation date
        - Custom field definitions
        - Location count and aggregations

        Version Numbering:
        - Version numbers are automatically assigned as sequential integers (1, 2, 3, etc.)
        - Version field is read-only and cannot be manually set
        - Versions are unique within each location tool
        - Proper numerical sorting is supported (1, 2, 10 not 1, 10, 2)
      properties:
        name:
          type: string
          minLength: 1
          description: Display name for this version (automatically generated)
          maxLength: 255
        description:
          type: string
          description: Optional description of this version
        is_active:
          type: boolean
          description: Whether this version is active
    PatchedLocationTableSourceRequest:
      type: object
      description: |-
        Location table source configuration serializer.

        Provides table source configuration including:
        - Field selection settings
        - Schema generation
        - Data access information
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        include_client:
          type: boolean
        include_division:
          type: boolean
        include_site_name:
          type: boolean
        include_address:
          type: boolean
        include_state:
          type: boolean
        include_country:
          type: boolean
        selected_custom_fields:
          type: array
          items:
            type: integer
    PatchedMediaCollectionRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
    PatchedMediaItemRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        file:
          type: string
          format: binary
          pattern: (?:jpg|jpeg|png|gif|svg|emf|pdf|docx|xlsx|pptx)$
        type:
          $ref: '#/components/schemas/MediaItemTypeEnum'
        description:
          type: string
        tags:
          type: string
          description: Comma-separated tags for searching
          maxLength: 500
        rating:
          type: integer
          maximum: 5
          minimum: 0
          description: Star rating 0-5
        is_logo:
          type: boolean
    PatchedMilestoneRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        date:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/MilestoneStatusEnum'
        milestone_type:
          $ref: '#/components/schemas/MilestoneTypeEnum'
        priority:
          $ref: '#/components/schemas/MilestonePriorityEnum'
        progress:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Completion percentage (0-100)
        assignee:
          type: integer
          nullable: true
        acceptance_criteria:
          type: string
          description: Define what needs to be completed for this milestone
        weeks_from_reference:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          nullable: true
        reference_milestone:
          type: integer
          nullable: true
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
    PatchedOpportunityRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        notes:
          type: string
          minLength: 1
          description: Opportunity notes and details with URL support
        stage:
          $ref: '#/components/schemas/StageEnum'
        status:
          $ref: '#/components/schemas/OpportunityStatusEnum'
        is_rfp:
          type: boolean
          title: Is this an RFP?
          description: Check if this opportunity involves an RFP process
        client_id:
          type: integer
          writeOnly: true
        primary_vendor_solution_id:
          type: integer
          writeOnly: true
        competitor_ids:
          type: array
          items:
            type: integer
          writeOnly: true
          description: List of competitor vendor IDs
        incumbent_vendor_id:
          type: integer
          writeOnly: true
          description: Incumbent vendor ID
        one_time_revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        annual_revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        one_time_margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        annual_margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        term_years:
          allOf:
          - $ref: '#/components/schemas/TermYearsEnum'
          description: |-
            Contract term in years

            * `1` - 1 Year
            * `2` - 2 Years
            * `3` - 3 Years
            * `4` - 4 Years
            * `5` - 5 Years
          minimum: -2147483648
          maximum: 2147483647
        currency_id:
          type: string
          writeOnly: true
          minLength: 1
          description: Currency code (e.g., USD, EUR)
        value:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        expected_close_date:
          type: string
          format: date
          nullable: true
        close_date:
          type: string
          format: date
          nullable: true
        deal_registered:
          type: boolean
          description: Has this deal been registered with the vendor?
        registered_vendor_id:
          type: integer
          writeOnly: true
          description: Registered vendor ID
        deal_registration_name:
          type: string
          description: Deal registration identifier or name
          maxLength: 255
        deal_registration_url:
          type: string
          format: uri
          description: Link to deal registration portal or details
          maxLength: 200
        deal_registration_date:
          type: string
          format: date
          nullable: true
          description: Date the deal was registered with vendor
        deal_registration_expiry:
          type: string
          format: date
          nullable: true
          description: Expiration date for deal registration
        deal_registration_amount:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          description: Monetary value of the deal registration
        opportunity_identified_date:
          type: string
          format: date
          nullable: true
          description: Date when opportunity was first identified
        rfp_release_date:
          type: string
          format: date
          nullable: true
          description: Date RFP was officially released
        rfp_vendor_info_session_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP vendor information session date and time
        rfp_vendor_questions_due_datetime:
          type: string
          format: date-time
          nullable: true
          description: Deadline for vendors to submit questions
        rfp_due_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP submission deadline
        rfp_presentation_datetime:
          type: string
          format: date-time
          nullable: true
          description: RFP presentation date and time
        rfp_award_announcement_date:
          type: string
          format: date
          nullable: true
          description: Date RFP award will be announced
    PatchedOrgChartRequest:
      type: object
      properties:
        root_contact:
          type: integer
        depth:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        include_fields: {}
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
    PatchedOrganizationDivisionRequest:
      type: object
      description: |-
        Organization division information serializer.

        Provides division details including:
        - Division name, abbreviation, and description
        - Organizational hierarchy (parent division)
        - Full hierarchical path
        - Contact and opportunity counts
      properties:
        name:
          type: string
          minLength: 1
          description: Division name (e.g., "IT Department", "Western Region Sales")
          maxLength: 255
        abbreviation:
          type: string
          description: Short abbreviation for the division (e.g., "IT", "West")
          maxLength: 50
        description:
          type: string
          description: Description of the division's purpose and scope
        organization:
          type: integer
          description: Parent organization this division belongs to
        parent_division:
          type: integer
          nullable: true
          description: Parent division for nested organizational structures
    PatchedPowerPointTemplateRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        is_active:
          type: boolean
    PatchedPresentationRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        source_type:
          $ref: '#/components/schemas/SourceTypeEnum'
        source_id:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        date:
          type: string
          format: date
        presenter:
          type: integer
          nullable: true
    PatchedPriceLineItemRequest:
      type: object
      properties:
        vendor_solution:
          type: integer
        type:
          $ref: '#/components/schemas/PriceLineItemTypeEnum'
        billing_cycle:
          $ref: '#/components/schemas/BillingCycleEnum'
        quantity:
          type: string
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,2})?$
        cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
    PatchedPriceVersionRequest:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        currency:
          type: string
          minLength: 1
        version_number:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        notes:
          type: string
    PatchedPricingToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
    PatchedPrincipleRequest:
      type: object
      description: Serialize all Principle fields.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        weight:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Importance (1-10)
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
    PatchedProposalRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        opportunity_id:
          type: integer
          writeOnly: true
        primary_contact_id:
          type: integer
          writeOnly: true
          nullable: true
        status:
          $ref: '#/components/schemas/ProposalStatusEnum'
        due_date:
          type: string
          format: date
          nullable: true
        submitted_date:
          type: string
          format: date
          nullable: true
        repository_url:
          type: string
          format: uri
          maxLength: 200
    PatchedRecommendationRequest:
      type: object
      description: |-
        Serialize a Recommendation with nested impacts, alignments, findings, and requirements.

        ``finding_ids`` and ``requirement_ids`` are write-only; on read the full nested
        objects are returned under ``associated_findings`` / ``associated_requirements``.
        ``timeframe`` is a computed read-only field (Short / Medium / Long) derived from
        ``implementation_days`` against fixed 30- and 180-day thresholds.
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        implementation_days:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        finding_ids:
          type: array
          items:
            type: integer
          writeOnly: true
        requirement_ids:
          type: array
          items:
            type: integer
          writeOnly: true
        cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
        currency:
          type: string
          minLength: 1
        complexity:
          $ref: '#/components/schemas/ComplexityEnum'
    PatchedRequirementRequest:
      type: object
      description: Serialize a Requirement with nested findings on read and a writable
        ``related_finding_ids`` list on write.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        type:
          $ref: '#/components/schemas/RequirementTypeEnum'
        category:
          type: string
          maxLength: 100
        success_measure:
          type: string
          minLength: 1
        notes:
          type: string
        related_finding_ids:
          type: array
          items:
            type: integer
          writeOnly: true
    PatchedStageRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        color:
          type: integer
          nullable: true
          description: Stage color (editable in admin)
        status:
          $ref: '#/components/schemas/StageStatusEnum'
        progress:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Completion percentage (0-100)
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        milestone:
          type: integer
          nullable: true
          description: Optional milestone that marks the completion of this stage
    PatchedStakeholderRequest:
      type: object
      properties:
        contact_id:
          type: integer
          writeOnly: true
        tenure:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Years in current role
        solution_seek:
          type: string
        solution_avoid:
          type: string
        notes:
          type: string
        power:
          $ref: '#/components/schemas/PowerEnum'
        interest:
          $ref: '#/components/schemas/InterestEnum'
    PatchedStakeholderToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
    PatchedTEIReportFieldRequest:
      type: object
      description: Field-definition serializer.
      properties:
        table:
          $ref: '#/components/schemas/TableEnum'
        field_key:
          type: string
          minLength: 1
          description: Machine identifier, unique within report.
          maxLength: 64
          pattern: ^[-a-zA-Z0-9_]+$
        label:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        field_type:
          $ref: '#/components/schemas/TEIReportFieldFieldTypeEnum'
        category:
          type: string
          maxLength: 100
        default_value:
          type: string
          description: Pre-populated default (stored as string, cast by calculator).
          maxLength: 255
        is_annual:
          type: boolean
          description: If True, value is collected per year (Y1..YN); if False, a
            single value.
        risk_adjustment:
          type: string
          format: decimal
          pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
          nullable: true
          description: Default risk adjustment (0.0-1.0); only applied to benefit
            fields.
        sort_order:
          type: integer
          maximum: 2147483647
          minimum: 0
        is_required:
          type: boolean
        source_notes:
          type: string
    PatchedTEIReportRequest:
      type: object
      description: Report template serializer with counts and the spec-style ``id``
        alias.
      properties:
        name:
          type: string
          minLength: 1
          description: Display name (e.g., 'Amazon Connect 2026').
          maxLength: 255
        vendor:
          type: string
          minLength: 1
          description: Technology vendor (e.g., 'AWS', 'Genesys').
          maxLength: 255
        version:
          type: string
          minLength: 1
          description: Model version (e.g., '1.0', '2.1').
          maxLength: 50
        description:
          type: string
        analysis_period_years:
          type: integer
          maximum: 2147483647
          minimum: 0
          description: Number of years included in NPV/ROI (1-10).
        discount_rate:
          type: string
          format: decimal
          pattern: ^-?\d{0,2}(?:\.\d{0,4})?$
          description: Annual discount rate (e.g., 0.10 = 10%).
        status:
          $ref: '#/components/schemas/TEIReportStatusEnum'
    PatchedTEIToolUpdateRequest:
      type: object
      description: Write serializer for ``PUT /tools/{id}/`` — only name/status are
        mutable.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        status:
          $ref: '#/components/schemas/Status49eEnum'
    PatchedTagRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
    PatchedTimelineRequest:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        start_date:
          type: string
          format: date
    PatchedTimelineToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
    PatchedUserProfileRequest:
      type: object
      description: |-
        User profile serializer with preference settings.

        Provides access to user-specific configuration including:
        - Date and time format preferences
        - Timezone settings (home and local)
        - UI theme customization
      properties:
        date_format:
          allOf:
          - $ref: '#/components/schemas/DateFormatEnum'
          description: |-
            Preferred date display format

            * `YYYY-MM-DD` - 2024-12-25
            * `DD/MM/YYYY` - 25/12/2024
            * `MM/DD/YYYY` - 12/25/2024
            * `DD.MM.YYYY` - 25.12.2024
            * `DD-MM-YYYY` - 25-12-2024
        time_format:
          allOf:
          - $ref: '#/components/schemas/TimeFormatEnum'
          description: |-
            12-hour or 24-hour time format

            * `12-hour` - 12-hour (3:30 PM)
            * `24-hour` - 24-hour (15:30)
        home_timezone:
          allOf:
          - $ref: '#/components/schemas/HomeTimezoneEnum'
          description: |-
            User's home/permanent timezone

            * `Africa/Abidjan` - Africa/Abidjan
            * `Africa/Accra` - Africa/Accra
            * `Africa/Addis_Ababa` - Africa/Addis_Ababa
            * `Africa/Algiers` - Africa/Algiers
            * `Africa/Asmara` - Africa/Asmara
            * `Africa/Bamako` - Africa/Bamako
            * `Africa/Bangui` - Africa/Bangui
            * `Africa/Banjul` - Africa/Banjul
            * `Africa/Bissau` - Africa/Bissau
            * `Africa/Blantyre` - Africa/Blantyre
            * `Africa/Brazzaville` - Africa/Brazzaville
            * `Africa/Bujumbura` - Africa/Bujumbura
            * `Africa/Cairo` - Africa/Cairo
            * `Africa/Casablanca` - Africa/Casablanca
            * `Africa/Ceuta` - Africa/Ceuta
            * `Africa/Conakry` - Africa/Conakry
            * `Africa/Dakar` - Africa/Dakar
            * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
            * `Africa/Djibouti` - Africa/Djibouti
            * `Africa/Douala` - Africa/Douala
            * `Africa/El_Aaiun` - Africa/El_Aaiun
            * `Africa/Freetown` - Africa/Freetown
            * `Africa/Gaborone` - Africa/Gaborone
            * `Africa/Harare` - Africa/Harare
            * `Africa/Johannesburg` - Africa/Johannesburg
            * `Africa/Juba` - Africa/Juba
            * `Africa/Kampala` - Africa/Kampala
            * `Africa/Khartoum` - Africa/Khartoum
            * `Africa/Kigali` - Africa/Kigali
            * `Africa/Kinshasa` - Africa/Kinshasa
            * `Africa/Lagos` - Africa/Lagos
            * `Africa/Libreville` - Africa/Libreville
            * `Africa/Lome` - Africa/Lome
            * `Africa/Luanda` - Africa/Luanda
            * `Africa/Lubumbashi` - Africa/Lubumbashi
            * `Africa/Lusaka` - Africa/Lusaka
            * `Africa/Malabo` - Africa/Malabo
            * `Africa/Maputo` - Africa/Maputo
            * `Africa/Maseru` - Africa/Maseru
            * `Africa/Mbabane` - Africa/Mbabane
            * `Africa/Mogadishu` - Africa/Mogadishu
            * `Africa/Monrovia` - Africa/Monrovia
            * `Africa/Nairobi` - Africa/Nairobi
            * `Africa/Ndjamena` - Africa/Ndjamena
            * `Africa/Niamey` - Africa/Niamey
            * `Africa/Nouakchott` - Africa/Nouakchott
            * `Africa/Ouagadougou` - Africa/Ouagadougou
            * `Africa/Porto-Novo` - Africa/Porto-Novo
            * `Africa/Sao_Tome` - Africa/Sao_Tome
            * `Africa/Tripoli` - Africa/Tripoli
            * `Africa/Tunis` - Africa/Tunis
            * `Africa/Windhoek` - Africa/Windhoek
            * `America/Adak` - America/Adak
            * `America/Anchorage` - America/Anchorage
            * `America/Anguilla` - America/Anguilla
            * `America/Antigua` - America/Antigua
            * `America/Araguaina` - America/Araguaina
            * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
            * `America/Argentina/Catamarca` - America/Argentina/Catamarca
            * `America/Argentina/Cordoba` - America/Argentina/Cordoba
            * `America/Argentina/Jujuy` - America/Argentina/Jujuy
            * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
            * `America/Argentina/Mendoza` - America/Argentina/Mendoza
            * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
            * `America/Argentina/Salta` - America/Argentina/Salta
            * `America/Argentina/San_Juan` - America/Argentina/San_Juan
            * `America/Argentina/San_Luis` - America/Argentina/San_Luis
            * `America/Argentina/Tucuman` - America/Argentina/Tucuman
            * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
            * `America/Aruba` - America/Aruba
            * `America/Asuncion` - America/Asuncion
            * `America/Atikokan` - America/Atikokan
            * `America/Bahia` - America/Bahia
            * `America/Bahia_Banderas` - America/Bahia_Banderas
            * `America/Barbados` - America/Barbados
            * `America/Belem` - America/Belem
            * `America/Belize` - America/Belize
            * `America/Blanc-Sablon` - America/Blanc-Sablon
            * `America/Boa_Vista` - America/Boa_Vista
            * `America/Bogota` - America/Bogota
            * `America/Boise` - America/Boise
            * `America/Cambridge_Bay` - America/Cambridge_Bay
            * `America/Campo_Grande` - America/Campo_Grande
            * `America/Cancun` - America/Cancun
            * `America/Caracas` - America/Caracas
            * `America/Cayenne` - America/Cayenne
            * `America/Cayman` - America/Cayman
            * `America/Chicago` - America/Chicago
            * `America/Chihuahua` - America/Chihuahua
            * `America/Ciudad_Juarez` - America/Ciudad_Juarez
            * `America/Costa_Rica` - America/Costa_Rica
            * `America/Coyhaique` - America/Coyhaique
            * `America/Creston` - America/Creston
            * `America/Cuiaba` - America/Cuiaba
            * `America/Curacao` - America/Curacao
            * `America/Danmarkshavn` - America/Danmarkshavn
            * `America/Dawson` - America/Dawson
            * `America/Dawson_Creek` - America/Dawson_Creek
            * `America/Denver` - America/Denver
            * `America/Detroit` - America/Detroit
            * `America/Dominica` - America/Dominica
            * `America/Edmonton` - America/Edmonton
            * `America/Eirunepe` - America/Eirunepe
            * `America/El_Salvador` - America/El_Salvador
            * `America/Fort_Nelson` - America/Fort_Nelson
            * `America/Fortaleza` - America/Fortaleza
            * `America/Glace_Bay` - America/Glace_Bay
            * `America/Goose_Bay` - America/Goose_Bay
            * `America/Grand_Turk` - America/Grand_Turk
            * `America/Grenada` - America/Grenada
            * `America/Guadeloupe` - America/Guadeloupe
            * `America/Guatemala` - America/Guatemala
            * `America/Guayaquil` - America/Guayaquil
            * `America/Guyana` - America/Guyana
            * `America/Halifax` - America/Halifax
            * `America/Havana` - America/Havana
            * `America/Hermosillo` - America/Hermosillo
            * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
            * `America/Indiana/Knox` - America/Indiana/Knox
            * `America/Indiana/Marengo` - America/Indiana/Marengo
            * `America/Indiana/Petersburg` - America/Indiana/Petersburg
            * `America/Indiana/Tell_City` - America/Indiana/Tell_City
            * `America/Indiana/Vevay` - America/Indiana/Vevay
            * `America/Indiana/Vincennes` - America/Indiana/Vincennes
            * `America/Indiana/Winamac` - America/Indiana/Winamac
            * `America/Inuvik` - America/Inuvik
            * `America/Iqaluit` - America/Iqaluit
            * `America/Jamaica` - America/Jamaica
            * `America/Juneau` - America/Juneau
            * `America/Kentucky/Louisville` - America/Kentucky/Louisville
            * `America/Kentucky/Monticello` - America/Kentucky/Monticello
            * `America/Kralendijk` - America/Kralendijk
            * `America/La_Paz` - America/La_Paz
            * `America/Lima` - America/Lima
            * `America/Los_Angeles` - America/Los_Angeles
            * `America/Lower_Princes` - America/Lower_Princes
            * `America/Maceio` - America/Maceio
            * `America/Managua` - America/Managua
            * `America/Manaus` - America/Manaus
            * `America/Marigot` - America/Marigot
            * `America/Martinique` - America/Martinique
            * `America/Matamoros` - America/Matamoros
            * `America/Mazatlan` - America/Mazatlan
            * `America/Menominee` - America/Menominee
            * `America/Merida` - America/Merida
            * `America/Metlakatla` - America/Metlakatla
            * `America/Mexico_City` - America/Mexico_City
            * `America/Miquelon` - America/Miquelon
            * `America/Moncton` - America/Moncton
            * `America/Monterrey` - America/Monterrey
            * `America/Montevideo` - America/Montevideo
            * `America/Montserrat` - America/Montserrat
            * `America/Nassau` - America/Nassau
            * `America/New_York` - America/New_York
            * `America/Nome` - America/Nome
            * `America/Noronha` - America/Noronha
            * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
            * `America/North_Dakota/Center` - America/North_Dakota/Center
            * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
            * `America/Nuuk` - America/Nuuk
            * `America/Ojinaga` - America/Ojinaga
            * `America/Panama` - America/Panama
            * `America/Paramaribo` - America/Paramaribo
            * `America/Phoenix` - America/Phoenix
            * `America/Port-au-Prince` - America/Port-au-Prince
            * `America/Port_of_Spain` - America/Port_of_Spain
            * `America/Porto_Velho` - America/Porto_Velho
            * `America/Puerto_Rico` - America/Puerto_Rico
            * `America/Punta_Arenas` - America/Punta_Arenas
            * `America/Rankin_Inlet` - America/Rankin_Inlet
            * `America/Recife` - America/Recife
            * `America/Regina` - America/Regina
            * `America/Resolute` - America/Resolute
            * `America/Rio_Branco` - America/Rio_Branco
            * `America/Santarem` - America/Santarem
            * `America/Santiago` - America/Santiago
            * `America/Santo_Domingo` - America/Santo_Domingo
            * `America/Sao_Paulo` - America/Sao_Paulo
            * `America/Scoresbysund` - America/Scoresbysund
            * `America/Sitka` - America/Sitka
            * `America/St_Barthelemy` - America/St_Barthelemy
            * `America/St_Johns` - America/St_Johns
            * `America/St_Kitts` - America/St_Kitts
            * `America/St_Lucia` - America/St_Lucia
            * `America/St_Thomas` - America/St_Thomas
            * `America/St_Vincent` - America/St_Vincent
            * `America/Swift_Current` - America/Swift_Current
            * `America/Tegucigalpa` - America/Tegucigalpa
            * `America/Thule` - America/Thule
            * `America/Tijuana` - America/Tijuana
            * `America/Toronto` - America/Toronto
            * `America/Tortola` - America/Tortola
            * `America/Vancouver` - America/Vancouver
            * `America/Whitehorse` - America/Whitehorse
            * `America/Winnipeg` - America/Winnipeg
            * `America/Yakutat` - America/Yakutat
            * `Antarctica/Casey` - Antarctica/Casey
            * `Antarctica/Davis` - Antarctica/Davis
            * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
            * `Antarctica/Macquarie` - Antarctica/Macquarie
            * `Antarctica/Mawson` - Antarctica/Mawson
            * `Antarctica/McMurdo` - Antarctica/McMurdo
            * `Antarctica/Palmer` - Antarctica/Palmer
            * `Antarctica/Rothera` - Antarctica/Rothera
            * `Antarctica/Syowa` - Antarctica/Syowa
            * `Antarctica/Troll` - Antarctica/Troll
            * `Antarctica/Vostok` - Antarctica/Vostok
            * `Arctic/Longyearbyen` - Arctic/Longyearbyen
            * `Asia/Aden` - Asia/Aden
            * `Asia/Almaty` - Asia/Almaty
            * `Asia/Amman` - Asia/Amman
            * `Asia/Anadyr` - Asia/Anadyr
            * `Asia/Aqtau` - Asia/Aqtau
            * `Asia/Aqtobe` - Asia/Aqtobe
            * `Asia/Ashgabat` - Asia/Ashgabat
            * `Asia/Atyrau` - Asia/Atyrau
            * `Asia/Baghdad` - Asia/Baghdad
            * `Asia/Bahrain` - Asia/Bahrain
            * `Asia/Baku` - Asia/Baku
            * `Asia/Bangkok` - Asia/Bangkok
            * `Asia/Barnaul` - Asia/Barnaul
            * `Asia/Beirut` - Asia/Beirut
            * `Asia/Bishkek` - Asia/Bishkek
            * `Asia/Brunei` - Asia/Brunei
            * `Asia/Chita` - Asia/Chita
            * `Asia/Colombo` - Asia/Colombo
            * `Asia/Damascus` - Asia/Damascus
            * `Asia/Dhaka` - Asia/Dhaka
            * `Asia/Dili` - Asia/Dili
            * `Asia/Dubai` - Asia/Dubai
            * `Asia/Dushanbe` - Asia/Dushanbe
            * `Asia/Famagusta` - Asia/Famagusta
            * `Asia/Gaza` - Asia/Gaza
            * `Asia/Hebron` - Asia/Hebron
            * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
            * `Asia/Hong_Kong` - Asia/Hong_Kong
            * `Asia/Hovd` - Asia/Hovd
            * `Asia/Irkutsk` - Asia/Irkutsk
            * `Asia/Jakarta` - Asia/Jakarta
            * `Asia/Jayapura` - Asia/Jayapura
            * `Asia/Jerusalem` - Asia/Jerusalem
            * `Asia/Kabul` - Asia/Kabul
            * `Asia/Kamchatka` - Asia/Kamchatka
            * `Asia/Karachi` - Asia/Karachi
            * `Asia/Kathmandu` - Asia/Kathmandu
            * `Asia/Khandyga` - Asia/Khandyga
            * `Asia/Kolkata` - Asia/Kolkata
            * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
            * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
            * `Asia/Kuching` - Asia/Kuching
            * `Asia/Kuwait` - Asia/Kuwait
            * `Asia/Macau` - Asia/Macau
            * `Asia/Magadan` - Asia/Magadan
            * `Asia/Makassar` - Asia/Makassar
            * `Asia/Manila` - Asia/Manila
            * `Asia/Muscat` - Asia/Muscat
            * `Asia/Nicosia` - Asia/Nicosia
            * `Asia/Novokuznetsk` - Asia/Novokuznetsk
            * `Asia/Novosibirsk` - Asia/Novosibirsk
            * `Asia/Omsk` - Asia/Omsk
            * `Asia/Oral` - Asia/Oral
            * `Asia/Phnom_Penh` - Asia/Phnom_Penh
            * `Asia/Pontianak` - Asia/Pontianak
            * `Asia/Pyongyang` - Asia/Pyongyang
            * `Asia/Qatar` - Asia/Qatar
            * `Asia/Qostanay` - Asia/Qostanay
            * `Asia/Qyzylorda` - Asia/Qyzylorda
            * `Asia/Riyadh` - Asia/Riyadh
            * `Asia/Sakhalin` - Asia/Sakhalin
            * `Asia/Samarkand` - Asia/Samarkand
            * `Asia/Seoul` - Asia/Seoul
            * `Asia/Shanghai` - Asia/Shanghai
            * `Asia/Singapore` - Asia/Singapore
            * `Asia/Srednekolymsk` - Asia/Srednekolymsk
            * `Asia/Taipei` - Asia/Taipei
            * `Asia/Tashkent` - Asia/Tashkent
            * `Asia/Tbilisi` - Asia/Tbilisi
            * `Asia/Tehran` - Asia/Tehran
            * `Asia/Thimphu` - Asia/Thimphu
            * `Asia/Tokyo` - Asia/Tokyo
            * `Asia/Tomsk` - Asia/Tomsk
            * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
            * `Asia/Urumqi` - Asia/Urumqi
            * `Asia/Ust-Nera` - Asia/Ust-Nera
            * `Asia/Vientiane` - Asia/Vientiane
            * `Asia/Vladivostok` - Asia/Vladivostok
            * `Asia/Yakutsk` - Asia/Yakutsk
            * `Asia/Yangon` - Asia/Yangon
            * `Asia/Yekaterinburg` - Asia/Yekaterinburg
            * `Asia/Yerevan` - Asia/Yerevan
            * `Atlantic/Azores` - Atlantic/Azores
            * `Atlantic/Bermuda` - Atlantic/Bermuda
            * `Atlantic/Canary` - Atlantic/Canary
            * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
            * `Atlantic/Faroe` - Atlantic/Faroe
            * `Atlantic/Madeira` - Atlantic/Madeira
            * `Atlantic/Reykjavik` - Atlantic/Reykjavik
            * `Atlantic/South_Georgia` - Atlantic/South_Georgia
            * `Atlantic/St_Helena` - Atlantic/St_Helena
            * `Atlantic/Stanley` - Atlantic/Stanley
            * `Australia/Adelaide` - Australia/Adelaide
            * `Australia/Brisbane` - Australia/Brisbane
            * `Australia/Broken_Hill` - Australia/Broken_Hill
            * `Australia/Darwin` - Australia/Darwin
            * `Australia/Eucla` - Australia/Eucla
            * `Australia/Hobart` - Australia/Hobart
            * `Australia/Lindeman` - Australia/Lindeman
            * `Australia/Lord_Howe` - Australia/Lord_Howe
            * `Australia/Melbourne` - Australia/Melbourne
            * `Australia/Perth` - Australia/Perth
            * `Australia/Sydney` - Australia/Sydney
            * `Europe/Amsterdam` - Europe/Amsterdam
            * `Europe/Andorra` - Europe/Andorra
            * `Europe/Astrakhan` - Europe/Astrakhan
            * `Europe/Athens` - Europe/Athens
            * `Europe/Belgrade` - Europe/Belgrade
            * `Europe/Berlin` - Europe/Berlin
            * `Europe/Bratislava` - Europe/Bratislava
            * `Europe/Brussels` - Europe/Brussels
            * `Europe/Bucharest` - Europe/Bucharest
            * `Europe/Budapest` - Europe/Budapest
            * `Europe/Busingen` - Europe/Busingen
            * `Europe/Chisinau` - Europe/Chisinau
            * `Europe/Copenhagen` - Europe/Copenhagen
            * `Europe/Dublin` - Europe/Dublin
            * `Europe/Gibraltar` - Europe/Gibraltar
            * `Europe/Guernsey` - Europe/Guernsey
            * `Europe/Helsinki` - Europe/Helsinki
            * `Europe/Isle_of_Man` - Europe/Isle_of_Man
            * `Europe/Istanbul` - Europe/Istanbul
            * `Europe/Jersey` - Europe/Jersey
            * `Europe/Kaliningrad` - Europe/Kaliningrad
            * `Europe/Kirov` - Europe/Kirov
            * `Europe/Kyiv` - Europe/Kyiv
            * `Europe/Lisbon` - Europe/Lisbon
            * `Europe/Ljubljana` - Europe/Ljubljana
            * `Europe/London` - Europe/London
            * `Europe/Luxembourg` - Europe/Luxembourg
            * `Europe/Madrid` - Europe/Madrid
            * `Europe/Malta` - Europe/Malta
            * `Europe/Mariehamn` - Europe/Mariehamn
            * `Europe/Minsk` - Europe/Minsk
            * `Europe/Monaco` - Europe/Monaco
            * `Europe/Moscow` - Europe/Moscow
            * `Europe/Oslo` - Europe/Oslo
            * `Europe/Paris` - Europe/Paris
            * `Europe/Podgorica` - Europe/Podgorica
            * `Europe/Prague` - Europe/Prague
            * `Europe/Riga` - Europe/Riga
            * `Europe/Rome` - Europe/Rome
            * `Europe/Samara` - Europe/Samara
            * `Europe/San_Marino` - Europe/San_Marino
            * `Europe/Sarajevo` - Europe/Sarajevo
            * `Europe/Saratov` - Europe/Saratov
            * `Europe/Simferopol` - Europe/Simferopol
            * `Europe/Skopje` - Europe/Skopje
            * `Europe/Sofia` - Europe/Sofia
            * `Europe/Stockholm` - Europe/Stockholm
            * `Europe/Tallinn` - Europe/Tallinn
            * `Europe/Tirane` - Europe/Tirane
            * `Europe/Ulyanovsk` - Europe/Ulyanovsk
            * `Europe/Vaduz` - Europe/Vaduz
            * `Europe/Vatican` - Europe/Vatican
            * `Europe/Vienna` - Europe/Vienna
            * `Europe/Vilnius` - Europe/Vilnius
            * `Europe/Volgograd` - Europe/Volgograd
            * `Europe/Warsaw` - Europe/Warsaw
            * `Europe/Zagreb` - Europe/Zagreb
            * `Europe/Zurich` - Europe/Zurich
            * `GMT` - GMT
            * `Indian/Antananarivo` - Indian/Antananarivo
            * `Indian/Chagos` - Indian/Chagos
            * `Indian/Christmas` - Indian/Christmas
            * `Indian/Cocos` - Indian/Cocos
            * `Indian/Comoro` - Indian/Comoro
            * `Indian/Kerguelen` - Indian/Kerguelen
            * `Indian/Mahe` - Indian/Mahe
            * `Indian/Maldives` - Indian/Maldives
            * `Indian/Mauritius` - Indian/Mauritius
            * `Indian/Mayotte` - Indian/Mayotte
            * `Indian/Reunion` - Indian/Reunion
            * `Pacific/Apia` - Pacific/Apia
            * `Pacific/Auckland` - Pacific/Auckland
            * `Pacific/Bougainville` - Pacific/Bougainville
            * `Pacific/Chatham` - Pacific/Chatham
            * `Pacific/Chuuk` - Pacific/Chuuk
            * `Pacific/Easter` - Pacific/Easter
            * `Pacific/Efate` - Pacific/Efate
            * `Pacific/Fakaofo` - Pacific/Fakaofo
            * `Pacific/Fiji` - Pacific/Fiji
            * `Pacific/Funafuti` - Pacific/Funafuti
            * `Pacific/Galapagos` - Pacific/Galapagos
            * `Pacific/Gambier` - Pacific/Gambier
            * `Pacific/Guadalcanal` - Pacific/Guadalcanal
            * `Pacific/Guam` - Pacific/Guam
            * `Pacific/Honolulu` - Pacific/Honolulu
            * `Pacific/Kanton` - Pacific/Kanton
            * `Pacific/Kiritimati` - Pacific/Kiritimati
            * `Pacific/Kosrae` - Pacific/Kosrae
            * `Pacific/Kwajalein` - Pacific/Kwajalein
            * `Pacific/Majuro` - Pacific/Majuro
            * `Pacific/Marquesas` - Pacific/Marquesas
            * `Pacific/Midway` - Pacific/Midway
            * `Pacific/Nauru` - Pacific/Nauru
            * `Pacific/Niue` - Pacific/Niue
            * `Pacific/Norfolk` - Pacific/Norfolk
            * `Pacific/Noumea` - Pacific/Noumea
            * `Pacific/Pago_Pago` - Pacific/Pago_Pago
            * `Pacific/Palau` - Pacific/Palau
            * `Pacific/Pitcairn` - Pacific/Pitcairn
            * `Pacific/Pohnpei` - Pacific/Pohnpei
            * `Pacific/Port_Moresby` - Pacific/Port_Moresby
            * `Pacific/Rarotonga` - Pacific/Rarotonga
            * `Pacific/Saipan` - Pacific/Saipan
            * `Pacific/Tahiti` - Pacific/Tahiti
            * `Pacific/Tarawa` - Pacific/Tarawa
            * `Pacific/Tongatapu` - Pacific/Tongatapu
            * `Pacific/Wake` - Pacific/Wake
            * `Pacific/Wallis` - Pacific/Wallis
            * `UTC` - UTC
        local_timezone:
          nullable: true
          description: |-
            User's current local timezone (if traveling)

            * `Africa/Abidjan` - Africa/Abidjan
            * `Africa/Accra` - Africa/Accra
            * `Africa/Addis_Ababa` - Africa/Addis_Ababa
            * `Africa/Algiers` - Africa/Algiers
            * `Africa/Asmara` - Africa/Asmara
            * `Africa/Bamako` - Africa/Bamako
            * `Africa/Bangui` - Africa/Bangui
            * `Africa/Banjul` - Africa/Banjul
            * `Africa/Bissau` - Africa/Bissau
            * `Africa/Blantyre` - Africa/Blantyre
            * `Africa/Brazzaville` - Africa/Brazzaville
            * `Africa/Bujumbura` - Africa/Bujumbura
            * `Africa/Cairo` - Africa/Cairo
            * `Africa/Casablanca` - Africa/Casablanca
            * `Africa/Ceuta` - Africa/Ceuta
            * `Africa/Conakry` - Africa/Conakry
            * `Africa/Dakar` - Africa/Dakar
            * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
            * `Africa/Djibouti` - Africa/Djibouti
            * `Africa/Douala` - Africa/Douala
            * `Africa/El_Aaiun` - Africa/El_Aaiun
            * `Africa/Freetown` - Africa/Freetown
            * `Africa/Gaborone` - Africa/Gaborone
            * `Africa/Harare` - Africa/Harare
            * `Africa/Johannesburg` - Africa/Johannesburg
            * `Africa/Juba` - Africa/Juba
            * `Africa/Kampala` - Africa/Kampala
            * `Africa/Khartoum` - Africa/Khartoum
            * `Africa/Kigali` - Africa/Kigali
            * `Africa/Kinshasa` - Africa/Kinshasa
            * `Africa/Lagos` - Africa/Lagos
            * `Africa/Libreville` - Africa/Libreville
            * `Africa/Lome` - Africa/Lome
            * `Africa/Luanda` - Africa/Luanda
            * `Africa/Lubumbashi` - Africa/Lubumbashi
            * `Africa/Lusaka` - Africa/Lusaka
            * `Africa/Malabo` - Africa/Malabo
            * `Africa/Maputo` - Africa/Maputo
            * `Africa/Maseru` - Africa/Maseru
            * `Africa/Mbabane` - Africa/Mbabane
            * `Africa/Mogadishu` - Africa/Mogadishu
            * `Africa/Monrovia` - Africa/Monrovia
            * `Africa/Nairobi` - Africa/Nairobi
            * `Africa/Ndjamena` - Africa/Ndjamena
            * `Africa/Niamey` - Africa/Niamey
            * `Africa/Nouakchott` - Africa/Nouakchott
            * `Africa/Ouagadougou` - Africa/Ouagadougou
            * `Africa/Porto-Novo` - Africa/Porto-Novo
            * `Africa/Sao_Tome` - Africa/Sao_Tome
            * `Africa/Tripoli` - Africa/Tripoli
            * `Africa/Tunis` - Africa/Tunis
            * `Africa/Windhoek` - Africa/Windhoek
            * `America/Adak` - America/Adak
            * `America/Anchorage` - America/Anchorage
            * `America/Anguilla` - America/Anguilla
            * `America/Antigua` - America/Antigua
            * `America/Araguaina` - America/Araguaina
            * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
            * `America/Argentina/Catamarca` - America/Argentina/Catamarca
            * `America/Argentina/Cordoba` - America/Argentina/Cordoba
            * `America/Argentina/Jujuy` - America/Argentina/Jujuy
            * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
            * `America/Argentina/Mendoza` - America/Argentina/Mendoza
            * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
            * `America/Argentina/Salta` - America/Argentina/Salta
            * `America/Argentina/San_Juan` - America/Argentina/San_Juan
            * `America/Argentina/San_Luis` - America/Argentina/San_Luis
            * `America/Argentina/Tucuman` - America/Argentina/Tucuman
            * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
            * `America/Aruba` - America/Aruba
            * `America/Asuncion` - America/Asuncion
            * `America/Atikokan` - America/Atikokan
            * `America/Bahia` - America/Bahia
            * `America/Bahia_Banderas` - America/Bahia_Banderas
            * `America/Barbados` - America/Barbados
            * `America/Belem` - America/Belem
            * `America/Belize` - America/Belize
            * `America/Blanc-Sablon` - America/Blanc-Sablon
            * `America/Boa_Vista` - America/Boa_Vista
            * `America/Bogota` - America/Bogota
            * `America/Boise` - America/Boise
            * `America/Cambridge_Bay` - America/Cambridge_Bay
            * `America/Campo_Grande` - America/Campo_Grande
            * `America/Cancun` - America/Cancun
            * `America/Caracas` - America/Caracas
            * `America/Cayenne` - America/Cayenne
            * `America/Cayman` - America/Cayman
            * `America/Chicago` - America/Chicago
            * `America/Chihuahua` - America/Chihuahua
            * `America/Ciudad_Juarez` - America/Ciudad_Juarez
            * `America/Costa_Rica` - America/Costa_Rica
            * `America/Coyhaique` - America/Coyhaique
            * `America/Creston` - America/Creston
            * `America/Cuiaba` - America/Cuiaba
            * `America/Curacao` - America/Curacao
            * `America/Danmarkshavn` - America/Danmarkshavn
            * `America/Dawson` - America/Dawson
            * `America/Dawson_Creek` - America/Dawson_Creek
            * `America/Denver` - America/Denver
            * `America/Detroit` - America/Detroit
            * `America/Dominica` - America/Dominica
            * `America/Edmonton` - America/Edmonton
            * `America/Eirunepe` - America/Eirunepe
            * `America/El_Salvador` - America/El_Salvador
            * `America/Fort_Nelson` - America/Fort_Nelson
            * `America/Fortaleza` - America/Fortaleza
            * `America/Glace_Bay` - America/Glace_Bay
            * `America/Goose_Bay` - America/Goose_Bay
            * `America/Grand_Turk` - America/Grand_Turk
            * `America/Grenada` - America/Grenada
            * `America/Guadeloupe` - America/Guadeloupe
            * `America/Guatemala` - America/Guatemala
            * `America/Guayaquil` - America/Guayaquil
            * `America/Guyana` - America/Guyana
            * `America/Halifax` - America/Halifax
            * `America/Havana` - America/Havana
            * `America/Hermosillo` - America/Hermosillo
            * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
            * `America/Indiana/Knox` - America/Indiana/Knox
            * `America/Indiana/Marengo` - America/Indiana/Marengo
            * `America/Indiana/Petersburg` - America/Indiana/Petersburg
            * `America/Indiana/Tell_City` - America/Indiana/Tell_City
            * `America/Indiana/Vevay` - America/Indiana/Vevay
            * `America/Indiana/Vincennes` - America/Indiana/Vincennes
            * `America/Indiana/Winamac` - America/Indiana/Winamac
            * `America/Inuvik` - America/Inuvik
            * `America/Iqaluit` - America/Iqaluit
            * `America/Jamaica` - America/Jamaica
            * `America/Juneau` - America/Juneau
            * `America/Kentucky/Louisville` - America/Kentucky/Louisville
            * `America/Kentucky/Monticello` - America/Kentucky/Monticello
            * `America/Kralendijk` - America/Kralendijk
            * `America/La_Paz` - America/La_Paz
            * `America/Lima` - America/Lima
            * `America/Los_Angeles` - America/Los_Angeles
            * `America/Lower_Princes` - America/Lower_Princes
            * `America/Maceio` - America/Maceio
            * `America/Managua` - America/Managua
            * `America/Manaus` - America/Manaus
            * `America/Marigot` - America/Marigot
            * `America/Martinique` - America/Martinique
            * `America/Matamoros` - America/Matamoros
            * `America/Mazatlan` - America/Mazatlan
            * `America/Menominee` - America/Menominee
            * `America/Merida` - America/Merida
            * `America/Metlakatla` - America/Metlakatla
            * `America/Mexico_City` - America/Mexico_City
            * `America/Miquelon` - America/Miquelon
            * `America/Moncton` - America/Moncton
            * `America/Monterrey` - America/Monterrey
            * `America/Montevideo` - America/Montevideo
            * `America/Montserrat` - America/Montserrat
            * `America/Nassau` - America/Nassau
            * `America/New_York` - America/New_York
            * `America/Nome` - America/Nome
            * `America/Noronha` - America/Noronha
            * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
            * `America/North_Dakota/Center` - America/North_Dakota/Center
            * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
            * `America/Nuuk` - America/Nuuk
            * `America/Ojinaga` - America/Ojinaga
            * `America/Panama` - America/Panama
            * `America/Paramaribo` - America/Paramaribo
            * `America/Phoenix` - America/Phoenix
            * `America/Port-au-Prince` - America/Port-au-Prince
            * `America/Port_of_Spain` - America/Port_of_Spain
            * `America/Porto_Velho` - America/Porto_Velho
            * `America/Puerto_Rico` - America/Puerto_Rico
            * `America/Punta_Arenas` - America/Punta_Arenas
            * `America/Rankin_Inlet` - America/Rankin_Inlet
            * `America/Recife` - America/Recife
            * `America/Regina` - America/Regina
            * `America/Resolute` - America/Resolute
            * `America/Rio_Branco` - America/Rio_Branco
            * `America/Santarem` - America/Santarem
            * `America/Santiago` - America/Santiago
            * `America/Santo_Domingo` - America/Santo_Domingo
            * `America/Sao_Paulo` - America/Sao_Paulo
            * `America/Scoresbysund` - America/Scoresbysund
            * `America/Sitka` - America/Sitka
            * `America/St_Barthelemy` - America/St_Barthelemy
            * `America/St_Johns` - America/St_Johns
            * `America/St_Kitts` - America/St_Kitts
            * `America/St_Lucia` - America/St_Lucia
            * `America/St_Thomas` - America/St_Thomas
            * `America/St_Vincent` - America/St_Vincent
            * `America/Swift_Current` - America/Swift_Current
            * `America/Tegucigalpa` - America/Tegucigalpa
            * `America/Thule` - America/Thule
            * `America/Tijuana` - America/Tijuana
            * `America/Toronto` - America/Toronto
            * `America/Tortola` - America/Tortola
            * `America/Vancouver` - America/Vancouver
            * `America/Whitehorse` - America/Whitehorse
            * `America/Winnipeg` - America/Winnipeg
            * `America/Yakutat` - America/Yakutat
            * `Antarctica/Casey` - Antarctica/Casey
            * `Antarctica/Davis` - Antarctica/Davis
            * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
            * `Antarctica/Macquarie` - Antarctica/Macquarie
            * `Antarctica/Mawson` - Antarctica/Mawson
            * `Antarctica/McMurdo` - Antarctica/McMurdo
            * `Antarctica/Palmer` - Antarctica/Palmer
            * `Antarctica/Rothera` - Antarctica/Rothera
            * `Antarctica/Syowa` - Antarctica/Syowa
            * `Antarctica/Troll` - Antarctica/Troll
            * `Antarctica/Vostok` - Antarctica/Vostok
            * `Arctic/Longyearbyen` - Arctic/Longyearbyen
            * `Asia/Aden` - Asia/Aden
            * `Asia/Almaty` - Asia/Almaty
            * `Asia/Amman` - Asia/Amman
            * `Asia/Anadyr` - Asia/Anadyr
            * `Asia/Aqtau` - Asia/Aqtau
            * `Asia/Aqtobe` - Asia/Aqtobe
            * `Asia/Ashgabat` - Asia/Ashgabat
            * `Asia/Atyrau` - Asia/Atyrau
            * `Asia/Baghdad` - Asia/Baghdad
            * `Asia/Bahrain` - Asia/Bahrain
            * `Asia/Baku` - Asia/Baku
            * `Asia/Bangkok` - Asia/Bangkok
            * `Asia/Barnaul` - Asia/Barnaul
            * `Asia/Beirut` - Asia/Beirut
            * `Asia/Bishkek` - Asia/Bishkek
            * `Asia/Brunei` - Asia/Brunei
            * `Asia/Chita` - Asia/Chita
            * `Asia/Colombo` - Asia/Colombo
            * `Asia/Damascus` - Asia/Damascus
            * `Asia/Dhaka` - Asia/Dhaka
            * `Asia/Dili` - Asia/Dili
            * `Asia/Dubai` - Asia/Dubai
            * `Asia/Dushanbe` - Asia/Dushanbe
            * `Asia/Famagusta` - Asia/Famagusta
            * `Asia/Gaza` - Asia/Gaza
            * `Asia/Hebron` - Asia/Hebron
            * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
            * `Asia/Hong_Kong` - Asia/Hong_Kong
            * `Asia/Hovd` - Asia/Hovd
            * `Asia/Irkutsk` - Asia/Irkutsk
            * `Asia/Jakarta` - Asia/Jakarta
            * `Asia/Jayapura` - Asia/Jayapura
            * `Asia/Jerusalem` - Asia/Jerusalem
            * `Asia/Kabul` - Asia/Kabul
            * `Asia/Kamchatka` - Asia/Kamchatka
            * `Asia/Karachi` - Asia/Karachi
            * `Asia/Kathmandu` - Asia/Kathmandu
            * `Asia/Khandyga` - Asia/Khandyga
            * `Asia/Kolkata` - Asia/Kolkata
            * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
            * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
            * `Asia/Kuching` - Asia/Kuching
            * `Asia/Kuwait` - Asia/Kuwait
            * `Asia/Macau` - Asia/Macau
            * `Asia/Magadan` - Asia/Magadan
            * `Asia/Makassar` - Asia/Makassar
            * `Asia/Manila` - Asia/Manila
            * `Asia/Muscat` - Asia/Muscat
            * `Asia/Nicosia` - Asia/Nicosia
            * `Asia/Novokuznetsk` - Asia/Novokuznetsk
            * `Asia/Novosibirsk` - Asia/Novosibirsk
            * `Asia/Omsk` - Asia/Omsk
            * `Asia/Oral` - Asia/Oral
            * `Asia/Phnom_Penh` - Asia/Phnom_Penh
            * `Asia/Pontianak` - Asia/Pontianak
            * `Asia/Pyongyang` - Asia/Pyongyang
            * `Asia/Qatar` - Asia/Qatar
            * `Asia/Qostanay` - Asia/Qostanay
            * `Asia/Qyzylorda` - Asia/Qyzylorda
            * `Asia/Riyadh` - Asia/Riyadh
            * `Asia/Sakhalin` - Asia/Sakhalin
            * `Asia/Samarkand` - Asia/Samarkand
            * `Asia/Seoul` - Asia/Seoul
            * `Asia/Shanghai` - Asia/Shanghai
            * `Asia/Singapore` - Asia/Singapore
            * `Asia/Srednekolymsk` - Asia/Srednekolymsk
            * `Asia/Taipei` - Asia/Taipei
            * `Asia/Tashkent` - Asia/Tashkent
            * `Asia/Tbilisi` - Asia/Tbilisi
            * `Asia/Tehran` - Asia/Tehran
            * `Asia/Thimphu` - Asia/Thimphu
            * `Asia/Tokyo` - Asia/Tokyo
            * `Asia/Tomsk` - Asia/Tomsk
            * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
            * `Asia/Urumqi` - Asia/Urumqi
            * `Asia/Ust-Nera` - Asia/Ust-Nera
            * `Asia/Vientiane` - Asia/Vientiane
            * `Asia/Vladivostok` - Asia/Vladivostok
            * `Asia/Yakutsk` - Asia/Yakutsk
            * `Asia/Yangon` - Asia/Yangon
            * `Asia/Yekaterinburg` - Asia/Yekaterinburg
            * `Asia/Yerevan` - Asia/Yerevan
            * `Atlantic/Azores` - Atlantic/Azores
            * `Atlantic/Bermuda` - Atlantic/Bermuda
            * `Atlantic/Canary` - Atlantic/Canary
            * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
            * `Atlantic/Faroe` - Atlantic/Faroe
            * `Atlantic/Madeira` - Atlantic/Madeira
            * `Atlantic/Reykjavik` - Atlantic/Reykjavik
            * `Atlantic/South_Georgia` - Atlantic/South_Georgia
            * `Atlantic/St_Helena` - Atlantic/St_Helena
            * `Atlantic/Stanley` - Atlantic/Stanley
            * `Australia/Adelaide` - Australia/Adelaide
            * `Australia/Brisbane` - Australia/Brisbane
            * `Australia/Broken_Hill` - Australia/Broken_Hill
            * `Australia/Darwin` - Australia/Darwin
            * `Australia/Eucla` - Australia/Eucla
            * `Australia/Hobart` - Australia/Hobart
            * `Australia/Lindeman` - Australia/Lindeman
            * `Australia/Lord_Howe` - Australia/Lord_Howe
            * `Australia/Melbourne` - Australia/Melbourne
            * `Australia/Perth` - Australia/Perth
            * `Australia/Sydney` - Australia/Sydney
            * `Europe/Amsterdam` - Europe/Amsterdam
            * `Europe/Andorra` - Europe/Andorra
            * `Europe/Astrakhan` - Europe/Astrakhan
            * `Europe/Athens` - Europe/Athens
            * `Europe/Belgrade` - Europe/Belgrade
            * `Europe/Berlin` - Europe/Berlin
            * `Europe/Bratislava` - Europe/Bratislava
            * `Europe/Brussels` - Europe/Brussels
            * `Europe/Bucharest` - Europe/Bucharest
            * `Europe/Budapest` - Europe/Budapest
            * `Europe/Busingen` - Europe/Busingen
            * `Europe/Chisinau` - Europe/Chisinau
            * `Europe/Copenhagen` - Europe/Copenhagen
            * `Europe/Dublin` - Europe/Dublin
            * `Europe/Gibraltar` - Europe/Gibraltar
            * `Europe/Guernsey` - Europe/Guernsey
            * `Europe/Helsinki` - Europe/Helsinki
            * `Europe/Isle_of_Man` - Europe/Isle_of_Man
            * `Europe/Istanbul` - Europe/Istanbul
            * `Europe/Jersey` - Europe/Jersey
            * `Europe/Kaliningrad` - Europe/Kaliningrad
            * `Europe/Kirov` - Europe/Kirov
            * `Europe/Kyiv` - Europe/Kyiv
            * `Europe/Lisbon` - Europe/Lisbon
            * `Europe/Ljubljana` - Europe/Ljubljana
            * `Europe/London` - Europe/London
            * `Europe/Luxembourg` - Europe/Luxembourg
            * `Europe/Madrid` - Europe/Madrid
            * `Europe/Malta` - Europe/Malta
            * `Europe/Mariehamn` - Europe/Mariehamn
            * `Europe/Minsk` - Europe/Minsk
            * `Europe/Monaco` - Europe/Monaco
            * `Europe/Moscow` - Europe/Moscow
            * `Europe/Oslo` - Europe/Oslo
            * `Europe/Paris` - Europe/Paris
            * `Europe/Podgorica` - Europe/Podgorica
            * `Europe/Prague` - Europe/Prague
            * `Europe/Riga` - Europe/Riga
            * `Europe/Rome` - Europe/Rome
            * `Europe/Samara` - Europe/Samara
            * `Europe/San_Marino` - Europe/San_Marino
            * `Europe/Sarajevo` - Europe/Sarajevo
            * `Europe/Saratov` - Europe/Saratov
            * `Europe/Simferopol` - Europe/Simferopol
            * `Europe/Skopje` - Europe/Skopje
            * `Europe/Sofia` - Europe/Sofia
            * `Europe/Stockholm` - Europe/Stockholm
            * `Europe/Tallinn` - Europe/Tallinn
            * `Europe/Tirane` - Europe/Tirane
            * `Europe/Ulyanovsk` - Europe/Ulyanovsk
            * `Europe/Vaduz` - Europe/Vaduz
            * `Europe/Vatican` - Europe/Vatican
            * `Europe/Vienna` - Europe/Vienna
            * `Europe/Vilnius` - Europe/Vilnius
            * `Europe/Volgograd` - Europe/Volgograd
            * `Europe/Warsaw` - Europe/Warsaw
            * `Europe/Zagreb` - Europe/Zagreb
            * `Europe/Zurich` - Europe/Zurich
            * `GMT` - GMT
            * `Indian/Antananarivo` - Indian/Antananarivo
            * `Indian/Chagos` - Indian/Chagos
            * `Indian/Christmas` - Indian/Christmas
            * `Indian/Cocos` - Indian/Cocos
            * `Indian/Comoro` - Indian/Comoro
            * `Indian/Kerguelen` - Indian/Kerguelen
            * `Indian/Mahe` - Indian/Mahe
            * `Indian/Maldives` - Indian/Maldives
            * `Indian/Mauritius` - Indian/Mauritius
            * `Indian/Mayotte` - Indian/Mayotte
            * `Indian/Reunion` - Indian/Reunion
            * `Pacific/Apia` - Pacific/Apia
            * `Pacific/Auckland` - Pacific/Auckland
            * `Pacific/Bougainville` - Pacific/Bougainville
            * `Pacific/Chatham` - Pacific/Chatham
            * `Pacific/Chuuk` - Pacific/Chuuk
            * `Pacific/Easter` - Pacific/Easter
            * `Pacific/Efate` - Pacific/Efate
            * `Pacific/Fakaofo` - Pacific/Fakaofo
            * `Pacific/Fiji` - Pacific/Fiji
            * `Pacific/Funafuti` - Pacific/Funafuti
            * `Pacific/Galapagos` - Pacific/Galapagos
            * `Pacific/Gambier` - Pacific/Gambier
            * `Pacific/Guadalcanal` - Pacific/Guadalcanal
            * `Pacific/Guam` - Pacific/Guam
            * `Pacific/Honolulu` - Pacific/Honolulu
            * `Pacific/Kanton` - Pacific/Kanton
            * `Pacific/Kiritimati` - Pacific/Kiritimati
            * `Pacific/Kosrae` - Pacific/Kosrae
            * `Pacific/Kwajalein` - Pacific/Kwajalein
            * `Pacific/Majuro` - Pacific/Majuro
            * `Pacific/Marquesas` - Pacific/Marquesas
            * `Pacific/Midway` - Pacific/Midway
            * `Pacific/Nauru` - Pacific/Nauru
            * `Pacific/Niue` - Pacific/Niue
            * `Pacific/Norfolk` - Pacific/Norfolk
            * `Pacific/Noumea` - Pacific/Noumea
            * `Pacific/Pago_Pago` - Pacific/Pago_Pago
            * `Pacific/Palau` - Pacific/Palau
            * `Pacific/Pitcairn` - Pacific/Pitcairn
            * `Pacific/Pohnpei` - Pacific/Pohnpei
            * `Pacific/Port_Moresby` - Pacific/Port_Moresby
            * `Pacific/Rarotonga` - Pacific/Rarotonga
            * `Pacific/Saipan` - Pacific/Saipan
            * `Pacific/Tahiti` - Pacific/Tahiti
            * `Pacific/Tarawa` - Pacific/Tarawa
            * `Pacific/Tongatapu` - Pacific/Tongatapu
            * `Pacific/Wake` - Pacific/Wake
            * `Pacific/Wallis` - Pacific/Wallis
            * `UTC` - UTC
          oneOf:
          - $ref: '#/components/schemas/LocalTimezoneEnum'
          - $ref: '#/components/schemas/BlankEnum'
          - $ref: '#/components/schemas/NullEnum'
        bootswatch_theme:
          type: integer
          nullable: true
          description: Bootswatch theme for light mode
    PatchedVendorRequest:
      type: object
      properties:
        name:
          type: string
        legal_name:
          type: string
        abbreviated_name:
          type: string
        overview:
          type: string
        history:
          type: string
        services_provided:
          type: string
        vendor_type:
          type: string
        employee_count:
          type: integer
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        fiscal_year_end:
          type: string
          format: date
          nullable: true
        partner_portal_url:
          type: string
          format: uri
        is_competitor:
          type: boolean
        deal_registration_notes:
          type: string
    PatchedVendorSolutionRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        vendor_id:
          type: integer
          writeOnly: true
        description:
          type: string
          minLength: 1
          title: Solution Information
          description: Detailed solution description with URL support
        url:
          type: string
          format: uri
          maxLength: 200
        notes:
          type: string
          minLength: 1
          description: Additional notes about the solution
        category:
          type: string
          maxLength: 100
        release_date:
          type: string
          format: date
          nullable: true
        end_of_life_date:
          type: string
          format: date
          nullable: true
        documentation_url:
          type: string
          format: uri
          maxLength: 200
    PatchedWorkshopRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        date:
          type: string
          format: date
        time:
          type: string
          format: time
        duration:
          allOf:
          - $ref: '#/components/schemas/DurationEnum'
          minimum: -2147483648
          maximum: 2147483647
        workshop_type:
          $ref: '#/components/schemas/WorkshopTypeEnum'
        participant_ids:
          type: array
          items:
            type: integer
          writeOnly: true
        notes:
          type: string
    PotentialImpactEnum:
      enum:
      - Schedule
      - Cost
      - Quality
      - Multiple
      type: string
      description: |-
        * `Schedule` - Schedule
        * `Cost` - Cost
        * `Quality` - Quality
        * `Multiple` - Multiple
    PowerEnum:
      enum:
      - High
      - Medium
      - Low
      type: string
      description: |-
        * `High` - High
        * `Medium` - Medium
        * `Low` - Low
    PowerPointTemplate:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        master_slides:
          readOnly: true
        color_palette:
          readOnly: true
        is_active:
          type: boolean
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - color_palette
      - created_date
      - id
      - master_slides
      - modified_date
      - name
    PowerPointTemplateRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        is_active:
          type: boolean
      required:
      - name
    Presentation:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        source_type:
          $ref: '#/components/schemas/SourceTypeEnum'
        source_id:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        date:
          type: string
          format: date
        presenter:
          type: integer
          nullable: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - id
      - modified_date
      - name
      - source_id
      - source_type
    PresentationRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        source_type:
          $ref: '#/components/schemas/SourceTypeEnum'
        source_id:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        date:
          type: string
          format: date
        presenter:
          type: integer
          nullable: true
      required:
      - name
      - source_id
      - source_type
    PriceLineItem:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        vendor_solution:
          type: integer
        vendor_solution_name:
          type: string
          readOnly: true
        type:
          $ref: '#/components/schemas/PriceLineItemTypeEnum'
        billing_cycle:
          $ref: '#/components/schemas/BillingCycleEnum'
        quantity:
          type: string
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,2})?$
        cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        unit_price:
          type: string
          readOnly: true
        total_price:
          type: string
          readOnly: true
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
      required:
      - cost
      - id
      - margin
      - order
      - total_price
      - type
      - unit_price
      - vendor_solution
      - vendor_solution_name
    PriceLineItemRequest:
      type: object
      properties:
        vendor_solution:
          type: integer
        type:
          $ref: '#/components/schemas/PriceLineItemTypeEnum'
        billing_cycle:
          $ref: '#/components/schemas/BillingCycleEnum'
        quantity:
          type: string
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,2})?$
        cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
        margin:
          type: string
          format: decimal
          pattern: ^-?\d{0,3}(?:\.\d{0,2})?$
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
      required:
      - cost
      - margin
      - order
      - type
      - vendor_solution
    PriceLineItemTypeEnum:
      enum:
      - Hardware
      - Software
      - Subscription
      - Advisory
      - Implementation
      - Support
      - Managed Service
      type: string
      description: |-
        * `Hardware` - Hardware
        * `Software` - Software
        * `Subscription` - Subscription
        * `Advisory` - Advisory
        * `Implementation` - Implementation
        * `Support` - Support
        * `Managed Service` - Managed Service
    PriceVersion:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        currency:
          type: string
        version_number:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        date_created:
          type: string
          format: date
          readOnly: true
        notes:
          type: string
        line_items:
          type: string
          readOnly: true
        one_time_total:
          type: string
          readOnly: true
        monthly_total:
          type: string
          readOnly: true
        annual_total:
          type: string
          readOnly: true
        total:
          type: string
          readOnly: true
      required:
      - annual_total
      - currency
      - date_created
      - id
      - line_items
      - monthly_total
      - one_time_total
      - title
      - total
      - version_number
    PriceVersionRequest:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        currency:
          type: string
          minLength: 1
        version_number:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        notes:
          type: string
      required:
      - currency
      - title
      - version_number
    PricingTool:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        latest_version:
          type: string
          readOnly: true
        version_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - association_display
      - client_name
      - created_date
      - description
      - id
      - latest_version
      - modified_date
      - name
      - version_count
    PricingToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
      required:
      - description
      - name
    Principle:
      type: object
      description: Serialize all Principle fields.
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        weight:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Importance (1-10)
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        created_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - description
      - id
      - name
      - order
    PrincipleAlignment:
      type: object
      description: Serialize a PrincipleAlignment with nested principle on read and
        writable ``principle_id`` on write.
      properties:
        principle:
          allOf:
          - $ref: '#/components/schemas/Principle'
          readOnly: true
        alignment_score:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Alignment score (1-5)
        notes:
          type: string
      required:
      - alignment_score
      - principle
    PrincipleAlignmentRequest:
      type: object
      description: Serialize a PrincipleAlignment with nested principle on read and
        writable ``principle_id`` on write.
      properties:
        principle_id:
          type: integer
          writeOnly: true
        alignment_score:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Alignment score (1-5)
        notes:
          type: string
      required:
      - alignment_score
      - principle_id
    PrincipleRequest:
      type: object
      description: Serialize all Principle fields.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        weight:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Importance (1-10)
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
      required:
      - description
      - name
      - order
    Priority758Enum:
      enum:
      - High
      - Medium
      - Low
      type: string
      description: |-
        * `High` - High
        * `Medium` - Medium
        * `Low` - Low
    Proposal:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        opportunity:
          allOf:
          - $ref: '#/components/schemas/Opportunity'
          readOnly: true
        primary_contact:
          allOf:
          - $ref: '#/components/schemas/Contact'
          readOnly: true
        status:
          $ref: '#/components/schemas/ProposalStatusEnum'
        due_date:
          type: string
          format: date
          nullable: true
        submitted_date:
          type: string
          format: date
          nullable: true
        repository_url:
          type: string
          format: uri
          maxLength: 200
        created_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - id
      - name
      - opportunity
      - primary_contact
      - status
    ProposalRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        opportunity_id:
          type: integer
          writeOnly: true
        primary_contact_id:
          type: integer
          writeOnly: true
          nullable: true
        status:
          $ref: '#/components/schemas/ProposalStatusEnum'
        due_date:
          type: string
          format: date
          nullable: true
        submitted_date:
          type: string
          format: date
          nullable: true
        repository_url:
          type: string
          format: uri
          maxLength: 200
      required:
      - name
      - opportunity_id
      - status
    ProposalStatusEnum:
      enum:
      - Draft
      - In Review
      - Final
      type: string
      description: |-
        * `Draft` - Draft
        * `In Review` - In Review
        * `Final` - Final
    RAIDTool:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
        risks:
          type: array
          items:
            $ref: '#/components/schemas/Risk'
          readOnly: true
        assumptions:
          type: array
          items:
            $ref: '#/components/schemas/Assumption'
          readOnly: true
        issues:
          type: array
          items:
            $ref: '#/components/schemas/Issue'
          readOnly: true
        dependencies:
          type: array
          items:
            $ref: '#/components/schemas/Dependency'
          readOnly: true
      required:
      - association_display
      - assumptions
      - client_name
      - created_date
      - dependencies
      - description
      - id
      - issues
      - modified_date
      - name
      - risks
    Recommendation:
      type: object
      description: |-
        Serialize a Recommendation with nested impacts, alignments, findings, and requirements.

        ``finding_ids`` and ``requirement_ids`` are write-only; on read the full nested
        objects are returned under ``associated_findings`` / ``associated_requirements``.
        ``timeframe`` is a computed read-only field (Short / Medium / Long) derived from
        ``implementation_days`` against fixed 30- and 180-day thresholds.
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        implementation_days:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        timeframe:
          type: string
          readOnly: true
        associated_findings:
          type: array
          items:
            $ref: '#/components/schemas/Finding'
          readOnly: true
        associated_requirements:
          type: array
          items:
            $ref: '#/components/schemas/Requirement'
          readOnly: true
        cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
        currency:
          type: string
        complexity:
          $ref: '#/components/schemas/ComplexityEnum'
        impacts:
          type: array
          items:
            $ref: '#/components/schemas/RecommendationImpact'
          readOnly: true
        alignments:
          type: array
          items:
            $ref: '#/components/schemas/PrincipleAlignment'
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - alignments
      - associated_findings
      - associated_requirements
      - complexity
      - cost
      - created_date
      - currency
      - description
      - id
      - impacts
      - implementation_days
      - timeframe
      - title
    RecommendationImpact:
      type: object
      description: Serialize a RecommendationImpact record (impact type, score 1–5,
        and notes).
      properties:
        impact_type:
          $ref: '#/components/schemas/ImpactTypeEnum'
        impact_score:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Impact level (1-5)
        notes:
          type: string
      required:
      - impact_score
      - impact_type
    RecommendationImpactRequest:
      type: object
      description: Serialize a RecommendationImpact record (impact type, score 1–5,
        and notes).
      properties:
        impact_type:
          $ref: '#/components/schemas/ImpactTypeEnum'
        impact_score:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Impact level (1-5)
        notes:
          type: string
      required:
      - impact_score
      - impact_type
    RecommendationRequest:
      type: object
      description: |-
        Serialize a Recommendation with nested impacts, alignments, findings, and requirements.

        ``finding_ids`` and ``requirement_ids`` are write-only; on read the full nested
        objects are returned under ``associated_findings`` / ``associated_requirements``.
        ``timeframe`` is a computed read-only field (Short / Medium / Long) derived from
        ``implementation_days`` against fixed 30- and 180-day thresholds.
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        implementation_days:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        finding_ids:
          type: array
          items:
            type: integer
          writeOnly: true
        requirement_ids:
          type: array
          items:
            type: integer
          writeOnly: true
        cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
        currency:
          type: string
          minLength: 1
        complexity:
          $ref: '#/components/schemas/ComplexityEnum'
      required:
      - complexity
      - cost
      - currency
      - description
      - implementation_days
      - title
    Requirement:
      type: object
      description: Serialize a Requirement with nested findings on read and a writable
        ``related_finding_ids`` list on write.
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        type:
          $ref: '#/components/schemas/RequirementTypeEnum'
        category:
          type: string
          maxLength: 100
        success_measure:
          type: string
        notes:
          type: string
        related_findings:
          type: array
          items:
            $ref: '#/components/schemas/Finding'
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - description
      - id
      - name
      - related_findings
      - success_measure
      - type
    RequirementRequest:
      type: object
      description: Serialize a Requirement with nested findings on read and a writable
        ``related_finding_ids`` list on write.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        type:
          $ref: '#/components/schemas/RequirementTypeEnum'
        category:
          type: string
          maxLength: 100
        success_measure:
          type: string
          minLength: 1
        notes:
          type: string
        related_finding_ids:
          type: array
          items:
            type: integer
          writeOnly: true
      required:
      - description
      - name
      - success_measure
      - type
    RequirementTypeEnum:
      enum:
      - Functional
      - NonFunctional
      type: string
      description: |-
        * `Functional` - Functional
        * `NonFunctional` - Non-Functional
    RequirementsTool:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
        requirements:
          type: array
          items:
            $ref: '#/components/schemas/Requirement'
          readOnly: true
      required:
      - association_display
      - client_name
      - created_date
      - description
      - id
      - modified_date
      - name
      - requirements
    Risk:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        probability:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Percentage (0-100)
        impact:
          $ref: '#/components/schemas/ImpactEnum'
        mitigation_strategy:
          type: string
        owner:
          type: integer
        owner_name:
          type: string
          readOnly: true
        status:
          $ref: '#/components/schemas/RiskStatusEnum'
        due_date:
          type: string
          format: date
      required:
      - description
      - due_date
      - id
      - impact
      - mitigation_strategy
      - owner
      - owner_name
      - probability
      - status
      - title
    RiskStatusEnum:
      enum:
      - Open
      - Mitigating
      - Closed
      - Accepted
      type: string
      description: |-
        * `Open` - Open
        * `Mitigating` - Mitigating
        * `Closed` - Closed
        * `Accepted` - Accepted
    SectorEnum:
      enum:
      - Aerospace
      - Agriculture
      - Construction
      - Defense
      - Education
      - Entertainment
      - Finance
      - Health Care
      - Hospitality
      - Mining
      - Manufacturing
      - Technology
      - Transport
      - Utilities
      type: string
      description: |-
        * `Aerospace` - Aerospace
        * `Agriculture` - Agriculture
        * `Construction` - Construction
        * `Defense` - Defense
        * `Education` - Education
        * `Entertainment` - Entertainment
        * `Finance` - Finance
        * `Health Care` - Health Care
        * `Hospitality` - Hospitality
        * `Mining` - Mining
        * `Manufacturing` - Manufacturing
        * `Technology` - Technology
        * `Transport` - Transport
        * `Utilities` - Utilities
    SizeEnum:
      enum:
      - Micro
      - Small
      - Medium
      - Large
      - Enterprise
      type: string
      description: |-
        * `Micro` - Micro
        * `Small` - Small
        * `Medium` - Medium
        * `Large` - Large
        * `Enterprise` - Enterprise
    SourceEnum:
      enum:
      - Workshop
      - Interview
      - Document
      - Other
      type: string
      description: |-
        * `Workshop` - Workshop
        * `Interview` - Interview
        * `Document` - Document
        * `Other` - Other
    SourceTypeEnum:
      enum:
      - Proposal
      - Engagement
      type: string
      description: |-
        * `Proposal` - Proposal
        * `Engagement` - Engagement
    Stage:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        color:
          type: integer
          nullable: true
          description: Stage color (editable in admin)
        status:
          $ref: '#/components/schemas/StageStatusEnum'
        progress:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Completion percentage (0-100)
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        milestone:
          type: integer
          nullable: true
          description: Optional milestone that marks the completion of this stage
        duration_days:
          type: string
          readOnly: true
      required:
      - duration_days
      - end_date
      - id
      - name
      - start_date
    StageEnum:
      enum:
      - Prospecting
      - Qualification
      - Workshops
      - Proposal
      - Negotiation
      - Closed
      type: string
      description: |-
        * `Prospecting` - Prospecting
        * `Qualification` - Qualification
        * `Workshops` - Workshops
        * `Proposal` - Proposal
        * `Negotiation` - Negotiation
        * `Closed` - Closed
    StageRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        color:
          type: integer
          nullable: true
          description: Stage color (editable in admin)
        status:
          $ref: '#/components/schemas/StageStatusEnum'
        progress:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Completion percentage (0-100)
        order:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        milestone:
          type: integer
          nullable: true
          description: Optional milestone that marks the completion of this stage
      required:
      - end_date
      - name
      - start_date
    StageStatusEnum:
      enum:
      - not_started
      - in_progress
      - completed
      - delayed
      - on_hold
      type: string
      description: |-
        * `not_started` - Not Started
        * `in_progress` - In Progress
        * `completed` - Completed
        * `delayed` - Delayed
        * `on_hold` - On Hold
    Stakeholder:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        contact:
          allOf:
          - $ref: '#/components/schemas/Contact'
          readOnly: true
        contact_name:
          type: string
          readOnly: true
        tenure:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Years in current role
        solution_seek:
          type: string
        solution_avoid:
          type: string
        notes:
          type: string
        power:
          $ref: '#/components/schemas/PowerEnum'
        interest:
          $ref: '#/components/schemas/InterestEnum'
      required:
      - contact
      - contact_name
      - id
    StakeholderRequest:
      type: object
      properties:
        contact_id:
          type: integer
          writeOnly: true
        tenure:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          description: Years in current role
        solution_seek:
          type: string
        solution_avoid:
          type: string
        notes:
          type: string
        power:
          $ref: '#/components/schemas/PowerEnum'
        interest:
          $ref: '#/components/schemas/InterestEnum'
      required:
      - contact_id
    StakeholderTool:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        stakeholders:
          type: array
          items:
            $ref: '#/components/schemas/Stakeholder'
          readOnly: true
        stakeholder_count:
          type: string
          readOnly: true
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - association_display
      - client_name
      - created_date
      - description
      - id
      - modified_date
      - name
      - stakeholder_count
      - stakeholders
    StakeholderToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
      required:
      - description
      - name
    Status49eEnum:
      enum:
      - draft
      - in_progress
      - complete
      - delivered
      type: string
      description: |-
        * `draft` - Draft
        * `in_progress` - In Progress
        * `complete` - Complete
        * `delivered` - Delivered
    Status557Enum:
      enum:
      - Planning
      - In Progress
      - On Hold
      - Completed
      - Cancelled
      type: string
      description: |-
        * `Planning` - Planning
        * `In Progress` - In Progress
        * `On Hold` - On Hold
        * `Completed` - Completed
        * `Cancelled` - Cancelled
    TEIReport:
      type: object
      description: Report template serializer with counts and the spec-style ``id``
        alias.
      properties:
        id:
          type: string
          readOnly: true
        name:
          type: string
          description: Display name (e.g., 'Amazon Connect 2026').
          maxLength: 255
        vendor:
          type: string
          description: Technology vendor (e.g., 'AWS', 'Genesys').
          maxLength: 255
        version:
          type: string
          description: Model version (e.g., '1.0', '2.1').
          maxLength: 50
        description:
          type: string
        analysis_period_years:
          type: integer
          maximum: 2147483647
          minimum: 0
          description: Number of years included in NPV/ROI (1-10).
        discount_rate:
          type: string
          format: decimal
          pattern: ^-?\d{0,2}(?:\.\d{0,4})?$
          description: Annual discount rate (e.g., 0.10 = 10%).
        status:
          $ref: '#/components/schemas/TEIReportStatusEnum'
        field_count:
          type: integer
          readOnly: true
        instance_count:
          type: integer
          readOnly: true
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_at
      - field_count
      - id
      - instance_count
      - name
      - updated_at
      - vendor
      - version
    TEIReportField:
      type: object
      description: Field-definition serializer.
      properties:
        id:
          type: integer
          readOnly: true
        table:
          $ref: '#/components/schemas/TableEnum'
        field_key:
          type: string
          description: Machine identifier, unique within report.
          maxLength: 64
          pattern: ^[-a-zA-Z0-9_]+$
        label:
          type: string
          maxLength: 255
        description:
          type: string
        field_type:
          $ref: '#/components/schemas/TEIReportFieldFieldTypeEnum'
        category:
          type: string
          maxLength: 100
        default_value:
          type: string
          description: Pre-populated default (stored as string, cast by calculator).
          maxLength: 255
        is_annual:
          type: boolean
          description: If True, value is collected per year (Y1..YN); if False, a
            single value.
        risk_adjustment:
          type: string
          format: decimal
          pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
          nullable: true
          description: Default risk adjustment (0.0-1.0); only applied to benefit
            fields.
        sort_order:
          type: integer
          maximum: 2147483647
          minimum: 0
        is_required:
          type: boolean
        source_notes:
          type: string
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_at
      - field_key
      - field_type
      - id
      - label
      - table
      - updated_at
    TEIReportFieldFieldTypeEnum:
      enum:
      - currency
      - percentage
      - integer
      - decimal
      - text
      type: string
      description: |-
        * `currency` - Currency
        * `percentage` - Percentage
        * `integer` - Integer
        * `decimal` - Decimal
        * `text` - Text
    TEIReportFieldRequest:
      type: object
      description: Field-definition serializer.
      properties:
        table:
          $ref: '#/components/schemas/TableEnum'
        field_key:
          type: string
          minLength: 1
          description: Machine identifier, unique within report.
          maxLength: 64
          pattern: ^[-a-zA-Z0-9_]+$
        label:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        field_type:
          $ref: '#/components/schemas/TEIReportFieldFieldTypeEnum'
        category:
          type: string
          maxLength: 100
        default_value:
          type: string
          description: Pre-populated default (stored as string, cast by calculator).
          maxLength: 255
        is_annual:
          type: boolean
          description: If True, value is collected per year (Y1..YN); if False, a
            single value.
        risk_adjustment:
          type: string
          format: decimal
          pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
          nullable: true
          description: Default risk adjustment (0.0-1.0); only applied to benefit
            fields.
        sort_order:
          type: integer
          maximum: 2147483647
          minimum: 0
        is_required:
          type: boolean
        source_notes:
          type: string
      required:
      - field_key
      - field_type
      - label
      - table
    TEIReportRequest:
      type: object
      description: Report template serializer with counts and the spec-style ``id``
        alias.
      properties:
        name:
          type: string
          minLength: 1
          description: Display name (e.g., 'Amazon Connect 2026').
          maxLength: 255
        vendor:
          type: string
          minLength: 1
          description: Technology vendor (e.g., 'AWS', 'Genesys').
          maxLength: 255
        version:
          type: string
          minLength: 1
          description: Model version (e.g., '1.0', '2.1').
          maxLength: 50
        description:
          type: string
        analysis_period_years:
          type: integer
          maximum: 2147483647
          minimum: 0
          description: Number of years included in NPV/ROI (1-10).
        discount_rate:
          type: string
          format: decimal
          pattern: ^-?\d{0,2}(?:\.\d{0,4})?$
          description: Annual discount rate (e.g., 0.10 = 10%).
        status:
          $ref: '#/components/schemas/TEIReportStatusEnum'
      required:
      - name
      - vendor
      - version
    TEIReportStatusEnum:
      enum:
      - draft
      - active
      - archived
      type: string
      description: |-
        * `draft` - Draft
        * `active` - Active
        * `archived` - Archived
    TEITool:
      type: object
      description: Read serializer for ``TEITool`` list/detail responses.
      properties:
        id:
          type: string
          readOnly: true
        report:
          type: object
          additionalProperties: {}
          readOnly: true
        opportunity:
          type: object
          additionalProperties: {}
          nullable: true
          readOnly: true
        engagement:
          type: object
          additionalProperties: {}
          nullable: true
          readOnly: true
        name:
          type: string
          readOnly: true
        status:
          allOf:
          - $ref: '#/components/schemas/Status49eEnum'
          readOnly: true
        current_version:
          type: integer
          readOnly: true
          description: Highest version_number among TEIVersion snapshots; 0 means
            none saved yet.
        summary:
          type: object
          additionalProperties: {}
          nullable: true
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_date
      - current_version
      - engagement
      - id
      - modified_date
      - name
      - opportunity
      - report
      - status
      - summary
    TEIToolCreate:
      type: object
      description: |-
        Write serializer for ``POST /tools/``.

        The report is resolved by its ``public_id``; proposal/engagement are
        resolved by integer PK for simplicity (matches the rest of the Athena
        admin/API surface).  Viewset performs the duplicate-instance check.
      properties:
        report:
          type: string
          description: Report public_id (short UUID).
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        name:
          type: string
          nullable: true
        status:
          allOf:
          - $ref: '#/components/schemas/Status49eEnum'
          default: draft
      required:
      - report
    TEIToolCreateRequest:
      type: object
      description: |-
        Write serializer for ``POST /tools/``.

        The report is resolved by its ``public_id``; proposal/engagement are
        resolved by integer PK for simplicity (matches the rest of the Athena
        admin/API surface).  Viewset performs the duplicate-instance check.
      properties:
        report:
          type: string
          minLength: 1
          description: Report public_id (short UUID).
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        name:
          type: string
          nullable: true
        status:
          allOf:
          - $ref: '#/components/schemas/Status49eEnum'
          default: draft
      required:
      - report
    TEIToolUpdate:
      type: object
      description: Write serializer for ``PUT /tools/{id}/`` — only name/status are
        mutable.
      properties:
        name:
          type: string
          maxLength: 255
        status:
          $ref: '#/components/schemas/Status49eEnum'
      required:
      - name
    TEIToolUpdateRequest:
      type: object
      description: Write serializer for ``PUT /tools/{id}/`` — only name/status are
        mutable.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        status:
          $ref: '#/components/schemas/Status49eEnum'
      required:
      - name
    TableEnum:
      enum:
      - benefits
      - costs
      type: string
      description: |-
        * `benefits` - Benefits
        * `costs` - Costs
    TableSource:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        type:
          type: string
        app:
          type: string
        preview:
          type: string
        url:
          type: string
          nullable: true
      required:
      - app
      - id
      - preview
      - title
      - type
    Tag:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 50
      required:
      - id
      - name
    TagRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
      required:
      - name
    TermYearsEnum:
      enum:
      - 1
      - 2
      - 3
      - 4
      - 5
      type: integer
      description: |-
        * `1` - 1 Year
        * `2` - 2 Years
        * `3` - 3 Years
        * `4` - 4 Years
        * `5` - 5 Years
    TimeFormatEnum:
      enum:
      - 12-hour
      - 24-hour
      type: string
      description: |-
        * `12-hour` - 12-hour (3:30 PM)
        * `24-hour` - 24-hour (15:30)
    Timeline:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        title:
          type: string
          maxLength: 255
        description:
          type: string
        start_date:
          type: string
          format: date
        end_date:
          type: string
          readOnly: true
        progress_percentage:
          type: string
          readOnly: true
        milestones:
          type: array
          items:
            $ref: '#/components/schemas/Milestone'
          readOnly: true
        stages:
          type: array
          items:
            $ref: '#/components/schemas/Stage'
          readOnly: true
      required:
      - end_date
      - id
      - milestones
      - progress_percentage
      - stages
      - start_date
      - title
    TimelineRequest:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
        start_date:
          type: string
          format: date
      required:
      - start_date
      - title
    TimelineTool:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        description:
          type: string
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
        client_name:
          type: string
          readOnly: true
        association_display:
          type: string
          readOnly: true
        timelines:
          type: array
          items:
            $ref: '#/components/schemas/Timeline'
          readOnly: true
        timeline_count:
          type: string
          readOnly: true
        created_date:
          type: string
          format: date-time
          readOnly: true
        modified_date:
          type: string
          format: date-time
          readOnly: true
      required:
      - association_display
      - client_name
      - created_date
      - description
      - id
      - modified_date
      - name
      - timeline_count
      - timelines
    TimelineToolRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          minLength: 1
        proposal:
          type: integer
          nullable: true
        engagement:
          type: integer
          nullable: true
      required:
      - description
      - name
    UserProfile:
      type: object
      description: |-
        User profile serializer with preference settings.

        Provides access to user-specific configuration including:
        - Date and time format preferences
        - Timezone settings (home and local)
        - UI theme customization
      properties:
        date_format:
          allOf:
          - $ref: '#/components/schemas/DateFormatEnum'
          description: |-
            Preferred date display format

            * `YYYY-MM-DD` - 2024-12-25
            * `DD/MM/YYYY` - 25/12/2024
            * `MM/DD/YYYY` - 12/25/2024
            * `DD.MM.YYYY` - 25.12.2024
            * `DD-MM-YYYY` - 25-12-2024
        time_format:
          allOf:
          - $ref: '#/components/schemas/TimeFormatEnum'
          description: |-
            12-hour or 24-hour time format

            * `12-hour` - 12-hour (3:30 PM)
            * `24-hour` - 24-hour (15:30)
        home_timezone:
          allOf:
          - $ref: '#/components/schemas/HomeTimezoneEnum'
          description: |-
            User's home/permanent timezone

            * `Africa/Abidjan` - Africa/Abidjan
            * `Africa/Accra` - Africa/Accra
            * `Africa/Addis_Ababa` - Africa/Addis_Ababa
            * `Africa/Algiers` - Africa/Algiers
            * `Africa/Asmara` - Africa/Asmara
            * `Africa/Bamako` - Africa/Bamako
            * `Africa/Bangui` - Africa/Bangui
            * `Africa/Banjul` - Africa/Banjul
            * `Africa/Bissau` - Africa/Bissau
            * `Africa/Blantyre` - Africa/Blantyre
            * `Africa/Brazzaville` - Africa/Brazzaville
            * `Africa/Bujumbura` - Africa/Bujumbura
            * `Africa/Cairo` - Africa/Cairo
            * `Africa/Casablanca` - Africa/Casablanca
            * `Africa/Ceuta` - Africa/Ceuta
            * `Africa/Conakry` - Africa/Conakry
            * `Africa/Dakar` - Africa/Dakar
            * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
            * `Africa/Djibouti` - Africa/Djibouti
            * `Africa/Douala` - Africa/Douala
            * `Africa/El_Aaiun` - Africa/El_Aaiun
            * `Africa/Freetown` - Africa/Freetown
            * `Africa/Gaborone` - Africa/Gaborone
            * `Africa/Harare` - Africa/Harare
            * `Africa/Johannesburg` - Africa/Johannesburg
            * `Africa/Juba` - Africa/Juba
            * `Africa/Kampala` - Africa/Kampala
            * `Africa/Khartoum` - Africa/Khartoum
            * `Africa/Kigali` - Africa/Kigali
            * `Africa/Kinshasa` - Africa/Kinshasa
            * `Africa/Lagos` - Africa/Lagos
            * `Africa/Libreville` - Africa/Libreville
            * `Africa/Lome` - Africa/Lome
            * `Africa/Luanda` - Africa/Luanda
            * `Africa/Lubumbashi` - Africa/Lubumbashi
            * `Africa/Lusaka` - Africa/Lusaka
            * `Africa/Malabo` - Africa/Malabo
            * `Africa/Maputo` - Africa/Maputo
            * `Africa/Maseru` - Africa/Maseru
            * `Africa/Mbabane` - Africa/Mbabane
            * `Africa/Mogadishu` - Africa/Mogadishu
            * `Africa/Monrovia` - Africa/Monrovia
            * `Africa/Nairobi` - Africa/Nairobi
            * `Africa/Ndjamena` - Africa/Ndjamena
            * `Africa/Niamey` - Africa/Niamey
            * `Africa/Nouakchott` - Africa/Nouakchott
            * `Africa/Ouagadougou` - Africa/Ouagadougou
            * `Africa/Porto-Novo` - Africa/Porto-Novo
            * `Africa/Sao_Tome` - Africa/Sao_Tome
            * `Africa/Tripoli` - Africa/Tripoli
            * `Africa/Tunis` - Africa/Tunis
            * `Africa/Windhoek` - Africa/Windhoek
            * `America/Adak` - America/Adak
            * `America/Anchorage` - America/Anchorage
            * `America/Anguilla` - America/Anguilla
            * `America/Antigua` - America/Antigua
            * `America/Araguaina` - America/Araguaina
            * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
            * `America/Argentina/Catamarca` - America/Argentina/Catamarca
            * `America/Argentina/Cordoba` - America/Argentina/Cordoba
            * `America/Argentina/Jujuy` - America/Argentina/Jujuy
            * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
            * `America/Argentina/Mendoza` - America/Argentina/Mendoza
            * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
            * `America/Argentina/Salta` - America/Argentina/Salta
            * `America/Argentina/San_Juan` - America/Argentina/San_Juan
            * `America/Argentina/San_Luis` - America/Argentina/San_Luis
            * `America/Argentina/Tucuman` - America/Argentina/Tucuman
            * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
            * `America/Aruba` - America/Aruba
            * `America/Asuncion` - America/Asuncion
            * `America/Atikokan` - America/Atikokan
            * `America/Bahia` - America/Bahia
            * `America/Bahia_Banderas` - America/Bahia_Banderas
            * `America/Barbados` - America/Barbados
            * `America/Belem` - America/Belem
            * `America/Belize` - America/Belize
            * `America/Blanc-Sablon` - America/Blanc-Sablon
            * `America/Boa_Vista` - America/Boa_Vista
            * `America/Bogota` - America/Bogota
            * `America/Boise` - America/Boise
            * `America/Cambridge_Bay` - America/Cambridge_Bay
            * `America/Campo_Grande` - America/Campo_Grande
            * `America/Cancun` - America/Cancun
            * `America/Caracas` - America/Caracas
            * `America/Cayenne` - America/Cayenne
            * `America/Cayman` - America/Cayman
            * `America/Chicago` - America/Chicago
            * `America/Chihuahua` - America/Chihuahua
            * `America/Ciudad_Juarez` - America/Ciudad_Juarez
            * `America/Costa_Rica` - America/Costa_Rica
            * `America/Coyhaique` - America/Coyhaique
            * `America/Creston` - America/Creston
            * `America/Cuiaba` - America/Cuiaba
            * `America/Curacao` - America/Curacao
            * `America/Danmarkshavn` - America/Danmarkshavn
            * `America/Dawson` - America/Dawson
            * `America/Dawson_Creek` - America/Dawson_Creek
            * `America/Denver` - America/Denver
            * `America/Detroit` - America/Detroit
            * `America/Dominica` - America/Dominica
            * `America/Edmonton` - America/Edmonton
            * `America/Eirunepe` - America/Eirunepe
            * `America/El_Salvador` - America/El_Salvador
            * `America/Fort_Nelson` - America/Fort_Nelson
            * `America/Fortaleza` - America/Fortaleza
            * `America/Glace_Bay` - America/Glace_Bay
            * `America/Goose_Bay` - America/Goose_Bay
            * `America/Grand_Turk` - America/Grand_Turk
            * `America/Grenada` - America/Grenada
            * `America/Guadeloupe` - America/Guadeloupe
            * `America/Guatemala` - America/Guatemala
            * `America/Guayaquil` - America/Guayaquil
            * `America/Guyana` - America/Guyana
            * `America/Halifax` - America/Halifax
            * `America/Havana` - America/Havana
            * `America/Hermosillo` - America/Hermosillo
            * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
            * `America/Indiana/Knox` - America/Indiana/Knox
            * `America/Indiana/Marengo` - America/Indiana/Marengo
            * `America/Indiana/Petersburg` - America/Indiana/Petersburg
            * `America/Indiana/Tell_City` - America/Indiana/Tell_City
            * `America/Indiana/Vevay` - America/Indiana/Vevay
            * `America/Indiana/Vincennes` - America/Indiana/Vincennes
            * `America/Indiana/Winamac` - America/Indiana/Winamac
            * `America/Inuvik` - America/Inuvik
            * `America/Iqaluit` - America/Iqaluit
            * `America/Jamaica` - America/Jamaica
            * `America/Juneau` - America/Juneau
            * `America/Kentucky/Louisville` - America/Kentucky/Louisville
            * `America/Kentucky/Monticello` - America/Kentucky/Monticello
            * `America/Kralendijk` - America/Kralendijk
            * `America/La_Paz` - America/La_Paz
            * `America/Lima` - America/Lima
            * `America/Los_Angeles` - America/Los_Angeles
            * `America/Lower_Princes` - America/Lower_Princes
            * `America/Maceio` - America/Maceio
            * `America/Managua` - America/Managua
            * `America/Manaus` - America/Manaus
            * `America/Marigot` - America/Marigot
            * `America/Martinique` - America/Martinique
            * `America/Matamoros` - America/Matamoros
            * `America/Mazatlan` - America/Mazatlan
            * `America/Menominee` - America/Menominee
            * `America/Merida` - America/Merida
            * `America/Metlakatla` - America/Metlakatla
            * `America/Mexico_City` - America/Mexico_City
            * `America/Miquelon` - America/Miquelon
            * `America/Moncton` - America/Moncton
            * `America/Monterrey` - America/Monterrey
            * `America/Montevideo` - America/Montevideo
            * `America/Montserrat` - America/Montserrat
            * `America/Nassau` - America/Nassau
            * `America/New_York` - America/New_York
            * `America/Nome` - America/Nome
            * `America/Noronha` - America/Noronha
            * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
            * `America/North_Dakota/Center` - America/North_Dakota/Center
            * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
            * `America/Nuuk` - America/Nuuk
            * `America/Ojinaga` - America/Ojinaga
            * `America/Panama` - America/Panama
            * `America/Paramaribo` - America/Paramaribo
            * `America/Phoenix` - America/Phoenix
            * `America/Port-au-Prince` - America/Port-au-Prince
            * `America/Port_of_Spain` - America/Port_of_Spain
            * `America/Porto_Velho` - America/Porto_Velho
            * `America/Puerto_Rico` - America/Puerto_Rico
            * `America/Punta_Arenas` - America/Punta_Arenas
            * `America/Rankin_Inlet` - America/Rankin_Inlet
            * `America/Recife` - America/Recife
            * `America/Regina` - America/Regina
            * `America/Resolute` - America/Resolute
            * `America/Rio_Branco` - America/Rio_Branco
            * `America/Santarem` - America/Santarem
            * `America/Santiago` - America/Santiago
            * `America/Santo_Domingo` - America/Santo_Domingo
            * `America/Sao_Paulo` - America/Sao_Paulo
            * `America/Scoresbysund` - America/Scoresbysund
            * `America/Sitka` - America/Sitka
            * `America/St_Barthelemy` - America/St_Barthelemy
            * `America/St_Johns` - America/St_Johns
            * `America/St_Kitts` - America/St_Kitts
            * `America/St_Lucia` - America/St_Lucia
            * `America/St_Thomas` - America/St_Thomas
            * `America/St_Vincent` - America/St_Vincent
            * `America/Swift_Current` - America/Swift_Current
            * `America/Tegucigalpa` - America/Tegucigalpa
            * `America/Thule` - America/Thule
            * `America/Tijuana` - America/Tijuana
            * `America/Toronto` - America/Toronto
            * `America/Tortola` - America/Tortola
            * `America/Vancouver` - America/Vancouver
            * `America/Whitehorse` - America/Whitehorse
            * `America/Winnipeg` - America/Winnipeg
            * `America/Yakutat` - America/Yakutat
            * `Antarctica/Casey` - Antarctica/Casey
            * `Antarctica/Davis` - Antarctica/Davis
            * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
            * `Antarctica/Macquarie` - Antarctica/Macquarie
            * `Antarctica/Mawson` - Antarctica/Mawson
            * `Antarctica/McMurdo` - Antarctica/McMurdo
            * `Antarctica/Palmer` - Antarctica/Palmer
            * `Antarctica/Rothera` - Antarctica/Rothera
            * `Antarctica/Syowa` - Antarctica/Syowa
            * `Antarctica/Troll` - Antarctica/Troll
            * `Antarctica/Vostok` - Antarctica/Vostok
            * `Arctic/Longyearbyen` - Arctic/Longyearbyen
            * `Asia/Aden` - Asia/Aden
            * `Asia/Almaty` - Asia/Almaty
            * `Asia/Amman` - Asia/Amman
            * `Asia/Anadyr` - Asia/Anadyr
            * `Asia/Aqtau` - Asia/Aqtau
            * `Asia/Aqtobe` - Asia/Aqtobe
            * `Asia/Ashgabat` - Asia/Ashgabat
            * `Asia/Atyrau` - Asia/Atyrau
            * `Asia/Baghdad` - Asia/Baghdad
            * `Asia/Bahrain` - Asia/Bahrain
            * `Asia/Baku` - Asia/Baku
            * `Asia/Bangkok` - Asia/Bangkok
            * `Asia/Barnaul` - Asia/Barnaul
            * `Asia/Beirut` - Asia/Beirut
            * `Asia/Bishkek` - Asia/Bishkek
            * `Asia/Brunei` - Asia/Brunei
            * `Asia/Chita` - Asia/Chita
            * `Asia/Colombo` - Asia/Colombo
            * `Asia/Damascus` - Asia/Damascus
            * `Asia/Dhaka` - Asia/Dhaka
            * `Asia/Dili` - Asia/Dili
            * `Asia/Dubai` - Asia/Dubai
            * `Asia/Dushanbe` - Asia/Dushanbe
            * `Asia/Famagusta` - Asia/Famagusta
            * `Asia/Gaza` - Asia/Gaza
            * `Asia/Hebron` - Asia/Hebron
            * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
            * `Asia/Hong_Kong` - Asia/Hong_Kong
            * `Asia/Hovd` - Asia/Hovd
            * `Asia/Irkutsk` - Asia/Irkutsk
            * `Asia/Jakarta` - Asia/Jakarta
            * `Asia/Jayapura` - Asia/Jayapura
            * `Asia/Jerusalem` - Asia/Jerusalem
            * `Asia/Kabul` - Asia/Kabul
            * `Asia/Kamchatka` - Asia/Kamchatka
            * `Asia/Karachi` - Asia/Karachi
            * `Asia/Kathmandu` - Asia/Kathmandu
            * `Asia/Khandyga` - Asia/Khandyga
            * `Asia/Kolkata` - Asia/Kolkata
            * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
            * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
            * `Asia/Kuching` - Asia/Kuching
            * `Asia/Kuwait` - Asia/Kuwait
            * `Asia/Macau` - Asia/Macau
            * `Asia/Magadan` - Asia/Magadan
            * `Asia/Makassar` - Asia/Makassar
            * `Asia/Manila` - Asia/Manila
            * `Asia/Muscat` - Asia/Muscat
            * `Asia/Nicosia` - Asia/Nicosia
            * `Asia/Novokuznetsk` - Asia/Novokuznetsk
            * `Asia/Novosibirsk` - Asia/Novosibirsk
            * `Asia/Omsk` - Asia/Omsk
            * `Asia/Oral` - Asia/Oral
            * `Asia/Phnom_Penh` - Asia/Phnom_Penh
            * `Asia/Pontianak` - Asia/Pontianak
            * `Asia/Pyongyang` - Asia/Pyongyang
            * `Asia/Qatar` - Asia/Qatar
            * `Asia/Qostanay` - Asia/Qostanay
            * `Asia/Qyzylorda` - Asia/Qyzylorda
            * `Asia/Riyadh` - Asia/Riyadh
            * `Asia/Sakhalin` - Asia/Sakhalin
            * `Asia/Samarkand` - Asia/Samarkand
            * `Asia/Seoul` - Asia/Seoul
            * `Asia/Shanghai` - Asia/Shanghai
            * `Asia/Singapore` - Asia/Singapore
            * `Asia/Srednekolymsk` - Asia/Srednekolymsk
            * `Asia/Taipei` - Asia/Taipei
            * `Asia/Tashkent` - Asia/Tashkent
            * `Asia/Tbilisi` - Asia/Tbilisi
            * `Asia/Tehran` - Asia/Tehran
            * `Asia/Thimphu` - Asia/Thimphu
            * `Asia/Tokyo` - Asia/Tokyo
            * `Asia/Tomsk` - Asia/Tomsk
            * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
            * `Asia/Urumqi` - Asia/Urumqi
            * `Asia/Ust-Nera` - Asia/Ust-Nera
            * `Asia/Vientiane` - Asia/Vientiane
            * `Asia/Vladivostok` - Asia/Vladivostok
            * `Asia/Yakutsk` - Asia/Yakutsk
            * `Asia/Yangon` - Asia/Yangon
            * `Asia/Yekaterinburg` - Asia/Yekaterinburg
            * `Asia/Yerevan` - Asia/Yerevan
            * `Atlantic/Azores` - Atlantic/Azores
            * `Atlantic/Bermuda` - Atlantic/Bermuda
            * `Atlantic/Canary` - Atlantic/Canary
            * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
            * `Atlantic/Faroe` - Atlantic/Faroe
            * `Atlantic/Madeira` - Atlantic/Madeira
            * `Atlantic/Reykjavik` - Atlantic/Reykjavik
            * `Atlantic/South_Georgia` - Atlantic/South_Georgia
            * `Atlantic/St_Helena` - Atlantic/St_Helena
            * `Atlantic/Stanley` - Atlantic/Stanley
            * `Australia/Adelaide` - Australia/Adelaide
            * `Australia/Brisbane` - Australia/Brisbane
            * `Australia/Broken_Hill` - Australia/Broken_Hill
            * `Australia/Darwin` - Australia/Darwin
            * `Australia/Eucla` - Australia/Eucla
            * `Australia/Hobart` - Australia/Hobart
            * `Australia/Lindeman` - Australia/Lindeman
            * `Australia/Lord_Howe` - Australia/Lord_Howe
            * `Australia/Melbourne` - Australia/Melbourne
            * `Australia/Perth` - Australia/Perth
            * `Australia/Sydney` - Australia/Sydney
            * `Europe/Amsterdam` - Europe/Amsterdam
            * `Europe/Andorra` - Europe/Andorra
            * `Europe/Astrakhan` - Europe/Astrakhan
            * `Europe/Athens` - Europe/Athens
            * `Europe/Belgrade` - Europe/Belgrade
            * `Europe/Berlin` - Europe/Berlin
            * `Europe/Bratislava` - Europe/Bratislava
            * `Europe/Brussels` - Europe/Brussels
            * `Europe/Bucharest` - Europe/Bucharest
            * `Europe/Budapest` - Europe/Budapest
            * `Europe/Busingen` - Europe/Busingen
            * `Europe/Chisinau` - Europe/Chisinau
            * `Europe/Copenhagen` - Europe/Copenhagen
            * `Europe/Dublin` - Europe/Dublin
            * `Europe/Gibraltar` - Europe/Gibraltar
            * `Europe/Guernsey` - Europe/Guernsey
            * `Europe/Helsinki` - Europe/Helsinki
            * `Europe/Isle_of_Man` - Europe/Isle_of_Man
            * `Europe/Istanbul` - Europe/Istanbul
            * `Europe/Jersey` - Europe/Jersey
            * `Europe/Kaliningrad` - Europe/Kaliningrad
            * `Europe/Kirov` - Europe/Kirov
            * `Europe/Kyiv` - Europe/Kyiv
            * `Europe/Lisbon` - Europe/Lisbon
            * `Europe/Ljubljana` - Europe/Ljubljana
            * `Europe/London` - Europe/London
            * `Europe/Luxembourg` - Europe/Luxembourg
            * `Europe/Madrid` - Europe/Madrid
            * `Europe/Malta` - Europe/Malta
            * `Europe/Mariehamn` - Europe/Mariehamn
            * `Europe/Minsk` - Europe/Minsk
            * `Europe/Monaco` - Europe/Monaco
            * `Europe/Moscow` - Europe/Moscow
            * `Europe/Oslo` - Europe/Oslo
            * `Europe/Paris` - Europe/Paris
            * `Europe/Podgorica` - Europe/Podgorica
            * `Europe/Prague` - Europe/Prague
            * `Europe/Riga` - Europe/Riga
            * `Europe/Rome` - Europe/Rome
            * `Europe/Samara` - Europe/Samara
            * `Europe/San_Marino` - Europe/San_Marino
            * `Europe/Sarajevo` - Europe/Sarajevo
            * `Europe/Saratov` - Europe/Saratov
            * `Europe/Simferopol` - Europe/Simferopol
            * `Europe/Skopje` - Europe/Skopje
            * `Europe/Sofia` - Europe/Sofia
            * `Europe/Stockholm` - Europe/Stockholm
            * `Europe/Tallinn` - Europe/Tallinn
            * `Europe/Tirane` - Europe/Tirane
            * `Europe/Ulyanovsk` - Europe/Ulyanovsk
            * `Europe/Vaduz` - Europe/Vaduz
            * `Europe/Vatican` - Europe/Vatican
            * `Europe/Vienna` - Europe/Vienna
            * `Europe/Vilnius` - Europe/Vilnius
            * `Europe/Volgograd` - Europe/Volgograd
            * `Europe/Warsaw` - Europe/Warsaw
            * `Europe/Zagreb` - Europe/Zagreb
            * `Europe/Zurich` - Europe/Zurich
            * `GMT` - GMT
            * `Indian/Antananarivo` - Indian/Antananarivo
            * `Indian/Chagos` - Indian/Chagos
            * `Indian/Christmas` - Indian/Christmas
            * `Indian/Cocos` - Indian/Cocos
            * `Indian/Comoro` - Indian/Comoro
            * `Indian/Kerguelen` - Indian/Kerguelen
            * `Indian/Mahe` - Indian/Mahe
            * `Indian/Maldives` - Indian/Maldives
            * `Indian/Mauritius` - Indian/Mauritius
            * `Indian/Mayotte` - Indian/Mayotte
            * `Indian/Reunion` - Indian/Reunion
            * `Pacific/Apia` - Pacific/Apia
            * `Pacific/Auckland` - Pacific/Auckland
            * `Pacific/Bougainville` - Pacific/Bougainville
            * `Pacific/Chatham` - Pacific/Chatham
            * `Pacific/Chuuk` - Pacific/Chuuk
            * `Pacific/Easter` - Pacific/Easter
            * `Pacific/Efate` - Pacific/Efate
            * `Pacific/Fakaofo` - Pacific/Fakaofo
            * `Pacific/Fiji` - Pacific/Fiji
            * `Pacific/Funafuti` - Pacific/Funafuti
            * `Pacific/Galapagos` - Pacific/Galapagos
            * `Pacific/Gambier` - Pacific/Gambier
            * `Pacific/Guadalcanal` - Pacific/Guadalcanal
            * `Pacific/Guam` - Pacific/Guam
            * `Pacific/Honolulu` - Pacific/Honolulu
            * `Pacific/Kanton` - Pacific/Kanton
            * `Pacific/Kiritimati` - Pacific/Kiritimati
            * `Pacific/Kosrae` - Pacific/Kosrae
            * `Pacific/Kwajalein` - Pacific/Kwajalein
            * `Pacific/Majuro` - Pacific/Majuro
            * `Pacific/Marquesas` - Pacific/Marquesas
            * `Pacific/Midway` - Pacific/Midway
            * `Pacific/Nauru` - Pacific/Nauru
            * `Pacific/Niue` - Pacific/Niue
            * `Pacific/Norfolk` - Pacific/Norfolk
            * `Pacific/Noumea` - Pacific/Noumea
            * `Pacific/Pago_Pago` - Pacific/Pago_Pago
            * `Pacific/Palau` - Pacific/Palau
            * `Pacific/Pitcairn` - Pacific/Pitcairn
            * `Pacific/Pohnpei` - Pacific/Pohnpei
            * `Pacific/Port_Moresby` - Pacific/Port_Moresby
            * `Pacific/Rarotonga` - Pacific/Rarotonga
            * `Pacific/Saipan` - Pacific/Saipan
            * `Pacific/Tahiti` - Pacific/Tahiti
            * `Pacific/Tarawa` - Pacific/Tarawa
            * `Pacific/Tongatapu` - Pacific/Tongatapu
            * `Pacific/Wake` - Pacific/Wake
            * `Pacific/Wallis` - Pacific/Wallis
            * `UTC` - UTC
        local_timezone:
          nullable: true
          description: |-
            User's current local timezone (if traveling)

            * `Africa/Abidjan` - Africa/Abidjan
            * `Africa/Accra` - Africa/Accra
            * `Africa/Addis_Ababa` - Africa/Addis_Ababa
            * `Africa/Algiers` - Africa/Algiers
            * `Africa/Asmara` - Africa/Asmara
            * `Africa/Bamako` - Africa/Bamako
            * `Africa/Bangui` - Africa/Bangui
            * `Africa/Banjul` - Africa/Banjul
            * `Africa/Bissau` - Africa/Bissau
            * `Africa/Blantyre` - Africa/Blantyre
            * `Africa/Brazzaville` - Africa/Brazzaville
            * `Africa/Bujumbura` - Africa/Bujumbura
            * `Africa/Cairo` - Africa/Cairo
            * `Africa/Casablanca` - Africa/Casablanca
            * `Africa/Ceuta` - Africa/Ceuta
            * `Africa/Conakry` - Africa/Conakry
            * `Africa/Dakar` - Africa/Dakar
            * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
            * `Africa/Djibouti` - Africa/Djibouti
            * `Africa/Douala` - Africa/Douala
            * `Africa/El_Aaiun` - Africa/El_Aaiun
            * `Africa/Freetown` - Africa/Freetown
            * `Africa/Gaborone` - Africa/Gaborone
            * `Africa/Harare` - Africa/Harare
            * `Africa/Johannesburg` - Africa/Johannesburg
            * `Africa/Juba` - Africa/Juba
            * `Africa/Kampala` - Africa/Kampala
            * `Africa/Khartoum` - Africa/Khartoum
            * `Africa/Kigali` - Africa/Kigali
            * `Africa/Kinshasa` - Africa/Kinshasa
            * `Africa/Lagos` - Africa/Lagos
            * `Africa/Libreville` - Africa/Libreville
            * `Africa/Lome` - Africa/Lome
            * `Africa/Luanda` - Africa/Luanda
            * `Africa/Lubumbashi` - Africa/Lubumbashi
            * `Africa/Lusaka` - Africa/Lusaka
            * `Africa/Malabo` - Africa/Malabo
            * `Africa/Maputo` - Africa/Maputo
            * `Africa/Maseru` - Africa/Maseru
            * `Africa/Mbabane` - Africa/Mbabane
            * `Africa/Mogadishu` - Africa/Mogadishu
            * `Africa/Monrovia` - Africa/Monrovia
            * `Africa/Nairobi` - Africa/Nairobi
            * `Africa/Ndjamena` - Africa/Ndjamena
            * `Africa/Niamey` - Africa/Niamey
            * `Africa/Nouakchott` - Africa/Nouakchott
            * `Africa/Ouagadougou` - Africa/Ouagadougou
            * `Africa/Porto-Novo` - Africa/Porto-Novo
            * `Africa/Sao_Tome` - Africa/Sao_Tome
            * `Africa/Tripoli` - Africa/Tripoli
            * `Africa/Tunis` - Africa/Tunis
            * `Africa/Windhoek` - Africa/Windhoek
            * `America/Adak` - America/Adak
            * `America/Anchorage` - America/Anchorage
            * `America/Anguilla` - America/Anguilla
            * `America/Antigua` - America/Antigua
            * `America/Araguaina` - America/Araguaina
            * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
            * `America/Argentina/Catamarca` - America/Argentina/Catamarca
            * `America/Argentina/Cordoba` - America/Argentina/Cordoba
            * `America/Argentina/Jujuy` - America/Argentina/Jujuy
            * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
            * `America/Argentina/Mendoza` - America/Argentina/Mendoza
            * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
            * `America/Argentina/Salta` - America/Argentina/Salta
            * `America/Argentina/San_Juan` - America/Argentina/San_Juan
            * `America/Argentina/San_Luis` - America/Argentina/San_Luis
            * `America/Argentina/Tucuman` - America/Argentina/Tucuman
            * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
            * `America/Aruba` - America/Aruba
            * `America/Asuncion` - America/Asuncion
            * `America/Atikokan` - America/Atikokan
            * `America/Bahia` - America/Bahia
            * `America/Bahia_Banderas` - America/Bahia_Banderas
            * `America/Barbados` - America/Barbados
            * `America/Belem` - America/Belem
            * `America/Belize` - America/Belize
            * `America/Blanc-Sablon` - America/Blanc-Sablon
            * `America/Boa_Vista` - America/Boa_Vista
            * `America/Bogota` - America/Bogota
            * `America/Boise` - America/Boise
            * `America/Cambridge_Bay` - America/Cambridge_Bay
            * `America/Campo_Grande` - America/Campo_Grande
            * `America/Cancun` - America/Cancun
            * `America/Caracas` - America/Caracas
            * `America/Cayenne` - America/Cayenne
            * `America/Cayman` - America/Cayman
            * `America/Chicago` - America/Chicago
            * `America/Chihuahua` - America/Chihuahua
            * `America/Ciudad_Juarez` - America/Ciudad_Juarez
            * `America/Costa_Rica` - America/Costa_Rica
            * `America/Coyhaique` - America/Coyhaique
            * `America/Creston` - America/Creston
            * `America/Cuiaba` - America/Cuiaba
            * `America/Curacao` - America/Curacao
            * `America/Danmarkshavn` - America/Danmarkshavn
            * `America/Dawson` - America/Dawson
            * `America/Dawson_Creek` - America/Dawson_Creek
            * `America/Denver` - America/Denver
            * `America/Detroit` - America/Detroit
            * `America/Dominica` - America/Dominica
            * `America/Edmonton` - America/Edmonton
            * `America/Eirunepe` - America/Eirunepe
            * `America/El_Salvador` - America/El_Salvador
            * `America/Fort_Nelson` - America/Fort_Nelson
            * `America/Fortaleza` - America/Fortaleza
            * `America/Glace_Bay` - America/Glace_Bay
            * `America/Goose_Bay` - America/Goose_Bay
            * `America/Grand_Turk` - America/Grand_Turk
            * `America/Grenada` - America/Grenada
            * `America/Guadeloupe` - America/Guadeloupe
            * `America/Guatemala` - America/Guatemala
            * `America/Guayaquil` - America/Guayaquil
            * `America/Guyana` - America/Guyana
            * `America/Halifax` - America/Halifax
            * `America/Havana` - America/Havana
            * `America/Hermosillo` - America/Hermosillo
            * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
            * `America/Indiana/Knox` - America/Indiana/Knox
            * `America/Indiana/Marengo` - America/Indiana/Marengo
            * `America/Indiana/Petersburg` - America/Indiana/Petersburg
            * `America/Indiana/Tell_City` - America/Indiana/Tell_City
            * `America/Indiana/Vevay` - America/Indiana/Vevay
            * `America/Indiana/Vincennes` - America/Indiana/Vincennes
            * `America/Indiana/Winamac` - America/Indiana/Winamac
            * `America/Inuvik` - America/Inuvik
            * `America/Iqaluit` - America/Iqaluit
            * `America/Jamaica` - America/Jamaica
            * `America/Juneau` - America/Juneau
            * `America/Kentucky/Louisville` - America/Kentucky/Louisville
            * `America/Kentucky/Monticello` - America/Kentucky/Monticello
            * `America/Kralendijk` - America/Kralendijk
            * `America/La_Paz` - America/La_Paz
            * `America/Lima` - America/Lima
            * `America/Los_Angeles` - America/Los_Angeles
            * `America/Lower_Princes` - America/Lower_Princes
            * `America/Maceio` - America/Maceio
            * `America/Managua` - America/Managua
            * `America/Manaus` - America/Manaus
            * `America/Marigot` - America/Marigot
            * `America/Martinique` - America/Martinique
            * `America/Matamoros` - America/Matamoros
            * `America/Mazatlan` - America/Mazatlan
            * `America/Menominee` - America/Menominee
            * `America/Merida` - America/Merida
            * `America/Metlakatla` - America/Metlakatla
            * `America/Mexico_City` - America/Mexico_City
            * `America/Miquelon` - America/Miquelon
            * `America/Moncton` - America/Moncton
            * `America/Monterrey` - America/Monterrey
            * `America/Montevideo` - America/Montevideo
            * `America/Montserrat` - America/Montserrat
            * `America/Nassau` - America/Nassau
            * `America/New_York` - America/New_York
            * `America/Nome` - America/Nome
            * `America/Noronha` - America/Noronha
            * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
            * `America/North_Dakota/Center` - America/North_Dakota/Center
            * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
            * `America/Nuuk` - America/Nuuk
            * `America/Ojinaga` - America/Ojinaga
            * `America/Panama` - America/Panama
            * `America/Paramaribo` - America/Paramaribo
            * `America/Phoenix` - America/Phoenix
            * `America/Port-au-Prince` - America/Port-au-Prince
            * `America/Port_of_Spain` - America/Port_of_Spain
            * `America/Porto_Velho` - America/Porto_Velho
            * `America/Puerto_Rico` - America/Puerto_Rico
            * `America/Punta_Arenas` - America/Punta_Arenas
            * `America/Rankin_Inlet` - America/Rankin_Inlet
            * `America/Recife` - America/Recife
            * `America/Regina` - America/Regina
            * `America/Resolute` - America/Resolute
            * `America/Rio_Branco` - America/Rio_Branco
            * `America/Santarem` - America/Santarem
            * `America/Santiago` - America/Santiago
            * `America/Santo_Domingo` - America/Santo_Domingo
            * `America/Sao_Paulo` - America/Sao_Paulo
            * `America/Scoresbysund` - America/Scoresbysund
            * `America/Sitka` - America/Sitka
            * `America/St_Barthelemy` - America/St_Barthelemy
            * `America/St_Johns` - America/St_Johns
            * `America/St_Kitts` - America/St_Kitts
            * `America/St_Lucia` - America/St_Lucia
            * `America/St_Thomas` - America/St_Thomas
            * `America/St_Vincent` - America/St_Vincent
            * `America/Swift_Current` - America/Swift_Current
            * `America/Tegucigalpa` - America/Tegucigalpa
            * `America/Thule` - America/Thule
            * `America/Tijuana` - America/Tijuana
            * `America/Toronto` - America/Toronto
            * `America/Tortola` - America/Tortola
            * `America/Vancouver` - America/Vancouver
            * `America/Whitehorse` - America/Whitehorse
            * `America/Winnipeg` - America/Winnipeg
            * `America/Yakutat` - America/Yakutat
            * `Antarctica/Casey` - Antarctica/Casey
            * `Antarctica/Davis` - Antarctica/Davis
            * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
            * `Antarctica/Macquarie` - Antarctica/Macquarie
            * `Antarctica/Mawson` - Antarctica/Mawson
            * `Antarctica/McMurdo` - Antarctica/McMurdo
            * `Antarctica/Palmer` - Antarctica/Palmer
            * `Antarctica/Rothera` - Antarctica/Rothera
            * `Antarctica/Syowa` - Antarctica/Syowa
            * `Antarctica/Troll` - Antarctica/Troll
            * `Antarctica/Vostok` - Antarctica/Vostok
            * `Arctic/Longyearbyen` - Arctic/Longyearbyen
            * `Asia/Aden` - Asia/Aden
            * `Asia/Almaty` - Asia/Almaty
            * `Asia/Amman` - Asia/Amman
            * `Asia/Anadyr` - Asia/Anadyr
            * `Asia/Aqtau` - Asia/Aqtau
            * `Asia/Aqtobe` - Asia/Aqtobe
            * `Asia/Ashgabat` - Asia/Ashgabat
            * `Asia/Atyrau` - Asia/Atyrau
            * `Asia/Baghdad` - Asia/Baghdad
            * `Asia/Bahrain` - Asia/Bahrain
            * `Asia/Baku` - Asia/Baku
            * `Asia/Bangkok` - Asia/Bangkok
            * `Asia/Barnaul` - Asia/Barnaul
            * `Asia/Beirut` - Asia/Beirut
            * `Asia/Bishkek` - Asia/Bishkek
            * `Asia/Brunei` - Asia/Brunei
            * `Asia/Chita` - Asia/Chita
            * `Asia/Colombo` - Asia/Colombo
            * `Asia/Damascus` - Asia/Damascus
            * `Asia/Dhaka` - Asia/Dhaka
            * `Asia/Dili` - Asia/Dili
            * `Asia/Dubai` - Asia/Dubai
            * `Asia/Dushanbe` - Asia/Dushanbe
            * `Asia/Famagusta` - Asia/Famagusta
            * `Asia/Gaza` - Asia/Gaza
            * `Asia/Hebron` - Asia/Hebron
            * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
            * `Asia/Hong_Kong` - Asia/Hong_Kong
            * `Asia/Hovd` - Asia/Hovd
            * `Asia/Irkutsk` - Asia/Irkutsk
            * `Asia/Jakarta` - Asia/Jakarta
            * `Asia/Jayapura` - Asia/Jayapura
            * `Asia/Jerusalem` - Asia/Jerusalem
            * `Asia/Kabul` - Asia/Kabul
            * `Asia/Kamchatka` - Asia/Kamchatka
            * `Asia/Karachi` - Asia/Karachi
            * `Asia/Kathmandu` - Asia/Kathmandu
            * `Asia/Khandyga` - Asia/Khandyga
            * `Asia/Kolkata` - Asia/Kolkata
            * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
            * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
            * `Asia/Kuching` - Asia/Kuching
            * `Asia/Kuwait` - Asia/Kuwait
            * `Asia/Macau` - Asia/Macau
            * `Asia/Magadan` - Asia/Magadan
            * `Asia/Makassar` - Asia/Makassar
            * `Asia/Manila` - Asia/Manila
            * `Asia/Muscat` - Asia/Muscat
            * `Asia/Nicosia` - Asia/Nicosia
            * `Asia/Novokuznetsk` - Asia/Novokuznetsk
            * `Asia/Novosibirsk` - Asia/Novosibirsk
            * `Asia/Omsk` - Asia/Omsk
            * `Asia/Oral` - Asia/Oral
            * `Asia/Phnom_Penh` - Asia/Phnom_Penh
            * `Asia/Pontianak` - Asia/Pontianak
            * `Asia/Pyongyang` - Asia/Pyongyang
            * `Asia/Qatar` - Asia/Qatar
            * `Asia/Qostanay` - Asia/Qostanay
            * `Asia/Qyzylorda` - Asia/Qyzylorda
            * `Asia/Riyadh` - Asia/Riyadh
            * `Asia/Sakhalin` - Asia/Sakhalin
            * `Asia/Samarkand` - Asia/Samarkand
            * `Asia/Seoul` - Asia/Seoul
            * `Asia/Shanghai` - Asia/Shanghai
            * `Asia/Singapore` - Asia/Singapore
            * `Asia/Srednekolymsk` - Asia/Srednekolymsk
            * `Asia/Taipei` - Asia/Taipei
            * `Asia/Tashkent` - Asia/Tashkent
            * `Asia/Tbilisi` - Asia/Tbilisi
            * `Asia/Tehran` - Asia/Tehran
            * `Asia/Thimphu` - Asia/Thimphu
            * `Asia/Tokyo` - Asia/Tokyo
            * `Asia/Tomsk` - Asia/Tomsk
            * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
            * `Asia/Urumqi` - Asia/Urumqi
            * `Asia/Ust-Nera` - Asia/Ust-Nera
            * `Asia/Vientiane` - Asia/Vientiane
            * `Asia/Vladivostok` - Asia/Vladivostok
            * `Asia/Yakutsk` - Asia/Yakutsk
            * `Asia/Yangon` - Asia/Yangon
            * `Asia/Yekaterinburg` - Asia/Yekaterinburg
            * `Asia/Yerevan` - Asia/Yerevan
            * `Atlantic/Azores` - Atlantic/Azores
            * `Atlantic/Bermuda` - Atlantic/Bermuda
            * `Atlantic/Canary` - Atlantic/Canary
            * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
            * `Atlantic/Faroe` - Atlantic/Faroe
            * `Atlantic/Madeira` - Atlantic/Madeira
            * `Atlantic/Reykjavik` - Atlantic/Reykjavik
            * `Atlantic/South_Georgia` - Atlantic/South_Georgia
            * `Atlantic/St_Helena` - Atlantic/St_Helena
            * `Atlantic/Stanley` - Atlantic/Stanley
            * `Australia/Adelaide` - Australia/Adelaide
            * `Australia/Brisbane` - Australia/Brisbane
            * `Australia/Broken_Hill` - Australia/Broken_Hill
            * `Australia/Darwin` - Australia/Darwin
            * `Australia/Eucla` - Australia/Eucla
            * `Australia/Hobart` - Australia/Hobart
            * `Australia/Lindeman` - Australia/Lindeman
            * `Australia/Lord_Howe` - Australia/Lord_Howe
            * `Australia/Melbourne` - Australia/Melbourne
            * `Australia/Perth` - Australia/Perth
            * `Australia/Sydney` - Australia/Sydney
            * `Europe/Amsterdam` - Europe/Amsterdam
            * `Europe/Andorra` - Europe/Andorra
            * `Europe/Astrakhan` - Europe/Astrakhan
            * `Europe/Athens` - Europe/Athens
            * `Europe/Belgrade` - Europe/Belgrade
            * `Europe/Berlin` - Europe/Berlin
            * `Europe/Bratislava` - Europe/Bratislava
            * `Europe/Brussels` - Europe/Brussels
            * `Europe/Bucharest` - Europe/Bucharest
            * `Europe/Budapest` - Europe/Budapest
            * `Europe/Busingen` - Europe/Busingen
            * `Europe/Chisinau` - Europe/Chisinau
            * `Europe/Copenhagen` - Europe/Copenhagen
            * `Europe/Dublin` - Europe/Dublin
            * `Europe/Gibraltar` - Europe/Gibraltar
            * `Europe/Guernsey` - Europe/Guernsey
            * `Europe/Helsinki` - Europe/Helsinki
            * `Europe/Isle_of_Man` - Europe/Isle_of_Man
            * `Europe/Istanbul` - Europe/Istanbul
            * `Europe/Jersey` - Europe/Jersey
            * `Europe/Kaliningrad` - Europe/Kaliningrad
            * `Europe/Kirov` - Europe/Kirov
            * `Europe/Kyiv` - Europe/Kyiv
            * `Europe/Lisbon` - Europe/Lisbon
            * `Europe/Ljubljana` - Europe/Ljubljana
            * `Europe/London` - Europe/London
            * `Europe/Luxembourg` - Europe/Luxembourg
            * `Europe/Madrid` - Europe/Madrid
            * `Europe/Malta` - Europe/Malta
            * `Europe/Mariehamn` - Europe/Mariehamn
            * `Europe/Minsk` - Europe/Minsk
            * `Europe/Monaco` - Europe/Monaco
            * `Europe/Moscow` - Europe/Moscow
            * `Europe/Oslo` - Europe/Oslo
            * `Europe/Paris` - Europe/Paris
            * `Europe/Podgorica` - Europe/Podgorica
            * `Europe/Prague` - Europe/Prague
            * `Europe/Riga` - Europe/Riga
            * `Europe/Rome` - Europe/Rome
            * `Europe/Samara` - Europe/Samara
            * `Europe/San_Marino` - Europe/San_Marino
            * `Europe/Sarajevo` - Europe/Sarajevo
            * `Europe/Saratov` - Europe/Saratov
            * `Europe/Simferopol` - Europe/Simferopol
            * `Europe/Skopje` - Europe/Skopje
            * `Europe/Sofia` - Europe/Sofia
            * `Europe/Stockholm` - Europe/Stockholm
            * `Europe/Tallinn` - Europe/Tallinn
            * `Europe/Tirane` - Europe/Tirane
            * `Europe/Ulyanovsk` - Europe/Ulyanovsk
            * `Europe/Vaduz` - Europe/Vaduz
            * `Europe/Vatican` - Europe/Vatican
            * `Europe/Vienna` - Europe/Vienna
            * `Europe/Vilnius` - Europe/Vilnius
            * `Europe/Volgograd` - Europe/Volgograd
            * `Europe/Warsaw` - Europe/Warsaw
            * `Europe/Zagreb` - Europe/Zagreb
            * `Europe/Zurich` - Europe/Zurich
            * `GMT` - GMT
            * `Indian/Antananarivo` - Indian/Antananarivo
            * `Indian/Chagos` - Indian/Chagos
            * `Indian/Christmas` - Indian/Christmas
            * `Indian/Cocos` - Indian/Cocos
            * `Indian/Comoro` - Indian/Comoro
            * `Indian/Kerguelen` - Indian/Kerguelen
            * `Indian/Mahe` - Indian/Mahe
            * `Indian/Maldives` - Indian/Maldives
            * `Indian/Mauritius` - Indian/Mauritius
            * `Indian/Mayotte` - Indian/Mayotte
            * `Indian/Reunion` - Indian/Reunion
            * `Pacific/Apia` - Pacific/Apia
            * `Pacific/Auckland` - Pacific/Auckland
            * `Pacific/Bougainville` - Pacific/Bougainville
            * `Pacific/Chatham` - Pacific/Chatham
            * `Pacific/Chuuk` - Pacific/Chuuk
            * `Pacific/Easter` - Pacific/Easter
            * `Pacific/Efate` - Pacific/Efate
            * `Pacific/Fakaofo` - Pacific/Fakaofo
            * `Pacific/Fiji` - Pacific/Fiji
            * `Pacific/Funafuti` - Pacific/Funafuti
            * `Pacific/Galapagos` - Pacific/Galapagos
            * `Pacific/Gambier` - Pacific/Gambier
            * `Pacific/Guadalcanal` - Pacific/Guadalcanal
            * `Pacific/Guam` - Pacific/Guam
            * `Pacific/Honolulu` - Pacific/Honolulu
            * `Pacific/Kanton` - Pacific/Kanton
            * `Pacific/Kiritimati` - Pacific/Kiritimati
            * `Pacific/Kosrae` - Pacific/Kosrae
            * `Pacific/Kwajalein` - Pacific/Kwajalein
            * `Pacific/Majuro` - Pacific/Majuro
            * `Pacific/Marquesas` - Pacific/Marquesas
            * `Pacific/Midway` - Pacific/Midway
            * `Pacific/Nauru` - Pacific/Nauru
            * `Pacific/Niue` - Pacific/Niue
            * `Pacific/Norfolk` - Pacific/Norfolk
            * `Pacific/Noumea` - Pacific/Noumea
            * `Pacific/Pago_Pago` - Pacific/Pago_Pago
            * `Pacific/Palau` - Pacific/Palau
            * `Pacific/Pitcairn` - Pacific/Pitcairn
            * `Pacific/Pohnpei` - Pacific/Pohnpei
            * `Pacific/Port_Moresby` - Pacific/Port_Moresby
            * `Pacific/Rarotonga` - Pacific/Rarotonga
            * `Pacific/Saipan` - Pacific/Saipan
            * `Pacific/Tahiti` - Pacific/Tahiti
            * `Pacific/Tarawa` - Pacific/Tarawa
            * `Pacific/Tongatapu` - Pacific/Tongatapu
            * `Pacific/Wake` - Pacific/Wake
            * `Pacific/Wallis` - Pacific/Wallis
            * `UTC` - UTC
          oneOf:
          - $ref: '#/components/schemas/LocalTimezoneEnum'
          - $ref: '#/components/schemas/BlankEnum'
          - $ref: '#/components/schemas/NullEnum'
        bootswatch_theme:
          type: integer
          nullable: true
          description: Bootswatch theme for light mode
    UserProfileRequest:
      type: object
      description: |-
        User profile serializer with preference settings.

        Provides access to user-specific configuration including:
        - Date and time format preferences
        - Timezone settings (home and local)
        - UI theme customization
      properties:
        date_format:
          allOf:
          - $ref: '#/components/schemas/DateFormatEnum'
          description: |-
            Preferred date display format

            * `YYYY-MM-DD` - 2024-12-25
            * `DD/MM/YYYY` - 25/12/2024
            * `MM/DD/YYYY` - 12/25/2024
            * `DD.MM.YYYY` - 25.12.2024
            * `DD-MM-YYYY` - 25-12-2024
        time_format:
          allOf:
          - $ref: '#/components/schemas/TimeFormatEnum'
          description: |-
            12-hour or 24-hour time format

            * `12-hour` - 12-hour (3:30 PM)
            * `24-hour` - 24-hour (15:30)
        home_timezone:
          allOf:
          - $ref: '#/components/schemas/HomeTimezoneEnum'
          description: |-
            User's home/permanent timezone

            * `Africa/Abidjan` - Africa/Abidjan
            * `Africa/Accra` - Africa/Accra
            * `Africa/Addis_Ababa` - Africa/Addis_Ababa
            * `Africa/Algiers` - Africa/Algiers
            * `Africa/Asmara` - Africa/Asmara
            * `Africa/Bamako` - Africa/Bamako
            * `Africa/Bangui` - Africa/Bangui
            * `Africa/Banjul` - Africa/Banjul
            * `Africa/Bissau` - Africa/Bissau
            * `Africa/Blantyre` - Africa/Blantyre
            * `Africa/Brazzaville` - Africa/Brazzaville
            * `Africa/Bujumbura` - Africa/Bujumbura
            * `Africa/Cairo` - Africa/Cairo
            * `Africa/Casablanca` - Africa/Casablanca
            * `Africa/Ceuta` - Africa/Ceuta
            * `Africa/Conakry` - Africa/Conakry
            * `Africa/Dakar` - Africa/Dakar
            * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
            * `Africa/Djibouti` - Africa/Djibouti
            * `Africa/Douala` - Africa/Douala
            * `Africa/El_Aaiun` - Africa/El_Aaiun
            * `Africa/Freetown` - Africa/Freetown
            * `Africa/Gaborone` - Africa/Gaborone
            * `Africa/Harare` - Africa/Harare
            * `Africa/Johannesburg` - Africa/Johannesburg
            * `Africa/Juba` - Africa/Juba
            * `Africa/Kampala` - Africa/Kampala
            * `Africa/Khartoum` - Africa/Khartoum
            * `Africa/Kigali` - Africa/Kigali
            * `Africa/Kinshasa` - Africa/Kinshasa
            * `Africa/Lagos` - Africa/Lagos
            * `Africa/Libreville` - Africa/Libreville
            * `Africa/Lome` - Africa/Lome
            * `Africa/Luanda` - Africa/Luanda
            * `Africa/Lubumbashi` - Africa/Lubumbashi
            * `Africa/Lusaka` - Africa/Lusaka
            * `Africa/Malabo` - Africa/Malabo
            * `Africa/Maputo` - Africa/Maputo
            * `Africa/Maseru` - Africa/Maseru
            * `Africa/Mbabane` - Africa/Mbabane
            * `Africa/Mogadishu` - Africa/Mogadishu
            * `Africa/Monrovia` - Africa/Monrovia
            * `Africa/Nairobi` - Africa/Nairobi
            * `Africa/Ndjamena` - Africa/Ndjamena
            * `Africa/Niamey` - Africa/Niamey
            * `Africa/Nouakchott` - Africa/Nouakchott
            * `Africa/Ouagadougou` - Africa/Ouagadougou
            * `Africa/Porto-Novo` - Africa/Porto-Novo
            * `Africa/Sao_Tome` - Africa/Sao_Tome
            * `Africa/Tripoli` - Africa/Tripoli
            * `Africa/Tunis` - Africa/Tunis
            * `Africa/Windhoek` - Africa/Windhoek
            * `America/Adak` - America/Adak
            * `America/Anchorage` - America/Anchorage
            * `America/Anguilla` - America/Anguilla
            * `America/Antigua` - America/Antigua
            * `America/Araguaina` - America/Araguaina
            * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
            * `America/Argentina/Catamarca` - America/Argentina/Catamarca
            * `America/Argentina/Cordoba` - America/Argentina/Cordoba
            * `America/Argentina/Jujuy` - America/Argentina/Jujuy
            * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
            * `America/Argentina/Mendoza` - America/Argentina/Mendoza
            * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
            * `America/Argentina/Salta` - America/Argentina/Salta
            * `America/Argentina/San_Juan` - America/Argentina/San_Juan
            * `America/Argentina/San_Luis` - America/Argentina/San_Luis
            * `America/Argentina/Tucuman` - America/Argentina/Tucuman
            * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
            * `America/Aruba` - America/Aruba
            * `America/Asuncion` - America/Asuncion
            * `America/Atikokan` - America/Atikokan
            * `America/Bahia` - America/Bahia
            * `America/Bahia_Banderas` - America/Bahia_Banderas
            * `America/Barbados` - America/Barbados
            * `America/Belem` - America/Belem
            * `America/Belize` - America/Belize
            * `America/Blanc-Sablon` - America/Blanc-Sablon
            * `America/Boa_Vista` - America/Boa_Vista
            * `America/Bogota` - America/Bogota
            * `America/Boise` - America/Boise
            * `America/Cambridge_Bay` - America/Cambridge_Bay
            * `America/Campo_Grande` - America/Campo_Grande
            * `America/Cancun` - America/Cancun
            * `America/Caracas` - America/Caracas
            * `America/Cayenne` - America/Cayenne
            * `America/Cayman` - America/Cayman
            * `America/Chicago` - America/Chicago
            * `America/Chihuahua` - America/Chihuahua
            * `America/Ciudad_Juarez` - America/Ciudad_Juarez
            * `America/Costa_Rica` - America/Costa_Rica
            * `America/Coyhaique` - America/Coyhaique
            * `America/Creston` - America/Creston
            * `America/Cuiaba` - America/Cuiaba
            * `America/Curacao` - America/Curacao
            * `America/Danmarkshavn` - America/Danmarkshavn
            * `America/Dawson` - America/Dawson
            * `America/Dawson_Creek` - America/Dawson_Creek
            * `America/Denver` - America/Denver
            * `America/Detroit` - America/Detroit
            * `America/Dominica` - America/Dominica
            * `America/Edmonton` - America/Edmonton
            * `America/Eirunepe` - America/Eirunepe
            * `America/El_Salvador` - America/El_Salvador
            * `America/Fort_Nelson` - America/Fort_Nelson
            * `America/Fortaleza` - America/Fortaleza
            * `America/Glace_Bay` - America/Glace_Bay
            * `America/Goose_Bay` - America/Goose_Bay
            * `America/Grand_Turk` - America/Grand_Turk
            * `America/Grenada` - America/Grenada
            * `America/Guadeloupe` - America/Guadeloupe
            * `America/Guatemala` - America/Guatemala
            * `America/Guayaquil` - America/Guayaquil
            * `America/Guyana` - America/Guyana
            * `America/Halifax` - America/Halifax
            * `America/Havana` - America/Havana
            * `America/Hermosillo` - America/Hermosillo
            * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
            * `America/Indiana/Knox` - America/Indiana/Knox
            * `America/Indiana/Marengo` - America/Indiana/Marengo
            * `America/Indiana/Petersburg` - America/Indiana/Petersburg
            * `America/Indiana/Tell_City` - America/Indiana/Tell_City
            * `America/Indiana/Vevay` - America/Indiana/Vevay
            * `America/Indiana/Vincennes` - America/Indiana/Vincennes
            * `America/Indiana/Winamac` - America/Indiana/Winamac
            * `America/Inuvik` - America/Inuvik
            * `America/Iqaluit` - America/Iqaluit
            * `America/Jamaica` - America/Jamaica
            * `America/Juneau` - America/Juneau
            * `America/Kentucky/Louisville` - America/Kentucky/Louisville
            * `America/Kentucky/Monticello` - America/Kentucky/Monticello
            * `America/Kralendijk` - America/Kralendijk
            * `America/La_Paz` - America/La_Paz
            * `America/Lima` - America/Lima
            * `America/Los_Angeles` - America/Los_Angeles
            * `America/Lower_Princes` - America/Lower_Princes
            * `America/Maceio` - America/Maceio
            * `America/Managua` - America/Managua
            * `America/Manaus` - America/Manaus
            * `America/Marigot` - America/Marigot
            * `America/Martinique` - America/Martinique
            * `America/Matamoros` - America/Matamoros
            * `America/Mazatlan` - America/Mazatlan
            * `America/Menominee` - America/Menominee
            * `America/Merida` - America/Merida
            * `America/Metlakatla` - America/Metlakatla
            * `America/Mexico_City` - America/Mexico_City
            * `America/Miquelon` - America/Miquelon
            * `America/Moncton` - America/Moncton
            * `America/Monterrey` - America/Monterrey
            * `America/Montevideo` - America/Montevideo
            * `America/Montserrat` - America/Montserrat
            * `America/Nassau` - America/Nassau
            * `America/New_York` - America/New_York
            * `America/Nome` - America/Nome
            * `America/Noronha` - America/Noronha
            * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
            * `America/North_Dakota/Center` - America/North_Dakota/Center
            * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
            * `America/Nuuk` - America/Nuuk
            * `America/Ojinaga` - America/Ojinaga
            * `America/Panama` - America/Panama
            * `America/Paramaribo` - America/Paramaribo
            * `America/Phoenix` - America/Phoenix
            * `America/Port-au-Prince` - America/Port-au-Prince
            * `America/Port_of_Spain` - America/Port_of_Spain
            * `America/Porto_Velho` - America/Porto_Velho
            * `America/Puerto_Rico` - America/Puerto_Rico
            * `America/Punta_Arenas` - America/Punta_Arenas
            * `America/Rankin_Inlet` - America/Rankin_Inlet
            * `America/Recife` - America/Recife
            * `America/Regina` - America/Regina
            * `America/Resolute` - America/Resolute
            * `America/Rio_Branco` - America/Rio_Branco
            * `America/Santarem` - America/Santarem
            * `America/Santiago` - America/Santiago
            * `America/Santo_Domingo` - America/Santo_Domingo
            * `America/Sao_Paulo` - America/Sao_Paulo
            * `America/Scoresbysund` - America/Scoresbysund
            * `America/Sitka` - America/Sitka
            * `America/St_Barthelemy` - America/St_Barthelemy
            * `America/St_Johns` - America/St_Johns
            * `America/St_Kitts` - America/St_Kitts
            * `America/St_Lucia` - America/St_Lucia
            * `America/St_Thomas` - America/St_Thomas
            * `America/St_Vincent` - America/St_Vincent
            * `America/Swift_Current` - America/Swift_Current
            * `America/Tegucigalpa` - America/Tegucigalpa
            * `America/Thule` - America/Thule
            * `America/Tijuana` - America/Tijuana
            * `America/Toronto` - America/Toronto
            * `America/Tortola` - America/Tortola
            * `America/Vancouver` - America/Vancouver
            * `America/Whitehorse` - America/Whitehorse
            * `America/Winnipeg` - America/Winnipeg
            * `America/Yakutat` - America/Yakutat
            * `Antarctica/Casey` - Antarctica/Casey
            * `Antarctica/Davis` - Antarctica/Davis
            * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
            * `Antarctica/Macquarie` - Antarctica/Macquarie
            * `Antarctica/Mawson` - Antarctica/Mawson
            * `Antarctica/McMurdo` - Antarctica/McMurdo
            * `Antarctica/Palmer` - Antarctica/Palmer
            * `Antarctica/Rothera` - Antarctica/Rothera
            * `Antarctica/Syowa` - Antarctica/Syowa
            * `Antarctica/Troll` - Antarctica/Troll
            * `Antarctica/Vostok` - Antarctica/Vostok
            * `Arctic/Longyearbyen` - Arctic/Longyearbyen
            * `Asia/Aden` - Asia/Aden
            * `Asia/Almaty` - Asia/Almaty
            * `Asia/Amman` - Asia/Amman
            * `Asia/Anadyr` - Asia/Anadyr
            * `Asia/Aqtau` - Asia/Aqtau
            * `Asia/Aqtobe` - Asia/Aqtobe
            * `Asia/Ashgabat` - Asia/Ashgabat
            * `Asia/Atyrau` - Asia/Atyrau
            * `Asia/Baghdad` - Asia/Baghdad
            * `Asia/Bahrain` - Asia/Bahrain
            * `Asia/Baku` - Asia/Baku
            * `Asia/Bangkok` - Asia/Bangkok
            * `Asia/Barnaul` - Asia/Barnaul
            * `Asia/Beirut` - Asia/Beirut
            * `Asia/Bishkek` - Asia/Bishkek
            * `Asia/Brunei` - Asia/Brunei
            * `Asia/Chita` - Asia/Chita
            * `Asia/Colombo` - Asia/Colombo
            * `Asia/Damascus` - Asia/Damascus
            * `Asia/Dhaka` - Asia/Dhaka
            * `Asia/Dili` - Asia/Dili
            * `Asia/Dubai` - Asia/Dubai
            * `Asia/Dushanbe` - Asia/Dushanbe
            * `Asia/Famagusta` - Asia/Famagusta
            * `Asia/Gaza` - Asia/Gaza
            * `Asia/Hebron` - Asia/Hebron
            * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
            * `Asia/Hong_Kong` - Asia/Hong_Kong
            * `Asia/Hovd` - Asia/Hovd
            * `Asia/Irkutsk` - Asia/Irkutsk
            * `Asia/Jakarta` - Asia/Jakarta
            * `Asia/Jayapura` - Asia/Jayapura
            * `Asia/Jerusalem` - Asia/Jerusalem
            * `Asia/Kabul` - Asia/Kabul
            * `Asia/Kamchatka` - Asia/Kamchatka
            * `Asia/Karachi` - Asia/Karachi
            * `Asia/Kathmandu` - Asia/Kathmandu
            * `Asia/Khandyga` - Asia/Khandyga
            * `Asia/Kolkata` - Asia/Kolkata
            * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
            * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
            * `Asia/Kuching` - Asia/Kuching
            * `Asia/Kuwait` - Asia/Kuwait
            * `Asia/Macau` - Asia/Macau
            * `Asia/Magadan` - Asia/Magadan
            * `Asia/Makassar` - Asia/Makassar
            * `Asia/Manila` - Asia/Manila
            * `Asia/Muscat` - Asia/Muscat
            * `Asia/Nicosia` - Asia/Nicosia
            * `Asia/Novokuznetsk` - Asia/Novokuznetsk
            * `Asia/Novosibirsk` - Asia/Novosibirsk
            * `Asia/Omsk` - Asia/Omsk
            * `Asia/Oral` - Asia/Oral
            * `Asia/Phnom_Penh` - Asia/Phnom_Penh
            * `Asia/Pontianak` - Asia/Pontianak
            * `Asia/Pyongyang` - Asia/Pyongyang
            * `Asia/Qatar` - Asia/Qatar
            * `Asia/Qostanay` - Asia/Qostanay
            * `Asia/Qyzylorda` - Asia/Qyzylorda
            * `Asia/Riyadh` - Asia/Riyadh
            * `Asia/Sakhalin` - Asia/Sakhalin
            * `Asia/Samarkand` - Asia/Samarkand
            * `Asia/Seoul` - Asia/Seoul
            * `Asia/Shanghai` - Asia/Shanghai
            * `Asia/Singapore` - Asia/Singapore
            * `Asia/Srednekolymsk` - Asia/Srednekolymsk
            * `Asia/Taipei` - Asia/Taipei
            * `Asia/Tashkent` - Asia/Tashkent
            * `Asia/Tbilisi` - Asia/Tbilisi
            * `Asia/Tehran` - Asia/Tehran
            * `Asia/Thimphu` - Asia/Thimphu
            * `Asia/Tokyo` - Asia/Tokyo
            * `Asia/Tomsk` - Asia/Tomsk
            * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
            * `Asia/Urumqi` - Asia/Urumqi
            * `Asia/Ust-Nera` - Asia/Ust-Nera
            * `Asia/Vientiane` - Asia/Vientiane
            * `Asia/Vladivostok` - Asia/Vladivostok
            * `Asia/Yakutsk` - Asia/Yakutsk
            * `Asia/Yangon` - Asia/Yangon
            * `Asia/Yekaterinburg` - Asia/Yekaterinburg
            * `Asia/Yerevan` - Asia/Yerevan
            * `Atlantic/Azores` - Atlantic/Azores
            * `Atlantic/Bermuda` - Atlantic/Bermuda
            * `Atlantic/Canary` - Atlantic/Canary
            * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
            * `Atlantic/Faroe` - Atlantic/Faroe
            * `Atlantic/Madeira` - Atlantic/Madeira
            * `Atlantic/Reykjavik` - Atlantic/Reykjavik
            * `Atlantic/South_Georgia` - Atlantic/South_Georgia
            * `Atlantic/St_Helena` - Atlantic/St_Helena
            * `Atlantic/Stanley` - Atlantic/Stanley
            * `Australia/Adelaide` - Australia/Adelaide
            * `Australia/Brisbane` - Australia/Brisbane
            * `Australia/Broken_Hill` - Australia/Broken_Hill
            * `Australia/Darwin` - Australia/Darwin
            * `Australia/Eucla` - Australia/Eucla
            * `Australia/Hobart` - Australia/Hobart
            * `Australia/Lindeman` - Australia/Lindeman
            * `Australia/Lord_Howe` - Australia/Lord_Howe
            * `Australia/Melbourne` - Australia/Melbourne
            * `Australia/Perth` - Australia/Perth
            * `Australia/Sydney` - Australia/Sydney
            * `Europe/Amsterdam` - Europe/Amsterdam
            * `Europe/Andorra` - Europe/Andorra
            * `Europe/Astrakhan` - Europe/Astrakhan
            * `Europe/Athens` - Europe/Athens
            * `Europe/Belgrade` - Europe/Belgrade
            * `Europe/Berlin` - Europe/Berlin
            * `Europe/Bratislava` - Europe/Bratislava
            * `Europe/Brussels` - Europe/Brussels
            * `Europe/Bucharest` - Europe/Bucharest
            * `Europe/Budapest` - Europe/Budapest
            * `Europe/Busingen` - Europe/Busingen
            * `Europe/Chisinau` - Europe/Chisinau
            * `Europe/Copenhagen` - Europe/Copenhagen
            * `Europe/Dublin` - Europe/Dublin
            * `Europe/Gibraltar` - Europe/Gibraltar
            * `Europe/Guernsey` - Europe/Guernsey
            * `Europe/Helsinki` - Europe/Helsinki
            * `Europe/Isle_of_Man` - Europe/Isle_of_Man
            * `Europe/Istanbul` - Europe/Istanbul
            * `Europe/Jersey` - Europe/Jersey
            * `Europe/Kaliningrad` - Europe/Kaliningrad
            * `Europe/Kirov` - Europe/Kirov
            * `Europe/Kyiv` - Europe/Kyiv
            * `Europe/Lisbon` - Europe/Lisbon
            * `Europe/Ljubljana` - Europe/Ljubljana
            * `Europe/London` - Europe/London
            * `Europe/Luxembourg` - Europe/Luxembourg
            * `Europe/Madrid` - Europe/Madrid
            * `Europe/Malta` - Europe/Malta
            * `Europe/Mariehamn` - Europe/Mariehamn
            * `Europe/Minsk` - Europe/Minsk
            * `Europe/Monaco` - Europe/Monaco
            * `Europe/Moscow` - Europe/Moscow
            * `Europe/Oslo` - Europe/Oslo
            * `Europe/Paris` - Europe/Paris
            * `Europe/Podgorica` - Europe/Podgorica
            * `Europe/Prague` - Europe/Prague
            * `Europe/Riga` - Europe/Riga
            * `Europe/Rome` - Europe/Rome
            * `Europe/Samara` - Europe/Samara
            * `Europe/San_Marino` - Europe/San_Marino
            * `Europe/Sarajevo` - Europe/Sarajevo
            * `Europe/Saratov` - Europe/Saratov
            * `Europe/Simferopol` - Europe/Simferopol
            * `Europe/Skopje` - Europe/Skopje
            * `Europe/Sofia` - Europe/Sofia
            * `Europe/Stockholm` - Europe/Stockholm
            * `Europe/Tallinn` - Europe/Tallinn
            * `Europe/Tirane` - Europe/Tirane
            * `Europe/Ulyanovsk` - Europe/Ulyanovsk
            * `Europe/Vaduz` - Europe/Vaduz
            * `Europe/Vatican` - Europe/Vatican
            * `Europe/Vienna` - Europe/Vienna
            * `Europe/Vilnius` - Europe/Vilnius
            * `Europe/Volgograd` - Europe/Volgograd
            * `Europe/Warsaw` - Europe/Warsaw
            * `Europe/Zagreb` - Europe/Zagreb
            * `Europe/Zurich` - Europe/Zurich
            * `GMT` - GMT
            * `Indian/Antananarivo` - Indian/Antananarivo
            * `Indian/Chagos` - Indian/Chagos
            * `Indian/Christmas` - Indian/Christmas
            * `Indian/Cocos` - Indian/Cocos
            * `Indian/Comoro` - Indian/Comoro
            * `Indian/Kerguelen` - Indian/Kerguelen
            * `Indian/Mahe` - Indian/Mahe
            * `Indian/Maldives` - Indian/Maldives
            * `Indian/Mauritius` - Indian/Mauritius
            * `Indian/Mayotte` - Indian/Mayotte
            * `Indian/Reunion` - Indian/Reunion
            * `Pacific/Apia` - Pacific/Apia
            * `Pacific/Auckland` - Pacific/Auckland
            * `Pacific/Bougainville` - Pacific/Bougainville
            * `Pacific/Chatham` - Pacific/Chatham
            * `Pacific/Chuuk` - Pacific/Chuuk
            * `Pacific/Easter` - Pacific/Easter
            * `Pacific/Efate` - Pacific/Efate
            * `Pacific/Fakaofo` - Pacific/Fakaofo
            * `Pacific/Fiji` - Pacific/Fiji
            * `Pacific/Funafuti` - Pacific/Funafuti
            * `Pacific/Galapagos` - Pacific/Galapagos
            * `Pacific/Gambier` - Pacific/Gambier
            * `Pacific/Guadalcanal` - Pacific/Guadalcanal
            * `Pacific/Guam` - Pacific/Guam
            * `Pacific/Honolulu` - Pacific/Honolulu
            * `Pacific/Kanton` - Pacific/Kanton
            * `Pacific/Kiritimati` - Pacific/Kiritimati
            * `Pacific/Kosrae` - Pacific/Kosrae
            * `Pacific/Kwajalein` - Pacific/Kwajalein
            * `Pacific/Majuro` - Pacific/Majuro
            * `Pacific/Marquesas` - Pacific/Marquesas
            * `Pacific/Midway` - Pacific/Midway
            * `Pacific/Nauru` - Pacific/Nauru
            * `Pacific/Niue` - Pacific/Niue
            * `Pacific/Norfolk` - Pacific/Norfolk
            * `Pacific/Noumea` - Pacific/Noumea
            * `Pacific/Pago_Pago` - Pacific/Pago_Pago
            * `Pacific/Palau` - Pacific/Palau
            * `Pacific/Pitcairn` - Pacific/Pitcairn
            * `Pacific/Pohnpei` - Pacific/Pohnpei
            * `Pacific/Port_Moresby` - Pacific/Port_Moresby
            * `Pacific/Rarotonga` - Pacific/Rarotonga
            * `Pacific/Saipan` - Pacific/Saipan
            * `Pacific/Tahiti` - Pacific/Tahiti
            * `Pacific/Tarawa` - Pacific/Tarawa
            * `Pacific/Tongatapu` - Pacific/Tongatapu
            * `Pacific/Wake` - Pacific/Wake
            * `Pacific/Wallis` - Pacific/Wallis
            * `UTC` - UTC
        local_timezone:
          nullable: true
          description: |-
            User's current local timezone (if traveling)

            * `Africa/Abidjan` - Africa/Abidjan
            * `Africa/Accra` - Africa/Accra
            * `Africa/Addis_Ababa` - Africa/Addis_Ababa
            * `Africa/Algiers` - Africa/Algiers
            * `Africa/Asmara` - Africa/Asmara
            * `Africa/Bamako` - Africa/Bamako
            * `Africa/Bangui` - Africa/Bangui
            * `Africa/Banjul` - Africa/Banjul
            * `Africa/Bissau` - Africa/Bissau
            * `Africa/Blantyre` - Africa/Blantyre
            * `Africa/Brazzaville` - Africa/Brazzaville
            * `Africa/Bujumbura` - Africa/Bujumbura
            * `Africa/Cairo` - Africa/Cairo
            * `Africa/Casablanca` - Africa/Casablanca
            * `Africa/Ceuta` - Africa/Ceuta
            * `Africa/Conakry` - Africa/Conakry
            * `Africa/Dakar` - Africa/Dakar
            * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam
            * `Africa/Djibouti` - Africa/Djibouti
            * `Africa/Douala` - Africa/Douala
            * `Africa/El_Aaiun` - Africa/El_Aaiun
            * `Africa/Freetown` - Africa/Freetown
            * `Africa/Gaborone` - Africa/Gaborone
            * `Africa/Harare` - Africa/Harare
            * `Africa/Johannesburg` - Africa/Johannesburg
            * `Africa/Juba` - Africa/Juba
            * `Africa/Kampala` - Africa/Kampala
            * `Africa/Khartoum` - Africa/Khartoum
            * `Africa/Kigali` - Africa/Kigali
            * `Africa/Kinshasa` - Africa/Kinshasa
            * `Africa/Lagos` - Africa/Lagos
            * `Africa/Libreville` - Africa/Libreville
            * `Africa/Lome` - Africa/Lome
            * `Africa/Luanda` - Africa/Luanda
            * `Africa/Lubumbashi` - Africa/Lubumbashi
            * `Africa/Lusaka` - Africa/Lusaka
            * `Africa/Malabo` - Africa/Malabo
            * `Africa/Maputo` - Africa/Maputo
            * `Africa/Maseru` - Africa/Maseru
            * `Africa/Mbabane` - Africa/Mbabane
            * `Africa/Mogadishu` - Africa/Mogadishu
            * `Africa/Monrovia` - Africa/Monrovia
            * `Africa/Nairobi` - Africa/Nairobi
            * `Africa/Ndjamena` - Africa/Ndjamena
            * `Africa/Niamey` - Africa/Niamey
            * `Africa/Nouakchott` - Africa/Nouakchott
            * `Africa/Ouagadougou` - Africa/Ouagadougou
            * `Africa/Porto-Novo` - Africa/Porto-Novo
            * `Africa/Sao_Tome` - Africa/Sao_Tome
            * `Africa/Tripoli` - Africa/Tripoli
            * `Africa/Tunis` - Africa/Tunis
            * `Africa/Windhoek` - Africa/Windhoek
            * `America/Adak` - America/Adak
            * `America/Anchorage` - America/Anchorage
            * `America/Anguilla` - America/Anguilla
            * `America/Antigua` - America/Antigua
            * `America/Araguaina` - America/Araguaina
            * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires
            * `America/Argentina/Catamarca` - America/Argentina/Catamarca
            * `America/Argentina/Cordoba` - America/Argentina/Cordoba
            * `America/Argentina/Jujuy` - America/Argentina/Jujuy
            * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja
            * `America/Argentina/Mendoza` - America/Argentina/Mendoza
            * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos
            * `America/Argentina/Salta` - America/Argentina/Salta
            * `America/Argentina/San_Juan` - America/Argentina/San_Juan
            * `America/Argentina/San_Luis` - America/Argentina/San_Luis
            * `America/Argentina/Tucuman` - America/Argentina/Tucuman
            * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia
            * `America/Aruba` - America/Aruba
            * `America/Asuncion` - America/Asuncion
            * `America/Atikokan` - America/Atikokan
            * `America/Bahia` - America/Bahia
            * `America/Bahia_Banderas` - America/Bahia_Banderas
            * `America/Barbados` - America/Barbados
            * `America/Belem` - America/Belem
            * `America/Belize` - America/Belize
            * `America/Blanc-Sablon` - America/Blanc-Sablon
            * `America/Boa_Vista` - America/Boa_Vista
            * `America/Bogota` - America/Bogota
            * `America/Boise` - America/Boise
            * `America/Cambridge_Bay` - America/Cambridge_Bay
            * `America/Campo_Grande` - America/Campo_Grande
            * `America/Cancun` - America/Cancun
            * `America/Caracas` - America/Caracas
            * `America/Cayenne` - America/Cayenne
            * `America/Cayman` - America/Cayman
            * `America/Chicago` - America/Chicago
            * `America/Chihuahua` - America/Chihuahua
            * `America/Ciudad_Juarez` - America/Ciudad_Juarez
            * `America/Costa_Rica` - America/Costa_Rica
            * `America/Coyhaique` - America/Coyhaique
            * `America/Creston` - America/Creston
            * `America/Cuiaba` - America/Cuiaba
            * `America/Curacao` - America/Curacao
            * `America/Danmarkshavn` - America/Danmarkshavn
            * `America/Dawson` - America/Dawson
            * `America/Dawson_Creek` - America/Dawson_Creek
            * `America/Denver` - America/Denver
            * `America/Detroit` - America/Detroit
            * `America/Dominica` - America/Dominica
            * `America/Edmonton` - America/Edmonton
            * `America/Eirunepe` - America/Eirunepe
            * `America/El_Salvador` - America/El_Salvador
            * `America/Fort_Nelson` - America/Fort_Nelson
            * `America/Fortaleza` - America/Fortaleza
            * `America/Glace_Bay` - America/Glace_Bay
            * `America/Goose_Bay` - America/Goose_Bay
            * `America/Grand_Turk` - America/Grand_Turk
            * `America/Grenada` - America/Grenada
            * `America/Guadeloupe` - America/Guadeloupe
            * `America/Guatemala` - America/Guatemala
            * `America/Guayaquil` - America/Guayaquil
            * `America/Guyana` - America/Guyana
            * `America/Halifax` - America/Halifax
            * `America/Havana` - America/Havana
            * `America/Hermosillo` - America/Hermosillo
            * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis
            * `America/Indiana/Knox` - America/Indiana/Knox
            * `America/Indiana/Marengo` - America/Indiana/Marengo
            * `America/Indiana/Petersburg` - America/Indiana/Petersburg
            * `America/Indiana/Tell_City` - America/Indiana/Tell_City
            * `America/Indiana/Vevay` - America/Indiana/Vevay
            * `America/Indiana/Vincennes` - America/Indiana/Vincennes
            * `America/Indiana/Winamac` - America/Indiana/Winamac
            * `America/Inuvik` - America/Inuvik
            * `America/Iqaluit` - America/Iqaluit
            * `America/Jamaica` - America/Jamaica
            * `America/Juneau` - America/Juneau
            * `America/Kentucky/Louisville` - America/Kentucky/Louisville
            * `America/Kentucky/Monticello` - America/Kentucky/Monticello
            * `America/Kralendijk` - America/Kralendijk
            * `America/La_Paz` - America/La_Paz
            * `America/Lima` - America/Lima
            * `America/Los_Angeles` - America/Los_Angeles
            * `America/Lower_Princes` - America/Lower_Princes
            * `America/Maceio` - America/Maceio
            * `America/Managua` - America/Managua
            * `America/Manaus` - America/Manaus
            * `America/Marigot` - America/Marigot
            * `America/Martinique` - America/Martinique
            * `America/Matamoros` - America/Matamoros
            * `America/Mazatlan` - America/Mazatlan
            * `America/Menominee` - America/Menominee
            * `America/Merida` - America/Merida
            * `America/Metlakatla` - America/Metlakatla
            * `America/Mexico_City` - America/Mexico_City
            * `America/Miquelon` - America/Miquelon
            * `America/Moncton` - America/Moncton
            * `America/Monterrey` - America/Monterrey
            * `America/Montevideo` - America/Montevideo
            * `America/Montserrat` - America/Montserrat
            * `America/Nassau` - America/Nassau
            * `America/New_York` - America/New_York
            * `America/Nome` - America/Nome
            * `America/Noronha` - America/Noronha
            * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah
            * `America/North_Dakota/Center` - America/North_Dakota/Center
            * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem
            * `America/Nuuk` - America/Nuuk
            * `America/Ojinaga` - America/Ojinaga
            * `America/Panama` - America/Panama
            * `America/Paramaribo` - America/Paramaribo
            * `America/Phoenix` - America/Phoenix
            * `America/Port-au-Prince` - America/Port-au-Prince
            * `America/Port_of_Spain` - America/Port_of_Spain
            * `America/Porto_Velho` - America/Porto_Velho
            * `America/Puerto_Rico` - America/Puerto_Rico
            * `America/Punta_Arenas` - America/Punta_Arenas
            * `America/Rankin_Inlet` - America/Rankin_Inlet
            * `America/Recife` - America/Recife
            * `America/Regina` - America/Regina
            * `America/Resolute` - America/Resolute
            * `America/Rio_Branco` - America/Rio_Branco
            * `America/Santarem` - America/Santarem
            * `America/Santiago` - America/Santiago
            * `America/Santo_Domingo` - America/Santo_Domingo
            * `America/Sao_Paulo` - America/Sao_Paulo
            * `America/Scoresbysund` - America/Scoresbysund
            * `America/Sitka` - America/Sitka
            * `America/St_Barthelemy` - America/St_Barthelemy
            * `America/St_Johns` - America/St_Johns
            * `America/St_Kitts` - America/St_Kitts
            * `America/St_Lucia` - America/St_Lucia
            * `America/St_Thomas` - America/St_Thomas
            * `America/St_Vincent` - America/St_Vincent
            * `America/Swift_Current` - America/Swift_Current
            * `America/Tegucigalpa` - America/Tegucigalpa
            * `America/Thule` - America/Thule
            * `America/Tijuana` - America/Tijuana
            * `America/Toronto` - America/Toronto
            * `America/Tortola` - America/Tortola
            * `America/Vancouver` - America/Vancouver
            * `America/Whitehorse` - America/Whitehorse
            * `America/Winnipeg` - America/Winnipeg
            * `America/Yakutat` - America/Yakutat
            * `Antarctica/Casey` - Antarctica/Casey
            * `Antarctica/Davis` - Antarctica/Davis
            * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville
            * `Antarctica/Macquarie` - Antarctica/Macquarie
            * `Antarctica/Mawson` - Antarctica/Mawson
            * `Antarctica/McMurdo` - Antarctica/McMurdo
            * `Antarctica/Palmer` - Antarctica/Palmer
            * `Antarctica/Rothera` - Antarctica/Rothera
            * `Antarctica/Syowa` - Antarctica/Syowa
            * `Antarctica/Troll` - Antarctica/Troll
            * `Antarctica/Vostok` - Antarctica/Vostok
            * `Arctic/Longyearbyen` - Arctic/Longyearbyen
            * `Asia/Aden` - Asia/Aden
            * `Asia/Almaty` - Asia/Almaty
            * `Asia/Amman` - Asia/Amman
            * `Asia/Anadyr` - Asia/Anadyr
            * `Asia/Aqtau` - Asia/Aqtau
            * `Asia/Aqtobe` - Asia/Aqtobe
            * `Asia/Ashgabat` - Asia/Ashgabat
            * `Asia/Atyrau` - Asia/Atyrau
            * `Asia/Baghdad` - Asia/Baghdad
            * `Asia/Bahrain` - Asia/Bahrain
            * `Asia/Baku` - Asia/Baku
            * `Asia/Bangkok` - Asia/Bangkok
            * `Asia/Barnaul` - Asia/Barnaul
            * `Asia/Beirut` - Asia/Beirut
            * `Asia/Bishkek` - Asia/Bishkek
            * `Asia/Brunei` - Asia/Brunei
            * `Asia/Chita` - Asia/Chita
            * `Asia/Colombo` - Asia/Colombo
            * `Asia/Damascus` - Asia/Damascus
            * `Asia/Dhaka` - Asia/Dhaka
            * `Asia/Dili` - Asia/Dili
            * `Asia/Dubai` - Asia/Dubai
            * `Asia/Dushanbe` - Asia/Dushanbe
            * `Asia/Famagusta` - Asia/Famagusta
            * `Asia/Gaza` - Asia/Gaza
            * `Asia/Hebron` - Asia/Hebron
            * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh
            * `Asia/Hong_Kong` - Asia/Hong_Kong
            * `Asia/Hovd` - Asia/Hovd
            * `Asia/Irkutsk` - Asia/Irkutsk
            * `Asia/Jakarta` - Asia/Jakarta
            * `Asia/Jayapura` - Asia/Jayapura
            * `Asia/Jerusalem` - Asia/Jerusalem
            * `Asia/Kabul` - Asia/Kabul
            * `Asia/Kamchatka` - Asia/Kamchatka
            * `Asia/Karachi` - Asia/Karachi
            * `Asia/Kathmandu` - Asia/Kathmandu
            * `Asia/Khandyga` - Asia/Khandyga
            * `Asia/Kolkata` - Asia/Kolkata
            * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk
            * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur
            * `Asia/Kuching` - Asia/Kuching
            * `Asia/Kuwait` - Asia/Kuwait
            * `Asia/Macau` - Asia/Macau
            * `Asia/Magadan` - Asia/Magadan
            * `Asia/Makassar` - Asia/Makassar
            * `Asia/Manila` - Asia/Manila
            * `Asia/Muscat` - Asia/Muscat
            * `Asia/Nicosia` - Asia/Nicosia
            * `Asia/Novokuznetsk` - Asia/Novokuznetsk
            * `Asia/Novosibirsk` - Asia/Novosibirsk
            * `Asia/Omsk` - Asia/Omsk
            * `Asia/Oral` - Asia/Oral
            * `Asia/Phnom_Penh` - Asia/Phnom_Penh
            * `Asia/Pontianak` - Asia/Pontianak
            * `Asia/Pyongyang` - Asia/Pyongyang
            * `Asia/Qatar` - Asia/Qatar
            * `Asia/Qostanay` - Asia/Qostanay
            * `Asia/Qyzylorda` - Asia/Qyzylorda
            * `Asia/Riyadh` - Asia/Riyadh
            * `Asia/Sakhalin` - Asia/Sakhalin
            * `Asia/Samarkand` - Asia/Samarkand
            * `Asia/Seoul` - Asia/Seoul
            * `Asia/Shanghai` - Asia/Shanghai
            * `Asia/Singapore` - Asia/Singapore
            * `Asia/Srednekolymsk` - Asia/Srednekolymsk
            * `Asia/Taipei` - Asia/Taipei
            * `Asia/Tashkent` - Asia/Tashkent
            * `Asia/Tbilisi` - Asia/Tbilisi
            * `Asia/Tehran` - Asia/Tehran
            * `Asia/Thimphu` - Asia/Thimphu
            * `Asia/Tokyo` - Asia/Tokyo
            * `Asia/Tomsk` - Asia/Tomsk
            * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar
            * `Asia/Urumqi` - Asia/Urumqi
            * `Asia/Ust-Nera` - Asia/Ust-Nera
            * `Asia/Vientiane` - Asia/Vientiane
            * `Asia/Vladivostok` - Asia/Vladivostok
            * `Asia/Yakutsk` - Asia/Yakutsk
            * `Asia/Yangon` - Asia/Yangon
            * `Asia/Yekaterinburg` - Asia/Yekaterinburg
            * `Asia/Yerevan` - Asia/Yerevan
            * `Atlantic/Azores` - Atlantic/Azores
            * `Atlantic/Bermuda` - Atlantic/Bermuda
            * `Atlantic/Canary` - Atlantic/Canary
            * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde
            * `Atlantic/Faroe` - Atlantic/Faroe
            * `Atlantic/Madeira` - Atlantic/Madeira
            * `Atlantic/Reykjavik` - Atlantic/Reykjavik
            * `Atlantic/South_Georgia` - Atlantic/South_Georgia
            * `Atlantic/St_Helena` - Atlantic/St_Helena
            * `Atlantic/Stanley` - Atlantic/Stanley
            * `Australia/Adelaide` - Australia/Adelaide
            * `Australia/Brisbane` - Australia/Brisbane
            * `Australia/Broken_Hill` - Australia/Broken_Hill
            * `Australia/Darwin` - Australia/Darwin
            * `Australia/Eucla` - Australia/Eucla
            * `Australia/Hobart` - Australia/Hobart
            * `Australia/Lindeman` - Australia/Lindeman
            * `Australia/Lord_Howe` - Australia/Lord_Howe
            * `Australia/Melbourne` - Australia/Melbourne
            * `Australia/Perth` - Australia/Perth
            * `Australia/Sydney` - Australia/Sydney
            * `Europe/Amsterdam` - Europe/Amsterdam
            * `Europe/Andorra` - Europe/Andorra
            * `Europe/Astrakhan` - Europe/Astrakhan
            * `Europe/Athens` - Europe/Athens
            * `Europe/Belgrade` - Europe/Belgrade
            * `Europe/Berlin` - Europe/Berlin
            * `Europe/Bratislava` - Europe/Bratislava
            * `Europe/Brussels` - Europe/Brussels
            * `Europe/Bucharest` - Europe/Bucharest
            * `Europe/Budapest` - Europe/Budapest
            * `Europe/Busingen` - Europe/Busingen
            * `Europe/Chisinau` - Europe/Chisinau
            * `Europe/Copenhagen` - Europe/Copenhagen
            * `Europe/Dublin` - Europe/Dublin
            * `Europe/Gibraltar` - Europe/Gibraltar
            * `Europe/Guernsey` - Europe/Guernsey
            * `Europe/Helsinki` - Europe/Helsinki
            * `Europe/Isle_of_Man` - Europe/Isle_of_Man
            * `Europe/Istanbul` - Europe/Istanbul
            * `Europe/Jersey` - Europe/Jersey
            * `Europe/Kaliningrad` - Europe/Kaliningrad
            * `Europe/Kirov` - Europe/Kirov
            * `Europe/Kyiv` - Europe/Kyiv
            * `Europe/Lisbon` - Europe/Lisbon
            * `Europe/Ljubljana` - Europe/Ljubljana
            * `Europe/London` - Europe/London
            * `Europe/Luxembourg` - Europe/Luxembourg
            * `Europe/Madrid` - Europe/Madrid
            * `Europe/Malta` - Europe/Malta
            * `Europe/Mariehamn` - Europe/Mariehamn
            * `Europe/Minsk` - Europe/Minsk
            * `Europe/Monaco` - Europe/Monaco
            * `Europe/Moscow` - Europe/Moscow
            * `Europe/Oslo` - Europe/Oslo
            * `Europe/Paris` - Europe/Paris
            * `Europe/Podgorica` - Europe/Podgorica
            * `Europe/Prague` - Europe/Prague
            * `Europe/Riga` - Europe/Riga
            * `Europe/Rome` - Europe/Rome
            * `Europe/Samara` - Europe/Samara
            * `Europe/San_Marino` - Europe/San_Marino
            * `Europe/Sarajevo` - Europe/Sarajevo
            * `Europe/Saratov` - Europe/Saratov
            * `Europe/Simferopol` - Europe/Simferopol
            * `Europe/Skopje` - Europe/Skopje
            * `Europe/Sofia` - Europe/Sofia
            * `Europe/Stockholm` - Europe/Stockholm
            * `Europe/Tallinn` - Europe/Tallinn
            * `Europe/Tirane` - Europe/Tirane
            * `Europe/Ulyanovsk` - Europe/Ulyanovsk
            * `Europe/Vaduz` - Europe/Vaduz
            * `Europe/Vatican` - Europe/Vatican
            * `Europe/Vienna` - Europe/Vienna
            * `Europe/Vilnius` - Europe/Vilnius
            * `Europe/Volgograd` - Europe/Volgograd
            * `Europe/Warsaw` - Europe/Warsaw
            * `Europe/Zagreb` - Europe/Zagreb
            * `Europe/Zurich` - Europe/Zurich
            * `GMT` - GMT
            * `Indian/Antananarivo` - Indian/Antananarivo
            * `Indian/Chagos` - Indian/Chagos
            * `Indian/Christmas` - Indian/Christmas
            * `Indian/Cocos` - Indian/Cocos
            * `Indian/Comoro` - Indian/Comoro
            * `Indian/Kerguelen` - Indian/Kerguelen
            * `Indian/Mahe` - Indian/Mahe
            * `Indian/Maldives` - Indian/Maldives
            * `Indian/Mauritius` - Indian/Mauritius
            * `Indian/Mayotte` - Indian/Mayotte
            * `Indian/Reunion` - Indian/Reunion
            * `Pacific/Apia` - Pacific/Apia
            * `Pacific/Auckland` - Pacific/Auckland
            * `Pacific/Bougainville` - Pacific/Bougainville
            * `Pacific/Chatham` - Pacific/Chatham
            * `Pacific/Chuuk` - Pacific/Chuuk
            * `Pacific/Easter` - Pacific/Easter
            * `Pacific/Efate` - Pacific/Efate
            * `Pacific/Fakaofo` - Pacific/Fakaofo
            * `Pacific/Fiji` - Pacific/Fiji
            * `Pacific/Funafuti` - Pacific/Funafuti
            * `Pacific/Galapagos` - Pacific/Galapagos
            * `Pacific/Gambier` - Pacific/Gambier
            * `Pacific/Guadalcanal` - Pacific/Guadalcanal
            * `Pacific/Guam` - Pacific/Guam
            * `Pacific/Honolulu` - Pacific/Honolulu
            * `Pacific/Kanton` - Pacific/Kanton
            * `Pacific/Kiritimati` - Pacific/Kiritimati
            * `Pacific/Kosrae` - Pacific/Kosrae
            * `Pacific/Kwajalein` - Pacific/Kwajalein
            * `Pacific/Majuro` - Pacific/Majuro
            * `Pacific/Marquesas` - Pacific/Marquesas
            * `Pacific/Midway` - Pacific/Midway
            * `Pacific/Nauru` - Pacific/Nauru
            * `Pacific/Niue` - Pacific/Niue
            * `Pacific/Norfolk` - Pacific/Norfolk
            * `Pacific/Noumea` - Pacific/Noumea
            * `Pacific/Pago_Pago` - Pacific/Pago_Pago
            * `Pacific/Palau` - Pacific/Palau
            * `Pacific/Pitcairn` - Pacific/Pitcairn
            * `Pacific/Pohnpei` - Pacific/Pohnpei
            * `Pacific/Port_Moresby` - Pacific/Port_Moresby
            * `Pacific/Rarotonga` - Pacific/Rarotonga
            * `Pacific/Saipan` - Pacific/Saipan
            * `Pacific/Tahiti` - Pacific/Tahiti
            * `Pacific/Tarawa` - Pacific/Tarawa
            * `Pacific/Tongatapu` - Pacific/Tongatapu
            * `Pacific/Wake` - Pacific/Wake
            * `Pacific/Wallis` - Pacific/Wallis
            * `UTC` - UTC
          oneOf:
          - $ref: '#/components/schemas/LocalTimezoneEnum'
          - $ref: '#/components/schemas/BlankEnum'
          - $ref: '#/components/schemas/NullEnum'
        bootswatch_theme:
          type: integer
          nullable: true
          description: Bootswatch theme for light mode
    Vendor:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
        legal_name:
          type: string
        abbreviated_name:
          type: string
        overview:
          type: string
        history:
          type: string
        services_provided:
          type: string
        vendor_type:
          type: string
        employee_count:
          type: integer
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        fiscal_year_end:
          type: string
          format: date
          nullable: true
        partner_portal_url:
          type: string
          format: uri
        is_competitor:
          type: boolean
        deal_registration_notes:
          type: string
        parent_organization:
          type: string
          readOnly: true
        parent_relationship_type:
          type: string
          readOnly: true
        is_multi_role_organization:
          type: string
          readOnly: true
        child_organizations_count:
          type: string
          readOnly: true
      required:
      - child_organizations_count
      - id
      - is_multi_role_organization
      - parent_organization
      - parent_relationship_type
    VendorRequest:
      type: object
      properties:
        name:
          type: string
        legal_name:
          type: string
        abbreviated_name:
          type: string
        overview:
          type: string
        history:
          type: string
        services_provided:
          type: string
        vendor_type:
          type: string
        employee_count:
          type: integer
          nullable: true
        revenue:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        assets:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,2})?$
          nullable: true
        fiscal_year_end:
          type: string
          format: date
          nullable: true
        partner_portal_url:
          type: string
          format: uri
        is_competitor:
          type: boolean
        deal_registration_notes:
          type: string
    VendorSolution:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        vendor:
          allOf:
          - $ref: '#/components/schemas/Vendor'
          readOnly: true
        description:
          type: string
          title: Solution Information
          description: Detailed solution description with URL support
        url:
          type: string
          format: uri
          maxLength: 200
        notes:
          type: string
          description: Additional notes about the solution
        category:
          type: string
          maxLength: 100
        release_date:
          type: string
          format: date
          nullable: true
        end_of_life_date:
          type: string
          format: date
          nullable: true
        documentation_url:
          type: string
          format: uri
          maxLength: 200
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
      required:
      - created_at
      - id
      - name
      - updated_at
      - vendor
    VendorSolutionRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        vendor_id:
          type: integer
          writeOnly: true
        description:
          type: string
          minLength: 1
          title: Solution Information
          description: Detailed solution description with URL support
        url:
          type: string
          format: uri
          maxLength: 200
        notes:
          type: string
          minLength: 1
          description: Additional notes about the solution
        category:
          type: string
          maxLength: 100
        release_date:
          type: string
          format: date
          nullable: true
        end_of_life_date:
          type: string
          format: date
          nullable: true
        documentation_url:
          type: string
          format: uri
          maxLength: 200
      required:
      - name
      - vendor_id
    Workshop:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        date:
          type: string
          format: date
        time:
          type: string
          format: time
        duration:
          allOf:
          - $ref: '#/components/schemas/DurationEnum'
          minimum: -2147483648
          maximum: 2147483647
        workshop_type:
          $ref: '#/components/schemas/WorkshopTypeEnum'
        participants:
          type: array
          items:
            $ref: '#/components/schemas/Contact'
          readOnly: true
        notes:
          type: string
      required:
      - date
      - duration
      - id
      - name
      - participants
      - time
      - workshop_type
    WorkshopRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
        date:
          type: string
          format: date
        time:
          type: string
          format: time
        duration:
          allOf:
          - $ref: '#/components/schemas/DurationEnum'
          minimum: -2147483648
          maximum: 2147483647
        workshop_type:
          $ref: '#/components/schemas/WorkshopTypeEnum'
        participant_ids:
          type: array
          items:
            type: integer
          writeOnly: true
        notes:
          type: string
      required:
      - date
      - duration
      - name
      - time
      - workshop_type
    WorkshopTypeEnum:
      enum:
      - Exploration
      - Discovery
      - Prioritization
      - Maturity
      type: string
      description: |-
        * `Exploration` - Exploration
        * `Discovery` - Discovery
        * `Prioritization` - Prioritization
        * `Maturity` - Maturity
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'API key authentication. Use format: Api-Key {your-api-key}'
servers:
- url: http://localhost:8000
  description: Development server
- url: https://api.athena.example.com
  description: Production server
tags:
- name: Core
  description: Core system functionality
- name: Orbit
  description: Business relationship management
- name: Location Tools
  description: Client location management with automatic version numbering
- name: Location Sets
  description: Versioned location collections with automatic numbering
- name: Locations
  description: Individual location records with custom fields
- name: Custom Fields
  description: Custom field definitions for location data
- name: Table Sources
  description: Location data table source configurations
- name: CSV Operations
  description: Bulk import/export operations for location data
- name: Engagement
  description: Client engagement management
- name: Advisor
  description: Advisory tools and recommendations
- name: BMC
  description: Business Model Canvas tools
- name: Pricing
  description: Pricing and cost management
- name: Gallery
  description: Media and document management
- name: RAID
  description: Risk, Assumption, Issue, Dependency tracking
- name: Stakeholder
  description: Stakeholder management
- name: Timeline
  description: Timeline and milestone management
