> ## 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.

# List construction phase plan resources

> List construction phase plan resources the caller can read.




## OpenAPI

````yaml /api-reference/openapi.yaml get /v3/construction-phase-plans
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: >
      Copies of a mobile device's local database, sent by the operative on
      request so that people

      in their organisation can recover work that never reached the server. Kept
      for 30 days, and

      visible to people granted `device-backups:view` in the organisation each
      is filed against.
    name: Device Backups
  - description: >
      A record of documents the platform generated and handed over, retained as
      evidence of what

      was issued. `subject_type` says what kind of records an export covers, and
      it is what decides

      how the request is authorised: there is no export permission of its own,
      so if you can see the

      records you can export them.
    name: Exports
  - description: >
      Scheduled delivery of a saved query's results, as a CSV attachment or a
      summary email. Every run is retained with the file it sent, so what a
      recipient received stays retrievable. A report runs as the person who
      created it, under their own access.
    name: Reports
  - 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: >
      Competency: the assessments, training items, inductions and registrations
      an

      organisation requires, and the specifications that combine them.
    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: |
      The central cost register: time-versioned rate codes for material, labour,
      contractor and miscellaneous spend, used to cost work against the job
      hierarchy.
    name: Costs
  - description: >
      Locations are places an organisation manages, optionally classified by a
      location type.
    name: Locations
  - description: >
      Bulk loads of locations from an uploaded CSV. An import matches rows on
      the organisation's own

      `reference`, so re-importing a corrected file updates what is already
      there rather than

      doubling the population, and the import record is the audit trail for the
      whole load: the bulk

      write path deliberately emits no per-row events.
    name: Location Imports
  - 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: |
      Your personal inbox. A notification is the thing you receive: an envelope
      that carries what happened to one or more channels. Email is one of those
      channels, the inbox is another, and this is where the ones delivered to
      your inbox are listed, read, saved and archived.
    name: Notifications
  - 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: >
      A Construction Phase Plan is the Principal Contractor's plan for managing
      health and safety

      on a scheme, under CDM 2015. Its risks are control measures written
      against the hazards on

      the scheme's Pre-Construction Information. Each section is owned by one
      duty-holder role.
    name: Construction Phase Plans
  - description: >
      A Pre-Construction Information pack is the Client's information about a
      scheme under CDM

      2015, with its site hazards. A scheme has at most one. Each section is
      owned by one

      duty-holder role, and only that role can write it.
    name: Pre-Construction Information
  - description: >
      Site attendances record who was on site and when, whether or not they hold
      an account.

      There is no daily register resource: a day's register and who is currently
      on site are

      both queries over the attendances themselves.
    name: Site Attendances
  - 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/construction-phase-plans:
    get:
      tags:
        - Construction Phase Plans
      summary: List construction phase plan resources
      description: |
        List construction phase plan resources the caller can read.
      operationId: ListConstructionPhasePlans
      parameters:
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/offset'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/construction_phase_plans_include'
        - $ref: '#/components/parameters/construction_phase_plans_sort'
        - $ref: '#/components/parameters/construction_phase_plans_filter'
      responses:
        '200':
          $ref: '#/components/responses/ListConstructionPhasePlans'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorised'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Session: []
        - OAuth2: []
        - Cookie: []
components:
  parameters:
    limit:
      name: limit
      in: query
      description: Limit the number of resources returned by the API
      required: false
      schema:
        type: integer
        format: int64
        minimum: 1
        default: 100
    offset:
      name: offset
      in: query
      description: Offset the resources returned by the API
      required: false
      schema:
        type: integer
        format: int64
        minimum: 0
        default: 0
    page:
      name: page
      in: query
      description: >
        JSON:API pagination, as `page[limit]` and `page[offset]`. The same as
        the top-level `limit` and `offset` parameters; when both forms are sent,
        `page[...]` wins.
      required: false
      style: deepObject
      explode: true
      schema:
        type: object
        additionalProperties: false
        properties:
          limit:
            type: integer
            format: int64
            minimum: 1
            description: >-
              Limit the number of resources returned by the API. Defaults to the
              operation's `limit` default.
          offset:
            type: integer
            format: int64
            minimum: 0
            description: Offset the resources returned by the API. Defaults to 0.
    construction_phase_plans_include:
      name: include
      in: query
      description: A comma separated list of related resources to include.
      required: false
      style: form
      explode: false
      schema:
        type: array
        items:
          type: string
          enum:
            - scheme
    construction_phase_plans_sort:
      in: query
      name: sort
      description: A comma separated list of fields to sort by.
      required: false
      style: form
      explode: false
      schema:
        type: array
        items:
          type: string
          enum:
            - created_at
            - '-created_at'
    construction_phase_plans_filter:
      name: filter
      in: query
      description: >
        Filters the response data based on the value provided.


        Available filters:


        - `id`: Filter by ID

        - `scheme`: Filter by scheme ID. A scheme has at most one plan

        - `organisation`: Filter by the organisation that owns the scheme

        - `pre_construction_information`: Filter by the pack the plan was
        written from

        - `principal_contractor`: Filter by the Principal Contractor
        organisation


        For more information on using named filters, see [the
        docs](https://docs.ctrl-hub.com/api-reference/features#filtering)
      required: false
      schema:
        type: string
        default: ''
  responses:
    ListConstructionPhasePlans:
      description: A list of construction phase plan resources.
      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:
            allOf:
              - type: object
                required:
                  - data
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/ConstructionPhasePlan'
                  included:
                    $ref: '#/components/schemas/ConstructionPhasePlanIncludes'
              - $ref: '#/components/schemas/DocumentMeta'
              - $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
    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
  schemas:
    ConstructionPhasePlan:
      type: object
      description: >-
        The Principal Contractor's Construction Phase Plan for a scheme, written
        from its Pre-Construction Information. A scheme has at most one.
      required:
        - id
        - type
        - attributes
        - relationships
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          const: construction-phase-plans
        attributes:
          $ref: '#/components/schemas/ConstructionPhasePlanAttributes'
        relationships:
          $ref: '#/components/schemas/ConstructionPhasePlanRelationships'
    ConstructionPhasePlanIncludes:
      type: array
      description: Related resources that can be included with a construction phase plan
      items:
        discriminator:
          propertyName: type
          mapping:
            schemes: '#/components/schemas/Scheme'
        oneOf:
          - $ref: '#/components/schemas/Scheme'
    DocumentMeta:
      type: object
      description: Document level meta about the resources on the server in list endpoints.
      required:
        - meta
      properties:
        meta:
          type: object
          required:
            - pagination
          properties:
            features:
              $ref: '#/components/schemas/Features'
            pagination:
              $ref: '#/components/schemas/Pagination'
    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.

            `CH.003.080` (403) means the organisation in `meta.organisation_id`
            requires two-factor authentication and the caller's session does not
            satisfy it. The caller must set up or use a second factor, or sign
            in through their organisation's SAML single sign-on. Other OIDC
            sign-ins do not count.
          type: string
          examples:
            - AUTH.001
            - CH.003.080
        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
        meta:
          description: >-
            A JSON object containing additional information about the error.

            When a parameter caused the error, there will be a `resource`
            property with the name of the resource that caused the error.

            When `code` is `CH.003.080`, `organisation_id` names the
            organisation that requires two-factor authentication, which the
            caller's session does not satisfy.
          type: object
          properties:
            resource:
              type: string
              description: >-
                The resource a parameter error relates to, such as an
                unsupported include.
            organisation_id:
              type: string
              format: uuid
              examples:
                - c000c344-8847-47da-a091-32e75902d3b1
          additionalProperties: true
      required:
        - id
        - status
        - title
    ConstructionPhasePlanAttributes:
      type: object
      description: >
        Attributes for a Construction Phase Plan. Each section declares the
        duty-holder role that

        owns it in `x-cdm-owner`. Every party reads the whole plan; only the
        owning role writes a

        section.
      required:
        - health_and_safety_aims
        - site_rules
        - induction
        - welfare
        - emergency_arrangements
        - monitoring_and_review
        - key_operatives
        - client_checklist
        - attestations
        - current_revision
        - access
        - created_at
        - updated_at
      properties:
        health_and_safety_aims:
          $ref: '#/components/schemas/CPPHealthAndSafetyAims'
        site_rules:
          $ref: '#/components/schemas/CPPSiteRules'
        induction:
          $ref: '#/components/schemas/CPPInduction'
        welfare:
          $ref: '#/components/schemas/CPPWelfare'
        emergency_arrangements:
          $ref: '#/components/schemas/CPPEmergencyArrangements'
        monitoring_and_review:
          $ref: '#/components/schemas/CPPMonitoringAndReview'
        key_operatives:
          $ref: '#/components/schemas/CPPKeyOperatives'
        client_checklist:
          $ref: '#/components/schemas/CPPClientChecklist'
        attestations:
          $ref: '#/components/schemas/CDMAttestations'
        current_revision:
          type: integer
          readOnly: true
          description: >-
            The latest revision's number, or 0 before handover. After handover
            every change goes through a proposed change.
        handed_over_at:
          type:
            - string
            - 'null'
          format: date-time
          readOnly: true
        key_operatives_drift:
          $ref: '#/components/schemas/CPPKeyOperativesDrift'
        access:
          $ref: '#/components/schemas/CDMAccess'
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
    ConstructionPhasePlanRelationships:
      type: object
      description: Relationships for a construction phase plan
      required:
        - organisation
        - scheme
        - pre_construction_information
        - principal_contractor
      properties:
        organisation:
          type: object
          description: The organisation that owns the scheme.
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        scheme:
          type: object
          description: The scheme the plan is for.
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/SchemeRelationship'
        pre_construction_information:
          type: object
          description: The pack the plan was written from.
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/PreConstructionInformationRelationship'
        principal_contractor:
          type: object
          description: The Principal Contractor that wrote the plan.
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
        media_folder:
          type: object
          description: The managed folder holding a folder per risk.
          properties:
            data:
              $ref: '#/components/schemas/FolderRelationship'
    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'
    Features:
      type: object
      description: Represents feature configurations of the API
      properties:
        include:
          type: object
          properties:
            options:
              type: array
              items:
                type: string
                examples:
                  - related.resource
    Pagination:
      type: object
      description: Represents pagination details for API responses
      required:
        - counts
        - current_page
        - offsets
        - requested
      properties:
        counts:
          type: object
          required:
            - pages
            - resources
          properties:
            pages:
              type: integer
              examples:
                - 1
            resources:
              type: integer
              examples:
                - 1
        current_page:
          type: integer
          examples:
            - 1
        offsets:
          type: object
          required:
            - next
            - previous
          properties:
            next:
              type:
                - integer
                - 'null'
              examples:
                - null
            previous:
              type:
                - integer
                - 'null'
              examples:
                - null
        requested:
          type: object
          required:
            - limit
            - offset
          properties:
            limit:
              type: integer
              examples:
                - 10
            offset:
              type: integer
              examples:
                - 0
    CPPHealthAndSafetyAims:
      type: object
      description: Health and safety aims. Owned by the Principal Contractor.
      x-cdm-owner: principal_contractor
      additionalProperties: false
      properties:
        aims:
          type:
            - string
            - 'null'
    CPPSiteRules:
      type: object
      description: Mandatory site rules. Owned by the Principal Contractor.
      x-cdm-owner: principal_contractor
      additionalProperties: false
      properties:
        rules:
          type: array
          items:
            type: string
    CPPInduction:
      type: object
      description: >-
        What is put to every person signed in on site, in order. Owned by the
        Principal Contractor and versioned by the plan's revisions. A site
        attendance records the revision whose points were put to the attendee.
      x-cdm-owner: principal_contractor
      additionalProperties: false
      properties:
        points:
          type: array
          description: The induction points, in the order they are put to the attendee.
          items:
            type: string
        declarations:
          type: array
          description: The personal declarations the attendee is asked to make, in order.
          items:
            type: string
    CPPWelfare:
      type: object
      description: Welfare arrangements, by facility. Owned by the Principal Contractor.
      x-cdm-owner: principal_contractor
      additionalProperties: false
      properties:
        toilets:
          type:
            - string
            - 'null'
        washing:
          type:
            - string
            - 'null'
        drinking_water:
          type:
            - string
            - 'null'
        rest_and_eating:
          type:
            - string
            - 'null'
        changing_and_drying:
          type:
            - string
            - 'null'
        location:
          type:
            - string
            - 'null'
    CPPEmergencyArrangements:
      type: object
      description: Emergency and first-aid arrangements. Owned by the Principal Contractor.
      x-cdm-owner: principal_contractor
      additionalProperties: false
      properties:
        emergency_procedures:
          type:
            - string
            - 'null'
        fire_arrangements:
          type:
            - string
            - 'null'
        first_aid_arrangements:
          type:
            - string
            - 'null'
        first_aiders:
          type: array
          items:
            $ref: '#/components/schemas/CDMPerson'
        nearest_hospital:
          type:
            - string
            - 'null'
    CPPMonitoringAndReview:
      type: object
      description: Monitoring and review arrangements. Owned by the Principal Contractor.
      x-cdm-owner: principal_contractor
      additionalProperties: false
      properties:
        arrangements:
          type:
            - string
            - 'null'
        review_frequency:
          type:
            - string
            - 'null'
    CPPKeyOperatives:
      type: array
      description: Key operatives on site. Owned by the Principal Contractor.
      x-cdm-owner: principal_contractor
      items:
        type: object
        additionalProperties: false
        required:
          - name
        properties:
          name:
            type: string
            description: >-
              The name as written. May be blank when a user is linked, whose
              name is then used; an unlinked operative needs a name.
          role:
            type:
              - string
              - 'null'
            description: >-
              The role as written. May be blank when a job role is linked, whose
              alias or name is then used.
          phone:
            type:
              - string
              - 'null'
          user_id:
            type:
              - string
              - 'null'
            format: uuid
            description: >-
              The user this operative is, when they have an account. When a job
              role is linked too, the user must hold it. The name is kept as
              written either way.
          job_role_id:
            type:
              - string
              - 'null'
            format: uuid
            description: >-
              The job role this operative holds, when it is one the platform
              records. It must apply to schemes and belong to the scheme owner,
              because only those can be posted on the scheme's Roles tab. When a
              revision is issued, an operative with both a user and a job role
              is posted in it. The role is kept as written either way.
    CPPClientChecklist:
      type: object
      description: >
        The Client's checks on the arrangements, one field per item. Owned by
        the Client and

        Principal Designer, because satisfying itself that the plan is adequate
        is a Client duty.
      x-cdm-owner: client_and_principal_designer
      additionalProperties: false
      properties:
        management_arrangements:
          $ref: '#/components/schemas/CPPChecklistItem'
        time_and_resources:
          $ref: '#/components/schemas/CPPChecklistItem'
        pre_construction_information:
          $ref: '#/components/schemas/CPPChecklistItem'
        principal_designer_appointed:
          $ref: '#/components/schemas/CPPChecklistItem'
        principal_contractor_appointed:
          $ref: '#/components/schemas/CPPChecklistItem'
        construction_phase_plan_in_place:
          $ref: '#/components/schemas/CPPChecklistItem'
        welfare_provided:
          $ref: '#/components/schemas/CPPChecklistItem'
        health_and_safety_file_arranged:
          $ref: '#/components/schemas/CPPChecklistItem'
        notification_made:
          $ref: '#/components/schemas/CPPChecklistItem'
        competence_checked:
          $ref: '#/components/schemas/CPPChecklistItem'
    CDMAttestations:
      type: array
      readOnly: true
      description: Every sign-off of the document's sections, oldest first.
      items:
        $ref: '#/components/schemas/CDMAttestation'
    CPPKeyOperativesDrift:
      type:
        - object
        - 'null'
      readOnly: true
      description: >
        How the issued plan's key operatives differ from the scheme's Roles tab,
        computed on read. Null

        before handover, and on a revision. `unposted` are people the plan lists
        in a job role who are

        not posted in it. `unlisted` are people posted in a job role the plan
        lists, whom the plan does

        not list in it. A posting in a job role the plan does not list is not
        drift.
      required:
        - unposted
        - unlisted
      properties:
        unposted:
          type: array
          items:
            $ref: '#/components/schemas/CPPKeyOperativePosting'
        unlisted:
          type: array
          items:
            $ref: '#/components/schemas/CPPKeyOperativePosting'
    CDMAccess:
      type: object
      readOnly: true
      description: >
        The caller's standing on this document, resolved from live data on the
        request. A client

        uses it to decide which sections to offer for editing, rather than
        inferring ownership.
      required:
        - acting_role
        - writable_sections
        - owned_sections
        - can_hand_over
        - can_propose_changes
      properties:
        acting_role:
          $ref: '#/components/schemas/CDMRole'
        writable_sections:
          type: array
          description: >-
            The sections the caller may write directly now. Empty once the
            document has been handed over.
          items:
            type: string
        owned_sections:
          type: array
          description: The sections the caller's role owns, and so may sign off.
          items:
            type: string
        can_hand_over:
          type: boolean
          description: Whether the caller may hand the document over now.
        can_propose_changes:
          type: boolean
          description: >-
            Whether the caller may propose changes. True for the Client and the
            Principal Contractor once the document has been handed over.
    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
    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
    PreConstructionInformationRelationship:
      type: object
      description: Represents a relationship to a pre-construction information
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the pre-construction information
        type:
          type: string
          const: pre-construction-informations
    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
    SchemeAttributes:
      type: object
      description: Attributes for a scheme
      required:
        - name
        - status
      properties:
        name:
          type: string
        status:
          $ref: '#/components/schemas/LifecycleStatus'
        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
            locations:
              type: integer
              description: >-
                The number of organisation-managed locations 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'
        locations:
          type: object
          description: >
            The organisation-managed locations this scheme's work is against,
            aggregated

            from the operations beneath it. Read-only here: the relationship is
            owned by

            the operation.
          required:
            - data
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/LocationRelationship'
        created_by_user:
          type: object
          description: >
            The user who created this scheme. Absent when it was created by a
            service account or by a v2

            subscriber, and on every scheme created before the creator was
            recorded. Set by the server.
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/UserRelationship'
        created_by_service_account:
          type: object
          description: >
            The service account that created this scheme. Absent when it was
            created by a user or by a v2

            subscriber, and on every scheme created before the creator was
            recorded. Set by the server.
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/ServiceAccountRelationship'
    CDMPerson:
      type: object
      description: A person named on a document, linked to their user when they have one.
      additionalProperties: false
      required:
        - name
      properties:
        name:
          type: string
          description: >-
            The name as written. Kept even when the person is linked. May be
            blank when a user is linked, whose name is then used; an unlinked
            person needs a name.
        user_id:
          type:
            - string
            - 'null'
          format: uuid
          description: The user this person is, when they have an account.
    CPPChecklistItem:
      type: object
      description: One client checklist item.
      additionalProperties: false
      properties:
        answer:
          type:
            - string
            - 'null'
          enum:
            - 'yes'
            - 'no'
            - not_applicable
            - null
          description: Null until answered. Not applicable is a distinct answer.
        comments:
          type:
            - string
            - 'null'
    CDMAttestation:
      type: object
      description: >
        A sign-off of one section. Every field is derived on the server from the
        authenticated

        request, and none is accepted from a client.
      required:
        - section
        - acting_role
        - attested_at
        - attested_by_type
        - attested_by_id
        - revision
      properties:
        section:
          type: string
          description: The section that was signed off.
        acting_role:
          $ref: '#/components/schemas/CDMRole'
        organisation_id:
          type: string
          format: uuid
          description: The organisation the principal acted for.
        attested_at:
          type: string
          format: date-time
        attested_by_type:
          type: string
          enum:
            - users
            - service-accounts
          description: >-
            Whether a user or a service account signed it off. A client shows
            the two differently.
        attested_by_id:
          type: string
          format: uuid
        revision:
          type: integer
          description: >-
            The document's revision when the section was signed off. 0 means
            before handover.
    CPPKeyOperativePosting:
      type: object
      description: >-
        A person in a job role, as the plan lists them or the Roles tab posts
        them.
      required:
        - user_id
        - job_role_id
      properties:
        user_id:
          type: string
          format: uuid
        job_role_id:
          type: string
          format: uuid
    CDMRole:
      type: string
      description: >
        A CDM 2015 duty-holder role on a scheme. The scheme owner is the Client
        and Principal

        Designer. The organisation nominated on the Pre-Construction Information
        is the Principal

        Contractor. Any other organisation the scheme is shared with is a
        reader.
      enum:
        - client_and_principal_designer
        - principal_contractor
        - reader
    LifecycleStatus:
      type: string
      description: >
        The lifecycle status of a contract, scheme or work order.


        - `in_planning`: work is being scoped and prepared; nothing is underway
        yet

        - `in_progress`: work is actively underway

        - `on_hold`: work has been paused and is expected to resume

        - `complete`: all work has been finished


        Any status may move to any other status; there are no restricted

        transitions. Resources created before this field existed, and resources

        created through the API, both start as `in_planning`.


        This is distinct from the operation status rollups under `meta`, which
        are

        derived from child operations and describe progress rather than intent.
      enum:
        - in_planning
        - in_progress
        - on_hold
        - complete
    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
    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
    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
    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
    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
    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
    LocationRelationship:
      type: object
      description: Represents a relationship to a location
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the location
        type:
          type: string
          const: locations
    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
  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

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.