> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ctrl-hub.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Save a draft submission for a form

> Save a partial, unvalidated form submission as a draft. The payload is not validated against
the form schema and no workflow instance is created. Provide an existing draft submission to
add a new draft version to it, or omit the submission relationship to start a new draft.
Saving a draft against an already-submitted submission is rejected.




## OpenAPI

````yaml /api-reference/openapi.yaml post /v3/form-submission-drafts
openapi: 3.1.0
info:
  contact:
    email: support@ctrl-hub.com
    name: Ctrl Hub
    url: https://www.ctrl-hub.com
  description: >
    Ctrl Hub is the all-in-one platform for high-risk industries like utilities,
    construction, infrastructure, and renewables. We help teams manage
    everything from risk assessments and HAVS exposure to vehicle and equipment
    checks, with a guaranteed minimum of 200% ROI.
  license:
    name: MIT License
    url: https://opensource.org/licenses/MIT
  summary: An API for managing your compliance and risk posture
  termsOfService: https://www.ctrl-hub.com/terms-conditions
  title: Ctrl Hub
  version: 1.0.0
servers:
  - description: Production
    url: https://api.ctrl-hub.com
  - description: Staging
    url: https://api.ctrl-hub.dev
  - description: Development
    url: https://api.ctrl-hub.run
security: []
tags:
  - description: |
      Actions are follow-ups assigned to users and teams, produced manually or
      by domain producers such as the data-capture workflow runner.
    name: Actions
  - description: |
      Audit events are the events that are logged by the system.
    name: Audit Events
  - description: |
      View the platform's health and availability.
    name: Status
  - description: >
      User-owned dashboards composed of cards on a fixed-slot bento layout.
      Cards come from a per-domain registry; the API stores their config as
      opaque JSON.
    name: Dashboards
  - description: |
      Manage appointments for work to be carried out with your customers
    name: Customer Appointments
  - description: |
      Manage interactions you have with your customers
    name: Customer Interactions
  - description: |
      Manage accounts for your customers
    name: Customer Accounts and Contacts
  - description: |
      Qualifications are the skills and knowledge that an organisation requires.
    name: Qualifications
  - description: |
      Workflows allow you to automate your processes.
    name: Workflows
  - description: |
      Manage documents
    name: Documents
  - description: |
      Manage documents
    name: Folders
  - description: |
      Manage documents
    name: Document Reviews
  - description: |
      Manage feature configurations for an organisation.
    name: Feature Configurations
  - description: |
      Equipment are the physical assets that an organisation manages.
    name: Equipment
  - description: >
      Locations are places an organisation manages, optionally classified by a
      location type.
    name: Locations
  - description: |
      Manage your forms and their schemas
    name: Forms, Schemas and Categories
  - description: |
      Create and view form submissions
    name: Submissions
  - description: |
      View the roles available in the system.
    name: IAM Roles
  - description: >
      IAM role groups can be assigned to principals to manage authorisation
      centrally.
    name: IAM Role Groups
  - description: |
      Manage service accounts which can access the API programmatically.
    name: Service Accounts
  - description: |
      Manage bridges between organisations.
    name: Bridges
  - description: |
      Manage settings for an organisation.
    name: Settings
  - description: |
      Manage teams within an organisation.
    name: Teams
  - description: |
      Manage job roles within an organisation.
    name: Job Roles
  - description: |
      Manage users and accounts.
    name: Users
  - description: |
      Invite and manage invitations to organisations.
    name: Invitations
  - description: >
      IAM grants are the asignment of roles or permissions to principals to
      manage resource access.
    name: IAM Grants
  - description: |
      View the permissions available in the system.
    name: IAM Permissions
  - description: |
      SSO providers are the identity providers for an organisation.
    name: SSO Providers
  - description: |
      Whoami returns information about the currently authenticated principal.
    name: Whoami
  - description: |
      Manage your images
    name: Images
  - description: >
      AI agent personas that synthesise data into role-specific intelligent
      briefings.
    name: Agents
  - description: |
      Briefings generated by AI agents, including reasoning traces.
    name: Briefings
  - description: >
      Organisations are the center point for most resources in the platform.
      Most other endpoints are subresources of an organisation.
    name: Organisations
  - description: |
      Permits managements, integrated with street manager.
    name: Permits
  - description: |
      Projects manage your work and governance.
    name: Projects
  - description: >
      Import templates allow users to save and reuse their CSV importer
      configuration as named templates.
    name: Import Templates
  - description: |
      Properties are the physical locations.
    name: Properties
  - description: |
      Search across schemes, work orders, and operations.
    name: Search
  - description: |
      Provides the API specification in JSON and YAML formats
    name: Specifications
  - description: |
      Streets are the physical roads.
    name: Streets
  - description: |
      Integration with street manager
    name: Street Manager
  - description: |
      Vehicles are the physical vehicles that an organisation manages.
    name: Vehicles
  - description: >
      Scheme contracts (also known as regions) group schemes allocated from the
      network to a contractor.
    name: Scheme Contracts
  - description: >
      Scheme shares allow you to share your schemes with other organisations
      across bridges.
    name: Scheme Shares
  - description: |
      Schemes are large programmes of work
    name: Schemes
  - description: |
      Work orders the component parts of a scheme.
    name: Work Orders
  - description: |
      Operations are the work to be carried out within work orders.
    name: Operations
externalDocs:
  description: More documentation and resources
  url: https://docs.ctrl-hub.com
paths:
  /v3/form-submission-drafts:
    post:
      tags:
        - Submissions
      summary: Save a draft form submission
      description: >
        Save a partial, unvalidated form submission as a draft. The payload is
        not validated against

        the form schema and no workflow instance is created. Provide an existing
        draft submission to

        add a new draft version to it, or omit the submission relationship to
        start a new draft.

        Saving a draft against an already-submitted submission is rejected.
      operationId: CreateDraftSubmission
      requestBody:
        $ref: '#/components/requestBodies/CreateFormSubmissionDraft'
      responses:
        '201':
          $ref: '#/components/responses/GetFormSubmissionVersion'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorised'
        '409':
          $ref: '#/components/responses/Conflict'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Session: []
        - OAuth2: []
        - Cookie: []
components:
  requestBodies:
    CreateFormSubmissionDraft:
      required: true
      description: >
        A draft (partial, unvalidated) form submission. The payload is persisted
        without being

        validated against the form schema, so partially completed forms can be
        saved. Provide an

        existing draft submission relationship to add a new draft version to it;
        omit it to start a

        new draft. Drafts cannot be saved against a submission that has already
        been submitted.
      content:
        application/vnd.api+json:
          schema:
            type: object
            required:
              - data
            properties:
              data:
                type: object
                required:
                  - type
                  - attributes
                  - relationships
                properties:
                  type:
                    type: string
                    const: form-submission-drafts
                  attributes:
                    type: object
                    required:
                      - payload
                    properties:
                      payload:
                        type: object
                        description: The partial form data payload
                        additionalProperties: true
                        examples:
                          - name: John Doe
                            email: john@example.com
                  relationships:
                    type: object
                    required:
                      - schema
                    properties:
                      schema:
                        type: object
                        required:
                          - data
                        properties:
                          data:
                            type: object
                            required:
                              - type
                              - id
                            properties:
                              type:
                                type: string
                                const: form-schemas
                              id:
                                type: string
                                format: uuid
                      submission:
                        type: object
                        required:
                          - data
                        properties:
                          data:
                            type: object
                            required:
                              - type
                              - id
                            properties:
                              type:
                                type: string
                                const: form-submissions
                              id:
                                type: string
                                format: uuid
                      submitting_organisation:
                        type: object
                        required:
                          - data
                        properties:
                          data:
                            type: object
                            required:
                              - type
                              - id
                            properties:
                              type:
                                type: string
                                const: organisations
                              id:
                                type: string
                                format: uuid
  responses:
    GetFormSubmissionVersion:
      description: A form submission version.
      headers:
        Content-Type:
          $ref: '#/components/headers/content-type'
        Content-Length:
          $ref: '#/components/headers/content-length'
        X-Request-ID:
          $ref: '#/components/headers/x-request-id'
        ETag:
          $ref: '#/components/headers/etag'
        Cache-Control:
          $ref: '#/components/headers/cache-control'
      content:
        application/vnd.api+json:
          schema:
            allOf:
              - type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/FormSubmissionVersion'
                  included:
                    $ref: '#/components/schemas/FormSubmissionVersionIncludes'
              - $ref: '#/components/schemas/JSONAPI'
    BadRequest:
      description: >
        There was an error with the request - this could be due to an invalid
        body, query parameters,

        or headers that were sent to the API.
      headers:
        Content-Type:
          $ref: '#/components/headers/content-type'
        Content-Length:
          $ref: '#/components/headers/content-length'
        X-Request-ID:
          $ref: '#/components/headers/x-request-id'
      content:
        application/vnd.api+json:
          schema:
            type: object
            properties:
              errors:
                type: array
                items:
                  $ref: '#/components/schemas/Error'
          example:
            id: 98ca4a78-b66f-4234-9719-aaf832ee6669
            status: '400'
            title: A validation error was encountered
            source:
              parameter: include
            meta:
              resource: wrong_value
    Unauthorised:
      description: Authentication failed
      headers:
        Content-Type:
          $ref: '#/components/headers/content-type'
        Content-Length:
          $ref: '#/components/headers/content-length'
        X-Request-ID:
          $ref: '#/components/headers/x-request-id'
      content:
        application/vnd.api+json:
          schema:
            type: object
            properties:
              errors:
                type: array
                items:
                  $ref: '#/components/schemas/Error'
          example:
            id: 05fc9c8d-73b9-4697-9337-57f7a567a48f
            status: '401'
            title: You are not authorised to access this resource
            detail: In order to access this resource, you need the 'admin' role.
            code: AUTH.001
    Conflict:
      description: The request conflicts with the current state of the resource
      headers:
        Content-Type:
          $ref: '#/components/headers/content-type'
        Content-Length:
          $ref: '#/components/headers/content-length'
        X-Request-ID:
          $ref: '#/components/headers/x-request-id'
      content:
        application/vnd.api+json:
          schema:
            type: object
            properties:
              errors:
                type: array
                items:
                  $ref: '#/components/schemas/Error'
          example:
            id: 8e2f9a34-b5c6-4d7e-9f8a-2b3c4d5e6f7g
            status: '409'
            title: Conflict
            detail: The request conflicts with the current state of the resource.
            code: CONFLICT.001
    InternalServerError:
      description: There was a problem handling the request on the server side
      headers:
        Content-Type:
          $ref: '#/components/headers/content-type'
        Content-Length:
          $ref: '#/components/headers/content-length'
        X-Request-ID:
          $ref: '#/components/headers/x-request-id'
      content:
        application/vnd.api+json:
          schema:
            type: object
            properties:
              errors:
                type: array
                items:
                  $ref: '#/components/schemas/Error'
          example:
            id: fe9d9a69-f0a7-4fdc-bb2c-176027f316c5
            status: '500'
            title: Internal Server Error
            detail: An unexpected error occurred on the server.
  headers:
    content-type:
      description: The content type of the response
      schema:
        type: string
      example: application/vnd.api+json
    content-length:
      description: The length of the response body in bytes
      schema:
        type: integer
        format: int32
      example: 1234
    x-request-id:
      description: >-
        An ID that can be provided when reporting bugs to help identify the
        issue
      schema:
        type: string
      example: 8470f56af4cf25e22be08e72c70dbbdc
    etag:
      description: >-
        An opaque validator for the returned representation. Send it back in a
        subsequent request's `If-None-Match` header to revalidate; an unchanged
        representation responds `304 Not Modified` with no body.
      schema:
        type: string
      example: W/"a1b2c3d4e5f6"
    cache-control:
      description: >-
        Caching directives for the response. `private` marks the payload as
        user-specific (never stored by shared caches); `no-cache` allows storage
        but requires revalidation with the `ETag` before reuse.
      schema:
        type: string
      example: private, no-cache
  schemas:
    FormSubmissionVersion:
      type: object
      description: A form submission version
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form submission version.
        type:
          type: string
          const: form-submission-versions
        attributes:
          $ref: '#/components/schemas/FormSubmissionVersionAttributes'
        meta:
          $ref: '#/components/schemas/FormSubmissionVersionMeta'
        relationships:
          $ref: '#/components/schemas/FormSubmissionVersionRelationships'
    FormSubmissionVersionIncludes:
      type: array
      description: >-
        Related resources that can be included when a form submission version is
        returned
      items:
        discriminator:
          propertyName: type
          mapping:
            forms:
              $ref: '#/components/schemas/Form'
            form-schemas:
              $ref: '#/components/schemas/FormSchema'
            form-submissions:
              $ref: '#/components/schemas/FormSubmission'
            images:
              $ref: '#/components/schemas/Image'
            videos:
              $ref: '#/components/schemas/Video'
            operations:
              $ref: '#/components/schemas/Operation'
            organisations:
              $ref: '#/components/schemas/Organisation'
            properties:
              $ref: '#/components/schemas/Property'
            schemes:
              $ref: '#/components/schemas/Scheme'
            users:
              $ref: '#/components/schemas/User'
            work-orders:
              $ref: '#/components/schemas/WorkOrder'
            scheme-shares:
              $ref: '#/components/schemas/SchemeShare'
        oneOf:
          - $ref: '#/components/schemas/Form'
          - $ref: '#/components/schemas/FormSchema'
          - $ref: '#/components/schemas/FormSubmission'
          - $ref: '#/components/schemas/Image'
          - $ref: '#/components/schemas/Video'
          - $ref: '#/components/schemas/Operation'
          - $ref: '#/components/schemas/Organisation'
          - $ref: '#/components/schemas/Property'
          - $ref: '#/components/schemas/Scheme'
          - $ref: '#/components/schemas/User'
          - $ref: '#/components/schemas/WorkOrder'
          - $ref: '#/components/schemas/SchemeShare'
    JSONAPI:
      type: object
      description: JSON API response object
      required:
        - jsonapi
      properties:
        jsonapi:
          type: object
          required:
            - version
          properties:
            version:
              type: string
              description: The version of the JSON API specification
              examples:
                - '1.0'
    Error:
      type: object
      description: An error response
      properties:
        id:
          description: >-
            A unique identifier for this particular occurrence of the problem.
            If you encounter this, please provide us with the error ID and we
            can investigate it on our side.
          type: string
          format: uuid
          examples:
            - 05fc9c8d-73b9-4697-9337-57f7a567a48f
        status:
          description: >-
            The status code for the error. This might not match the HTTP status
            code if there are more that one errors to return with different
            status codes.
          type: string
          examples:
            - '401'
            - '500'
        title:
          description: A human readable title for the error.
          type: string
          examples:
            - You are not authorised to access this resource
        detail:
          description: >-
            Where there is more detail that we can provide outside of the title,
            we will provide it here.
          type: string
          examples:
            - In order to access this resource, you need the 'admin' role.
        code:
          description: >-
            A unique code for the error that may help us to diagnose the issue.
            Not all errors have codes, so this is usually empty.
          type: string
          examples:
            - AUTH.001
        source:
          description: A JSON object containing additional information about the error.
          type: object
          properties:
            pointer:
              description: >-
                A JSON Pointer to the value in the request that caused the
                error.
              type: string
              examples:
                - /data/attributes/email
            parameter:
              description: >-
                A string indicating which query parameter in the request caused
                the error.
              type: string
              examples:
                - include
      required:
        - id
        - status
        - title
    FormSubmissionVersionAttributes:
      type: object
      description: Attributes for a form submission version
      required:
        - payload
        - status
      properties:
        payload:
          type: object
          description: The form submission version data payload
          additionalProperties: true
        status:
          type: string
          description: >
            The lifecycle status of this submission version. `draft` versions
            are partial and

            were saved without validation; `submitted` versions have been
            validated.
          enum:
            - draft
            - submitted
        iteration:
          type: integer
          description: The iteration number of this submission version
          minimum: 1
        resources:
          type: array
          description: Referenced resources included in this submission version
          items:
            type: object
            required:
              - data
              - jsonapi
            properties:
              data:
                type: object
                required:
                  - id
                  - type
                  - attributes
                  - relationships
                  - meta
                properties:
                  id:
                    type: string
                    format: uuid
                    description: The unique identifier of the referenced resource
                  type:
                    type: string
                    enum:
                      - images
                      - operations
                      - properties
                      - users
                    description: The type of the referenced resource
                  attributes:
                    type: object
                    additionalProperties: true
                    description: The attributes of the referenced resource
                  relationships:
                    type: object
                    additionalProperties: true
                    description: The relationships of the referenced resource
                  meta:
                    type: object
                    additionalProperties: true
                    description: The meta information of the referenced resource
              jsonapi:
                type: object
                required:
                  - version
                properties:
                  version:
                    type: string
                    const: '1.0'
                    description: The JSON API specification version
    FormSubmissionVersionMeta:
      type: object
      description: Metadata for a form submission version
      required:
        - created_at
        - latest
        - is_latest
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the form submission version was created
        latest:
          type: string
          format: uuid
          description: The ID of the latest version of this form submission
        is_latest:
          type: boolean
          description: Whether this is the latest version of the form submission
    FormSubmissionVersionRelationships:
      type: object
      description: Relationships for a form submission version
      properties:
        author:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/UserRelationship'
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        payload_images:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/ImageRelationship'
        payload_videos:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/VideoRelationship'
        payload_schemes:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/SchemeRelationship'
        payload_work_orders:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/WorkOrderRelationship'
        payload_operations:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/OperationRelationship'
        payload_properties:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/PropertyRelationship'
        payload_users:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        submission:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FormSubmissionRelationship'
        schema:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FormSchemaRelationship'
        form:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FormRelationship'
        scheme_shares:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/SchemeShareRelationship'
    Form:
      type: object
      description: A form
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form.
        type:
          type: string
          const: forms
        attributes:
          $ref: '#/components/schemas/FormAttributes'
        meta:
          $ref: '#/components/schemas/FormMeta'
        relationships:
          $ref: '#/components/schemas/FormRelationships'
    FormSchema:
      type: object
      description: A form schema
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form schema.
        type:
          type: string
          const: form-schemas
        attributes:
          $ref: '#/components/schemas/FormSchemaAttributes'
        meta:
          $ref: '#/components/schemas/FormSchemaMeta'
        relationships:
          $ref: '#/components/schemas/FormSchemaRelationships'
    FormSubmission:
      type: object
      description: A form submission
      required:
        - id
        - type
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form submission.
        type:
          type: string
          const: form-submissions
        meta:
          $ref: '#/components/schemas/FormSubmissionMeta'
        relationships:
          $ref: '#/components/schemas/FormSubmissionRelationships'
    Image:
      type: object
      description: An image
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the image.
        type:
          type: string
          const: images
        attributes:
          $ref: '#/components/schemas/ImageAttributes'
        meta:
          $ref: '#/components/schemas/ImageMeta'
        relationships:
          $ref: '#/components/schemas/ImageRelationships'
    Video:
      type: object
      description: A video attached to a form submission
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the video.
        type:
          type: string
          const: videos
        attributes:
          $ref: '#/components/schemas/VideoAttributes'
        meta:
          $ref: '#/components/schemas/VideoMeta'
        relationships:
          $ref: '#/components/schemas/VideoRelationships'
    Operation:
      type: object
      description: An operation
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the operation.
        type:
          type: string
          const: operations
        attributes:
          $ref: '#/components/schemas/OperationAttributes'
        meta:
          $ref: '#/components/schemas/OperationMeta'
        relationships:
          $ref: '#/components/schemas/OperationRelationships'
    Organisation:
      type: object
      description: An organisation
      required:
        - id
        - type
        - attributes
        - meta
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the organisation.
        type:
          type: string
          const: organisations
        attributes:
          $ref: '#/components/schemas/OrganisationAttributes'
        meta:
          $ref: '#/components/schemas/OrganisationMeta'
        relationships:
          $ref: '#/components/schemas/OrganisationRelationships'
    Property:
      type: object
      description: A property
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the property.
        type:
          type: string
          const: properties
        attributes:
          $ref: '#/components/schemas/PropertyAttributes'
        meta:
          $ref: '#/components/schemas/PropertyMeta'
        relationships:
          $ref: '#/components/schemas/PropertyRelationships'
    Scheme:
      type: object
      description: A scheme
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the scheme.
        type:
          type: string
          const: schemes
        attributes:
          $ref: '#/components/schemas/SchemeAttributes'
        meta:
          $ref: '#/components/schemas/SchemeMeta'
        relationships:
          $ref: '#/components/schemas/SchemeRelationships'
    User:
      type: object
      description: A user
      required:
        - id
        - type
        - attributes
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the user.
          examples:
            - 123e4567-e89b-12d3-a456-426614174000
        type:
          type: string
          const: users
        attributes:
          $ref: '#/components/schemas/UserAttributes'
        meta:
          $ref: '#/components/schemas/UserMeta'
        relationships:
          $ref: '#/components/schemas/UserRelationships'
    WorkOrder:
      type: object
      description: A work order
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the work order.
          examples:
            - fb082ee5-b678-4451-b02b-8269aaf262a3
        type:
          type: string
          const: work-orders
        attributes:
          $ref: '#/components/schemas/WorkOrderAttributes'
        meta:
          $ref: '#/components/schemas/WorkOrderMeta'
        relationships:
          $ref: '#/components/schemas/WorkOrderRelationships'
    SchemeShare:
      type: object
      description: A scheme share
      required:
        - id
        - type
        - attributes
        - relationships
        - meta
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the scheme share.
        type:
          type: string
          const: scheme-shares
        attributes:
          $ref: '#/components/schemas/SchemeShareAttributes'
        relationships:
          $ref: '#/components/schemas/SchemeShareRelationships'
        meta:
          $ref: '#/components/schemas/SchemeShareMeta'
    UserRelationship:
      type: object
      description: Represents a relationship to a user
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the user
        type:
          type: string
          const: users
    OrganisationRelationship:
      type: object
      description: Represents a relationship to an organisation
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the organisation
        type:
          type: string
          const: organisations
    ImageRelationship:
      type: object
      description: Represents a relationship to an image
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the image
        type:
          type: string
          const: images
    VideoRelationship:
      type: object
      description: Represents a relationship to a video
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the video
        type:
          type: string
          const: videos
    SchemeRelationship:
      type: object
      description: Represents a relationship to a scheme
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the scheme
        type:
          type: string
          const: schemes
    WorkOrderRelationship:
      type: object
      description: Represents a relationship to a work order
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the work order
        type:
          type: string
          const: work-orders
    OperationRelationship:
      type: object
      description: Represents a relationship to an operation
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the operation
        type:
          type: string
          const: operations
    PropertyRelationship:
      type: object
      description: Represents a relationship to a property
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the property
        type:
          type: string
          const: properties
    FormSubmissionRelationship:
      type: object
      description: Represents a relationship to a form submission
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form submission
        type:
          type: string
          const: form-submissions
    FormSchemaRelationship:
      type: object
      description: Represents a relationship to a form schema
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form schema
        type:
          type: string
          const: form-schemas
    FormRelationship:
      type: object
      description: Represents a relationship to a form
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form
        type:
          type: string
          const: forms
    SchemeShareRelationship:
      type: object
      description: Represents a relationship to a scheme share
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the scheme share
        type:
          type: string
          const: scheme-shares
    FormAttributes:
      type: object
      description: Attributes for a form
      required:
        - name
        - description
        - status
      properties:
        name:
          type: string
          description: The name of the form
        description:
          type: string
          description: The description of the form
        status:
          type: string
          enum:
            - draft
            - active
            - archived
          default: draft
          description: The current status of the form
    FormMeta:
      type: object
      description: Metadata for a form
      required:
        - created_at
        - updated_at
        - modified_at
        - counts
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the form was created
        updated_at:
          type: string
          format: date-time
          description: The date and time when the form was last updated
        modified_at:
          type: string
          format: date-time
          description: The date and time when the form was last modified
        counts:
          type: object
          properties:
            schemas:
              type: integer
              description: The number of schemas this form has.
              format: int64
              minimum: 0
              default: 0
            categories:
              type: integer
              description: The number of categories this form has.
              format: int64
              minimum: 0
              default: 0
            submissions:
              type: integer
              description: The number of submissions this form has.
              format: int64
              minimum: 0
              default: 0
            submission_versions:
              type: integer
              description: The number of submission versions this form has.
              format: int64
              minimum: 0
              default: 0
    FormRelationships:
      type: object
      description: Relationships for a form
      required:
        - organisation
        - categories
        - schemas
      properties:
        author:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/UserRelationship'
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        categories:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/FormCategoryRelationship'
        workflow:
          type: object
          required:
            - data
          properties:
            data:
              oneOf:
                - $ref: '#/components/schemas/WorkflowDefinitionRelationship'
                - type: 'null'
        latest_schema:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FormSchemaRelationship'
        schemas:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/FormSchemaRelationship'
        submissions:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/FormSubmissionRelationship'
    FormSchemaAttributes:
      type: object
      description: Attributes for a form schema
      required:
        - model
        - view
        - version
      properties:
        model:
          type: object
          description: >-
            The model schema for your data. This follows the JSON Schema
            specification, so the value here must be a valid JSON Schema.
          additionalProperties: true
        view:
          type: object
          required:
            - title
            - sections
          properties:
            title:
              type: string
              description: The title of the form view
            sections:
              type: array
              items:
                type: object
                required:
                  - title
                  - description
                  - rows
                properties:
                  title:
                    type: string
                    description: The title of the section
                  description:
                    type: string
                    description: The description of the section
                  order:
                    type: integer
                    minimum: 0
                  conditions:
                    type: object
                    description: Conditional logic for showing this section
                  rows:
                    type: array
                    items:
                      type: object
                      required:
                        - span
                        - columns
                        - title
                        - description
                      properties:
                        title:
                          type: string
                          description: The title of the row
                        description:
                          type: string
                          description: The description of the row
                        order:
                          type: integer
                          minimum: 0
                        span:
                          type: integer
                          minimum: 1
                          maximum: 12
                        columns:
                          type: array
                          items:
                            type: object
                            required:
                              - span
                              - blocks
                              - title
                              - description
                              - order
                            properties:
                              span:
                                type: integer
                                minimum: 1
                                maximum: 12
                              order:
                                type: integer
                                minimum: 0
                              blocks:
                                type: array
                                description: The form blocks in this column
                                items:
                                  type: object
                              title:
                                type: string
                                description: The title of the column
                              description:
                                type: string
                                description: The description of the column
        version:
          type: string
          pattern: ^\d+\.\d+\.\d+$
          description: Semantic version of the form schema
    FormSchemaMeta:
      type: object
      description: Metadata for a form schema
      required:
        - created_at
        - updated_at
        - latest
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the form schema was created
        updated_at:
          type: string
          format: date-time
          description: The date and time when the form schema was last updated
        latest:
          type: object
          properties:
            id:
              type: string
              format: uuid
              description: The ID of the latest version
            version:
              type: string
              description: The last version's semantic version
              pattern: ^\d+\.\d+\.\d+$
    FormSchemaRelationships:
      type: object
      description: Relationships for a form schema
      properties:
        form:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FormRelationship'
    FormSubmissionMeta:
      type: object
      description: Metadata for a form submission
      required:
        - created_at
        - modified_at
        - counts
        - status
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the form submission was created
        modified_at:
          type: string
          format: date-time
          description: The date and time when the form submission was last modified
        status:
          type: string
          description: >
            The lifecycle status of the submission. A `draft` submission is
            partial and was saved

            without validation and stays out of the form's workflow; a
            `submitted` submission has

            been validated. A submission cannot return to draft once submitted.
          enum:
            - draft
            - submitted
        counts:
          type: object
          properties:
            contributors:
              type: integer
              description: The number of contributors to this form submission
              format: int64
              minimum: 0
              default: 0
            versions:
              type: integer
              description: The number of versions of this form submission
              format: int64
              minimum: 0
              default: 1
        workflow:
          type: object
          properties:
            current_step:
              type: object
              required:
                - id
                - type
              properties:
                id:
                  type: string
                  description: The step ID
                type:
                  type: string
                  description: The step type
                  enum:
                    - initial
                    - intermediate
                    - completed
                    - rejected
                    - cancelled
    FormSubmissionRelationships:
      type: object
      description: Relationships for a form submission
      properties:
        form:
          type: object
          properties:
            data:
              $ref: '#/components/schemas/FormRelationship'
        versions:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/FormSubmissionVersionRelationship'
        scheme_shares:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/SchemeShareRelationship'
        workflow:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/WorkflowDefinitionRelationship'
        workflow_version:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/WorkflowDefinitionVersionRelationship'
        workflow_instance:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/WorkflowInstanceRelationship'
    ImageAttributes:
      type: object
      description: Attributes for an image
      required:
        - content
      properties:
        content:
          type: string
          description: The base64 encoded content of the image
        mime_type:
          type: string
          description: The MIME type of the image
          examples:
            - image/png
            - image/jpeg
            - image/gif
        extension:
          type: string
          description: The file extension of the image
          examples:
            - .png
            - .jpg
            - .gif
        width:
          type: integer
          description: The width of the image in pixels
          minimum: 1
        height:
          type: integer
          description: The height of the image in pixels
          minimum: 1
        bytes:
          type: integer
          description: The size of the image in bytes
          minimum: 0
        attach_time:
          type: string
          format: date-time
          description: The time the image was attached
    ImageMeta:
      type: object
      description: Metadata for an image
      required:
        - created_at
        - updated_at
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the image was created
        updated_at:
          type: string
          format: date-time
          description: The date and time when the image was last updated
    ImageRelationships:
      type: object
      description: Relationships for an image
      properties:
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        author:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/AuthorRelationship'
    VideoAttributes:
      type: object
      description: Attributes of a video
      required:
        - status
        - analyse
        - formats
      properties:
        status:
          type: string
          description: The processing lifecycle state of the video.
          enum:
            - uploaded
            - processing
            - ready
            - failed
        analyse:
          type: boolean
          description: Whether video intelligence was requested for this video.
        duration_ms:
          type:
            - integer
            - 'null'
          description: Playback duration in milliseconds, populated once known.
        formats:
          type: array
          description: The stored variants of the video.
          items:
            type: object
            required:
              - role
              - content_type
              - playable
            properties:
              role:
                type: string
                enum:
                  - original
                  - web
              content_type:
                type: string
                enum:
                  - video/mp4
                  - video/quicktime
                  - video/webm
              width:
                type: integer
              height:
                type: integer
              size:
                type: integer
                format: int64
              playable:
                type: boolean
                description: The variant served by default by the stream proxy.
        poster:
          type:
            - object
            - 'null'
          description: The poster still frame, once generated.
          properties:
            width:
              type: integer
            height:
              type: integer
        analysis:
          type:
            - object
            - 'null'
          description: Video intelligence results, present only when analysis has run.
          properties:
            status:
              type: string
              enum:
                - none
                - processing
                - ready
                - failed
            summary:
              type:
                - string
                - 'null'
            transcript:
              type:
                - object
                - 'null'
              properties:
                language:
                  type: string
                text:
                  type: string
            labels:
              type: array
              items:
                type: object
                properties:
                  description:
                    type: string
                  confidence:
                    type: number
    VideoMeta:
      type: object
      description: Metadata for a video
      required:
        - created_at
        - links
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time the video was created.
        links:
          type: object
          description: Proxy playback URLs.
          required:
            - stream
          properties:
            stream:
              type: string
              description: Range-aware streaming URL for the playable format.
            poster:
              type: string
              description: Poster image URL (absent until a poster exists).
    VideoRelationships:
      type: object
      description: Relationships for a video
      required:
        - organisation
      properties:
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        author:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/AuthorRelationship'
    OperationAttributes:
      type: object
      description: Attributes for an operation
      required:
        - name
        - status
      properties:
        name:
          type: string
        code:
          type: string
        description:
          type: string
        dates:
          type: object
          properties:
            scheduled:
              type: object
              properties:
                start:
                  type: string
                  format: date-time
                end:
                  type: string
                  format: date-time
        labels:
          type: array
          items:
            $ref: '#/components/schemas/Label'
        requirements:
          oneOf:
            - type: object
              properties:
                forms:
                  oneOf:
                    - type: array
                      items:
                        type: object
                        required:
                          - id
                          - required
                        properties:
                          id:
                            type: string
                            format: uuid
                          required:
                            type: boolean
                    - type: 'null'
            - type: 'null'
        status:
          type: string
          enum:
            - done
            - in_progress
            - todo
        done_reason:
          type:
            - string
            - 'null'
          enum:
            - aborted
            - completed
            - cancelled
            - null
      allOf:
        - if:
            properties:
              status:
                const: done
          then:
            required:
              - done_reason
    OperationMeta:
      type: object
      description: Metadata for an operation
      required:
        - created_at
        - updated_at
        - counts
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the operation was created
        updated_at:
          type: string
          format: date-time
          description: The date and time when the operation was last updated
        counts:
          type: object
          required:
            - streets
            - properties
          properties:
            streets:
              type: integer
              description: The number of streets in this operation
              format: int64
              minimum: 0
              default: 0
            properties:
              type: integer
              description: The number of properties in this operation
              format: int64
              minimum: 0
              default: 0
        related_data:
          type: object
          description: Related resources for the operation
          properties:
            properties:
              type: array
              description: Array of property IDs with postcodes
              items:
                type: object
                description: Property ID and Postcode
                required:
                  - id
                  - postcode
                properties:
                  id:
                    type: string
                    format: uuid
                    description: The ID of the property
                  postcode:
                    type: string
                    description: Postcode of the property
    OperationRelationships:
      type: object
      description: Relationships for an operation
      required:
        - work_order
        - scheme
        - organisation
      properties:
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        appointment:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/AppointmentRelationship'
        scheme:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/SchemeRelationship'
        work_order:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/WorkOrderRelationship'
        permits:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/PermitRelationship'
        template:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OperationTemplateRelationship'
        type:
          type: object
          properties:
            data:
              $ref: '#/components/schemas/OperationTypeRelationship'
        teams:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/TeamRelationship'
        assignees:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        properties:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/PropertyRelationship'
        streets:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/StreetRelationship'
    OrganisationAttributes:
      type: object
      description: Attributes for an organisation
      required:
        - name
        - slug
        - sandbox
      properties:
        name:
          type: string
          description: The name of the organisation.
          examples:
            - Acme Construction Ltd
        slug:
          type: string
          description: The URL-friendly identifier for the organisation.
          examples:
            - acme-construction
        description:
          type: string
          description: A short description of the organisation.
          examples:
            - >-
              Leading construction company specializing in infrastructure
              projects
        sandbox:
          type: boolean
          description: Whether the organisation is a sandbox (i.e. a test organisation)
          examples:
            - false
        settings:
          type: object
          properties:
            teams:
              type: object
              description: Team-related settings for the organisation.
              properties:
                customer_representatives:
                  type: array
                  description: >
                    IDs of teams within this organisation whose members act as

                    customer service representatives. Each entry must reference
                    a

                    team that belongs to this organisation.
                  items:
                    type: string
                    format: uuid
                  uniqueItems: true
                  examples:
                    - - b234c567-8901-2345-6789-abcdef012345
    OrganisationMeta:
      type: object
      description: Meta information for an organisation
      required:
        - v3
        - status
      properties:
        created_at:
          type: string
          format: date-time
          description: The creation time of the organisation.
          examples:
            - '2023-01-15T10:30:00.000Z'
        updated_at:
          type: string
          format: date-time
          description: The last update time of the organisation.
          examples:
            - '2023-02-20T14:45:00.000Z'
        v3:
          type: boolean
          description: Whether the organisation is using version 3 exclusively.
          examples:
            - true
        status:
          type: string
          enum:
            - active
            - inactive
          default: active
          description: The current status of the organisation.
          examples:
            - active
        features:
          type: array
          description: Available features and their limits for the organisation.
          items:
            type: object
            properties:
              name:
                type: string
                description: The name of the feature.
                examples:
                  - advanced_reporting
              enabled:
                type: boolean
                description: Whether the feature is enabled.
                examples:
                  - true
              limit:
                type: integer
                description: The usage limit for this feature (if applicable).
                examples:
                  - 1000
    OrganisationRelationships:
      type: object
      description: Relationships for an organisation
      properties:
        users:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        service_accounts:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/ServiceAccountRelationship'
        groups:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserGroupRelationship'
        teams:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/TeamRelationship'
        nomenclature:
          type: object
          required:
            - data
          properties:
            data:
              oneOf:
                - $ref: '#/components/schemas/NomenclatureRelationship'
                - type: 'null'
    PropertyAttributes:
      type: object
      description: Attributes for a property
      required:
        - address
      properties:
        address:
          type: object
          properties:
            description:
              type: string
            department:
              type: string
            organisation:
              type: string
            number:
              type: string
            name:
              type: string
            thoroughfare:
              type: string
            dependent_thoroughfare:
              type: string
            post_town:
              type: string
            postcode:
              type: string
            po_box:
              type: string
            country:
              type: string
        uprn:
          type: number
        psr:
          description: Deprecated. Use the psrs relationship instead.
          type: object
          properties:
            indicator:
              type: boolean
            priority:
              type:
                - integer
                - 'null'
            notes:
              type:
                - string
                - 'null'
            contact:
              type:
                - string
                - 'null'
        meters:
          description: Deprecated. Use the meters relationship instead.
          type: array
          items:
            type: object
            properties:
              type:
                type: string
              number:
                type: integer
        location:
          type: object
          properties:
            british_national_grid:
              type:
                - object
                - 'null'
              properties:
                easting:
                  type: number
                  format: double
                northing:
                  type: number
                  format: double
            lat_long:
              type:
                - object
                - 'null'
              properties:
                latitude:
                  type: number
                  format: double
                longitude:
                  type: number
                  format: double
    PropertyMeta:
      type: object
      description: Metadata for a property
      required:
        - created_at
        - updated_at
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the property was created
        updated_at:
          type: string
          format: date-time
          description: The date and time when the property was last updated
    PropertyRelationships:
      type: object
      description: Relationships for a property
      properties:
        street:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/StreetRelationship'
        meters:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/MeterRelationship'
        psrs:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/PSRRelationship'
    SchemeAttributes:
      type: object
      description: Attributes for a scheme
      required:
        - name
      properties:
        name:
          type: string
        code:
          type: string
        description:
          type: string
        dates:
          type: object
          properties:
            anticipated:
              type: object
              properties:
                start:
                  type: string
                  format: date-time
                end:
                  type: string
                  format: date-time
        labels:
          type: array
          items:
            $ref: '#/components/schemas/Label'
    SchemeMeta:
      type: object
      description: Metadata for a scheme
      required:
        - created_at
        - updated_at
        - from_template
        - modified_at
        - dates
        - completeness
        - counts
        - is_default
      properties:
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        modified_at:
          type: string
          format: date-time
        imported_at:
          type: string
          format: date-time
        from_template:
          description: Whether this scheme was created from a template.
          type: boolean
        dates:
          type: object
          properties:
            scheduled:
              type: object
              properties:
                start:
                  type: string
                  format: date-time
                end:
                  type: string
                  format: date-time
        counts:
          type: object
          properties:
            operations:
              type: integer
              description: >-
                The number of operations in this scheme (from all of the work
                orders).
              format: int64
              minimum: 0
              default: 0
            permits:
              type: integer
              description: >-
                The number of permits in this scheme (from all of the operations
                in all of the work orders).
              format: int64
              minimum: 0
              default: 0
            properties:
              type: integer
              description: >-
                The number of properties in this scheme (from all of the
                operations in all of the work orders).
              format: int64
              minimum: 0
              default: 0
            streets:
              type: integer
              description: >-
                The number of streets in this scheme (from all of the operations
                in all of the work orders).
              format: int64
              minimum: 0
              default: 0
            work_orders:
              type: integer
              description: The number of work orders in this scheme.
              format: int64
              minimum: 0
              default: 0
        completeness:
          type: object
          required:
            - counts
            - percentage
            - statuses
            - done_reasons
          properties:
            percentage:
              type: object
              required:
                - completed
                - aborted
                - unknown
                - cancelled
              properties:
                completed:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
                aborted:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
                unknown:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 100
                cancelled:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
            counts:
              type: object
              required:
                - completed
                - aborted
                - unknown
                - cancelled
              properties:
                completed:
                  type: integer
                  minimum: 0
                  default: 0
                aborted:
                  type: integer
                  minimum: 0
                  default: 0
                unknown:
                  type: integer
                  minimum: 0
                  default: 1
                cancelled:
                  type: integer
                  minimum: 0
                  default: 0
            statuses:
              type: object
              required:
                - counts
                - percentages
              properties:
                counts:
                  type: object
                  required:
                    - done
                    - in_progress
                    - todo
                  properties:
                    done:
                      type: integer
                      minimum: 0
                      default: 0
                    in_progress:
                      type: integer
                      minimum: 0
                      default: 0
                    todo:
                      type: integer
                      minimum: 0
                      default: 0
                percentages:
                  type: object
                  required:
                    - done
                    - in_progress
                    - todo
                  properties:
                    done:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                    in_progress:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                    todo:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
            done_reasons:
              type: object
              required:
                - counts
                - percentages
              properties:
                counts:
                  type: object
                  required:
                    - aborted
                    - cancelled
                    - completed
                  properties:
                    aborted:
                      type: integer
                      minimum: 0
                      default: 0
                    cancelled:
                      type: integer
                      minimum: 0
                      default: 0
                    completed:
                      type: integer
                      minimum: 0
                      default: 0
                percentages:
                  type: object
                  required:
                    - aborted
                    - cancelled
                    - completed
                  properties:
                    aborted:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                    cancelled:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                    completed:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
        is_default:
          type: boolean
          default: false
    SchemeRelationships:
      type: object
      description: Relationships for a scheme
      required:
        - organisation
      properties:
        scheme_template:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/SchemeTemplateRelationship'
        work_orders:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/WorkOrderRelationship'
        template:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/SchemeTemplateRelationship'
        site_managers:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        assignees:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        teams:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/TeamRelationship'
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        folder:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FolderRelationship'
        contracts:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/SchemeContractRelationship'
    UserAttributes:
      type: object
      description: Attributes for a user
      properties:
        email:
          type: string
          format: email
          description: The email address of the user.
          examples:
            - john.doe@example.com
        status:
          type: string
          enum:
            - active
            - inactive
            - pending
            - unknown
          description: >
            The membership status of this user in the organisation in the
            request URL.

            Only populated on org-scoped member endpoints; absent on global user

            endpoints.
          examples:
            - active
        identities:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: The unique identifier for the identity.
                examples:
                  - 39ce13b8-1116-416a-ad5f-3c5edfd44f53
              platform:
                type: string
                description: The platform of the identity.
                examples:
                  - multi_tenant
              meta:
                type:
                  - object
                  - 'null'
                additionalProperties: true
                description: Additional metadata for the identity.
        profile:
          type: object
          properties:
            work:
              type: object
              properties:
                occupation:
                  type: string
                  description: The occupation of the user.
                  examples:
                    - Site Manager
                cscs:
                  type: string
                  description: The CSCS card number of the user.
                  examples:
                    - CSC123456
                eusr:
                  type: string
                  description: The EUSR card number of the user.
                  examples:
                    - EUR789123
                start_date:
                  type: string
                  format: date
                  description: The start date of the user's employment.
                  examples:
                    - '2020-03-01T00:00:00.000Z'
            personal:
              type: object
              properties:
                first_name:
                  type: string
                  description: The first name of the user.
                  examples:
                    - John
                last_name:
                  type: string
                  description: The last name of the user.
                  examples:
                    - Doe
                dob:
                  type: string
                  format: date
                  description: The date of birth of the user.
                  examples:
                    - '1985-06-15T00:00:00.000Z'
                username:
                  type: string
                  description: The username of the user.
                  examples:
                    - johndoe
            contact:
              type: object
              properties:
                mobile:
                  type: string
                  description: The mobile number of the user.
                  examples:
                    - +44 7700 900123
                landline:
                  type: string
                  description: The landline of the user.
                  examples:
                    - +44 20 7946 0958
            address:
              type: object
              properties:
                number:
                  type: string
                  description: The house number of the user's address.
                  default: ''
                  examples:
                    - '42'
                street:
                  type: string
                  description: The street of the user's address.
                  examples:
                    - High Street
                area:
                  type: string
                  description: The area of the user's address.
                  examples:
                    - Westminster
                town:
                  type: string
                  description: The town of the user's address.
                  examples:
                    - London
                county:
                  type: string
                  description: The county of the user's address.
                  examples:
                    - Greater London
                postcode:
                  type: string
                  description: The postcode of the user's address.
                  examples:
                    - SW1A 1AA
                country_code:
                  type: string
                  description: The country code of the user's address.
                  examples:
                    - GB
                what3words:
                  type: string
                  description: The what3words location of the user's address.
                  examples:
                    - filled.count.soap
            settings:
              type: object
              properties:
                preferred_language:
                  type: string
                  description: The preferred language of the user.
                  default: en-GB
                  examples:
                    - en-GB
                timezone:
                  type: string
                  description: The timezone of the user.
                  examples:
                    - Europe/London
    UserMeta:
      type: object
      description: Metadata for a user
      properties:
        managed_type:
          type: string
          enum:
            - none
            - scim
            - organisation
            - unknown
          description: How this user is managed.
    UserRelationships:
      type: object
      description: Relationships for a user
      properties:
        organisations:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/OrganisationRelationship'
        teams:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/TeamRelationship'
        managing_organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
    WorkOrderAttributes:
      type: object
      description: Attributes for a work order
      required:
        - name
      properties:
        name:
          type: string
          description: The name of the work order
          examples:
            - Infrastructure Maintenance Work Order
        code:
          type: string
          description: The code of the work order
          examples:
            - WO-2025-001
        description:
          type: string
          description: The description of the work order
          examples:
            - Routine maintenance and inspection of electrical infrastructure
        dates:
          type: object
          description: The dates associated with the work order
          properties:
            anticipated:
              type: object
              description: The anticipated start and end dates
              properties:
                start:
                  type: string
                  format: date-time
                  description: The anticipated start date
                  examples:
                    - '2025-08-01T09:00:00Z'
                end:
                  type: string
                  format: date-time
                  description: The anticipated end date
                  examples:
                    - '2025-08-15T17:00:00Z'
        labels:
          type: array
          description: The labels associated with the work order
          items:
            $ref: '#/components/schemas/Label'
    WorkOrderMeta:
      type: object
      description: Metadata for a work order
      required:
        - created_at
        - updated_at
        - modified_at
        - counts
        - dates
        - completeness
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the work order was created
          examples:
            - '2025-05-06T18:37:12Z'
        updated_at:
          type: string
          format: date-time
          description: The date and time when the work order was last updated
          examples:
            - '2025-05-07T21:12:46Z'
        modified_at:
          type: string
          format: date-time
          description: The date and time when the work order was last modified
          examples:
            - '2025-05-07T21:12:46Z'
        dates:
          type: object
          description: The scheduled dates for the work order
          properties:
            scheduled:
              type: object
              description: The scheduled start and end dates
              properties:
                start:
                  type: string
                  format: date-time
                  description: The scheduled start date
                  examples:
                    - '2025-08-01T09:00:00Z'
                end:
                  type: string
                  format: date-time
                  description: The scheduled end date
                  examples:
                    - '2025-08-15T17:00:00Z'
        counts:
          type: object
          description: The counts of related entities
          required:
            - operations
            - properties
            - streets
          properties:
            operations:
              type: integer
              description: The number of operations in this work order
              format: int64
              minimum: 0
              default: 0
              examples:
                - 1
            streets:
              type: integer
              description: >-
                The number of streets in this work order (from all of the
                operations in this work order)
              format: int64
              minimum: 0
              default: 0
              examples:
                - 1
            properties:
              type: integer
              description: >-
                The number of properties in this work order (from all of the
                operations in this work order)
              format: int64
              minimum: 0
              default: 0
              examples:
                - 1
        completeness:
          type: object
          description: The completeness statistics for the work order
          required:
            - percentage
            - counts
            - statuses
            - done_reasons
          properties:
            percentage:
              type: object
              description: The percentage breakdown of completion status
              required:
                - completed
                - aborted
                - unknown
                - cancelled
              properties:
                completed:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
                  description: The percentage of completed operations
                  examples:
                    - 25
                aborted:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
                  description: The percentage of aborted operations
                  examples:
                    - 0
                unknown:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
                  description: The percentage of operations with unknown status
                  examples:
                    - 75
                cancelled:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 0
                  description: The percentage of cancelled operations
                  examples:
                    - 0
            counts:
              type: object
              description: The count breakdown of completion status
              required:
                - completed
                - aborted
                - unknown
                - cancelled
              properties:
                completed:
                  type: integer
                  minimum: 0
                  default: 0
                  description: The number of completed operations
                  examples:
                    - 1
                aborted:
                  type: integer
                  minimum: 0
                  default: 0
                  description: The number of aborted operations
                  examples:
                    - 0
                unknown:
                  type: integer
                  minimum: 0
                  default: 0
                  description: The number of operations with unknown status
                  examples:
                    - 3
                cancelled:
                  type: integer
                  minimum: 0
                  default: 0
                  description: The number of cancelled operations
                  examples:
                    - 0
            statuses:
              type: object
              required:
                - counts
                - percentages
              properties:
                counts:
                  type: object
                  required:
                    - done
                    - in_progress
                    - todo
                  properties:
                    done:
                      type: integer
                      minimum: 0
                      default: 0
                      examples:
                        - 3
                    in_progress:
                      type: integer
                      minimum: 0
                      default: 0
                      examples:
                        - 1
                    todo:
                      type: integer
                      minimum: 0
                      default: 0
                      examples:
                        - 1
                percentages:
                  type: object
                  required:
                    - done
                    - in_progress
                    - todo
                  properties:
                    done:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                      examples:
                        - 60
                    in_progress:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                      examples:
                        - 20
                    todo:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                      examples:
                        - 20
            done_reasons:
              type: object
              required:
                - counts
                - percentages
              properties:
                counts:
                  type: object
                  required:
                    - aborted
                    - cancelled
                    - completed
                  properties:
                    aborted:
                      type: integer
                      minimum: 0
                      default: 0
                      examples:
                        - 1
                    cancelled:
                      type: integer
                      minimum: 0
                      default: 0
                      examples:
                        - 2
                    completed:
                      type: integer
                      minimum: 0
                      default: 0
                      examples:
                        - 2
                percentages:
                  type: object
                  required:
                    - aborted
                    - cancelled
                    - completed
                  properties:
                    aborted:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                      examples:
                        - 20
                    cancelled:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                      examples:
                        - 40
                    completed:
                      type: number
                      minimum: 0
                      maximum: 100
                      default: 0
                      examples:
                        - 40
    WorkOrderRelationships:
      type: object
      description: Relationships for a work order
      required:
        - organisation
        - scheme
        - operations
      properties:
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        assignees:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        teams:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/TeamRelationship'
        scheme:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/SchemeRelationship'
        operations:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/OperationRelationship'
        template:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/WorkOrderTemplateRelationship'
        site_managers:
          type: object
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/UserRelationship'
        folder:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/FolderRelationship'
    SchemeShareAttributes:
      type: object
      description: Attributes for a scheme share
      required:
        - permissions
        - read_only
      properties:
        permissions:
          type: array
          items:
            type: string
        read_only:
          type: boolean
          description: Indicates whether the scheme share is read-only
    SchemeShareRelationships:
      type: object
      required:
        - organisation_bridge
        - owner
        - shared_by
        - shared_with
        - scheme
      description: Relationships for a scheme share
      properties:
        organisation_bridge:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationBridgeRelationship'
        owner:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        shared_by:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        shared_with:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        scheme:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/SchemeRelationship'
    SchemeShareMeta:
      type: object
      description: Metadata for a scheme
      required:
        - start
        - end
      properties:
        start:
          type: string
          format: date-time
        end:
          type: string
          format: date-time
    FormCategoryRelationship:
      type: object
      description: Represents a relationship to a form category
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form category
        type:
          type: string
          const: form-categories
    WorkflowDefinitionRelationship:
      type: object
      description: Represents a relationship to a workflow definition
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the workflow definition
        type:
          type: string
          const: workflow-definitions
    FormSubmissionVersionRelationship:
      type: object
      description: Represents a relationship to a form submission version
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the form submission version
        type:
          type: string
          const: form-submission-versions
    WorkflowDefinitionVersionRelationship:
      type: object
      description: Represents a relationship to a workflow definition version
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the workflow definition version
        type:
          type: string
          const: workflow-definition-versions
    WorkflowInstanceRelationship:
      type: object
      description: Represents a relationship to a workflow instance
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the workflow instance
        type:
          type: string
          const: workflow-instances
    AuthorRelationship:
      type: object
      description: Represents a relationship to an author
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the author
        type:
          type: string
          const: authors
    Label:
      type: object
      description: A label object
      required:
        - key
        - value
      properties:
        key:
          type: string
          minLength: 1
          examples:
            - Your label key
        value:
          type: string
          examples:
            - Your label value
    AppointmentRelationship:
      type: object
      description: Represents a relationship to an appointment
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the appointment
        type:
          type: string
          const: appointments
    PermitRelationship:
      type: object
      description: Represents a relationship to a permit
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the permit
        type:
          type: string
          const: permits
    OperationTemplateRelationship:
      type: object
      description: Represents a relationship to an operation template
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the operation template
        type:
          type: string
          const: operation-templates
    OperationTypeRelationship:
      type: object
      description: Represents a relationship to an operation type
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the operation type
        type:
          type: string
          const: operation-types
    TeamRelationship:
      type: object
      description: Represents a relationship to a team
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the team
        type:
          type: string
          const: teams
    StreetRelationship:
      type: object
      description: Represents a relationship to a street
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the street
        type:
          type: string
          const: streets
    ServiceAccountRelationship:
      type: object
      description: Represents a relationship to a service account
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the service account
        type:
          type: string
          const: service-accounts
    UserGroupRelationship:
      type: object
      description: Represents a relationship to a group
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the group
        type:
          type: string
          const: groups
    NomenclatureRelationship:
      type: object
      description: Represents a relationship to a nomenclature resource
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the nomenclature resource
        type:
          type: string
          const: nomenclature
    MeterRelationship:
      type: object
      description: Represents a relationship to a meter
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the meter
        type:
          type: string
          const: meters
    PSRRelationship:
      type: object
      description: Represents a relationship to a PSR record
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the PSR record
        type:
          type: string
          const: psrs
    SchemeTemplateRelationship:
      type: object
      description: Represents a relationship to a scheme template
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the scheme template
        type:
          type: string
          const: scheme-templates
    FolderRelationship:
      type: object
      description: Represents a relationship to a folder
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the folder
        type:
          type: string
          const: folders
    SchemeContractRelationship:
      type: object
      description: Represents a relationship to a scheme contract
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the scheme contract
        type:
          type: string
          const: scheme-contracts
    WorkOrderTemplateRelationship:
      type: object
      description: Represents a relationship to a work order template
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the work order template
        type:
          type: string
          const: work-order-templates
    OrganisationBridgeRelationship:
      type: object
      description: Represents a relationship to an organisation bridge
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the organisation bridge
        type:
          type: string
          const: organisation-bridges
  securitySchemes:
    Session:
      description: |
        Session token for authentication.
      in: header
      name: X-Session-Token
      type: apiKey
    OAuth2:
      description: |
        OAuth2 token for authentication.
      flows:
        clientCredentials:
          scopes: {}
          tokenUrl: https://auth.ctrl-hub.com/oauth2/token
      type: oauth2
    Cookie:
      description: |
        Cookie token for authentication.
      in: cookie
      name: ctrl_hub_session
      type: apiKey

````