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

# Get a location import

> Retrieve a location import by its unique identifier.

This is what a caller polls while an import runs. `progress` gives processed against total rows,
`results` gives the running inserted, updated and skipped counts, and `row_errors` gives the
reasons rows were left out. Stop polling when `status` is `completed` or `failed`; a failed import
is deliberately distinguishable from one still running, so a caller is not left waiting for
something that is not coming.

Authorised by `locations:view` in the import's organisation, at the organisation level rather than
against the record: somebody whose locations grant is narrowed to particular places still has to
be able to watch the import they started.




## OpenAPI

````yaml /api-reference/openapi.yaml get /v3/location-imports/{location_import_id}
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: >
      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: |
      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: |
      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: |
      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: >
      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/location-imports/{location_import_id}:
    get:
      tags:
        - Location Imports
      description: >
        Retrieve a location import by its unique identifier.


        This is what a caller polls while an import runs. `progress` gives
        processed against total rows,

        `results` gives the running inserted, updated and skipped counts, and
        `row_errors` gives the

        reasons rows were left out. Stop polling when `status` is `completed` or
        `failed`; a failed import

        is deliberately distinguishable from one still running, so a caller is
        not left waiting for

        something that is not coming.


        Authorised by `locations:view` in the import's organisation, at the
        organisation level rather than

        against the record: somebody whose locations grant is narrowed to
        particular places still has to

        be able to watch the import they started.
      operationId: GetLocationImport
      parameters:
        - $ref: '#/components/parameters/location_import_id'
        - $ref: '#/components/parameters/location_imports_include'
      responses:
        '200':
          $ref: '#/components/responses/GetLocationImport'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorised'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Session: []
        - Cookie: []
        - OAuth2: []
components:
  parameters:
    location_import_id:
      name: location_import_id
      in: path
      required: true
      description: The unique identifier for the location import.
      schema:
        type: string
        format: uuid
      example: 4d1f8a36-9b52-4c7e-8a03-6e5b1c9d2f47
    location_imports_include:
      name: include
      in: query
      description: >
        A comma separated list of related resources to include.


        `requester` names who uploaded the file, which an import history is
        mostly read for, and

        `default_location_type` names the type the import applied to untyped
        rows. Both save a caller

        resolving an id it would otherwise have to fetch separately.
      required: false
      style: form
      explode: false
      schema:
        type: array
        items:
          type: string
          enum:
            - organisation
            - requester
            - default_location_type
  responses:
    GetLocationImport:
      description: An individual location import.
      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:
                    $ref: '#/components/schemas/LocationImport'
                  included:
                    $ref: '#/components/schemas/LocationImportIncludes'
              - $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
    NotFound:
      description: The requested resource could not be found
      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: 7b4c8f12-3e9a-4d5b-8c6f-1a2b3c4d5e6f
            status: '404'
            title: Resource not found
            detail: The requested resource could not be found or does not exist.
            code: NOT_FOUND.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:
    LocationImport:
      type: object
      description: >
        One bulk load of locations from an uploaded CSV, and what became of
        every row.


        The record is the import's audit trail, and that is by design rather
        than by accident: the bulk

        write path emits no per-row events, because a per-row event for a
        30,000-row file would put 30,000

        messages on the platform's bus for one upload. So this record answers
        "who loaded what, and what

        did it do" on its own.
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the location import.
        type:
          type: string
          const: location-imports
        attributes:
          $ref: '#/components/schemas/LocationImportAttributes'
        meta:
          $ref: '#/components/schemas/LocationImportMeta'
        relationships:
          $ref: '#/components/schemas/LocationImportRelationships'
    LocationImportIncludes:
      type: array
      description: >-
        Related resources that can be included when a location import is
        returned.
      items:
        discriminator:
          propertyName: type
          mapping:
            organisations:
              $ref: '#/components/schemas/Organisation'
            users:
              $ref: '#/components/schemas/User'
            location-types:
              $ref: '#/components/schemas/LocationType'
        oneOf:
          - $ref: '#/components/schemas/Organisation'
          - $ref: '#/components/schemas/User'
          - $ref: '#/components/schemas/LocationType'
    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
    LocationImportAttributes:
      type: object
      description: Attributes of a location import
      required:
        - status
        - filename
        - column_mapping
        - progress
        - results
      properties:
        status:
          $ref: '#/components/schemas/LocationImportStatus'
        filename:
          type: string
          description: What the user called the file they uploaded.
          examples:
            - enwl-poles-2026-09.csv
        column_mapping:
          $ref: '#/components/schemas/LocationImportColumnMapping'
        progress:
          $ref: '#/components/schemas/LocationImportProgress'
        results:
          $ref: '#/components/schemas/LocationImportResults'
        row_errors:
          type: array
          description: >
            Why rows were skipped, capped so a file of entirely bad rows cannot
            make the record itself

            unwritable. `results.row_error_count` is the true total.
          items:
            $ref: '#/components/schemas/LocationImportRowError'
        error:
          type:
            - string
            - 'null'
          description: >
            Why a failed import failed. Null on an import that has not failed.
            Distinct from skipped rows:

            this is something that stopped the whole run, where a skipped row is
            one line of the file.
    LocationImportMeta:
      type: object
      description: Metadata for a location import
      required:
        - requested_at
      properties:
        requested_at:
          type: string
          format: date-time
          description: When the file was uploaded and the import recorded.
        completed_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >
            When the import finished or gave up. Null while it is still pending
            or processing, which is

            what a poll stops on together with the status.
    LocationImportRelationships:
      type: object
      description: Relationships for a location import
      required:
        - organisation
        - requester
      properties:
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
          description: The organisation whose locations the import wrote.
        requester:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/UserRelationship'
          description: Who uploaded the file.
        default_location_type:
          type: object
          description: >
            The type applied to every row the file gave no type for. Null when
            the import left untyped

            rows untyped.
          properties:
            data:
              oneOf:
                - $ref: '#/components/schemas/LocationTypeRelationship'
                - type: 'null'
    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'
    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'
    LocationType:
      type: object
      description: A location type
      required:
        - id
        - type
        - attributes
        - meta
        - relationships
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the location type.
        type:
          type: string
          const: location-types
        attributes:
          $ref: '#/components/schemas/LocationTypeAttributes'
        meta:
          $ref: '#/components/schemas/LocationTypeMeta'
        relationships:
          $ref: '#/components/schemas/LocationTypeRelationships'
    LocationImportStatus:
      type: string
      description: >
        Where a location import has got to.


        `pending` is validated and queued; `processing` is being written, and
        the only state in which the

        progress counters move; `completed` finished, which a file with bad rows
        in it still does; `failed`

        could not be run to the end, with the reason on `error`.
      enum:
        - pending
        - processing
        - completed
        - failed
      examples:
        - processing
    LocationImportColumnMapping:
      type: object
      description: >
        Which column of the uploaded file supplied each location field.


        Held as the column names the file used rather than positions, so the
        import still explains itself

        after the fact: "the reference came from POLE_NO" survives, where "the
        reference came from column

        3" does not. An omitted field means the file carried nothing for it.


        `reference` is required. It is the identity a bulk import matches rows
        on, so a file without one

        cannot be re-imported: every row would insert a second copy of a
        location that is already there.


        Coordinates are two pairs rather than one, because a location's point is
        stored in whichever

        standard it arrived in and the platform performs no projection. Map
        `latitude` and `longitude`, or

        `easting` and `northing`, but not both standards, and never one half of
        a pair.
      required:
        - reference
      properties:
        name:
          type: string
          description: >
            What the place is called, where the file says. Left empty when it
            does not: a pole file is

            commonly a column of pole numbers and nothing else, and a location
            is identified and

            displayed by its reference.
          examples:
            - NAME
        reference:
          type: string
          description: >-
            The organisation's own lookup key for the place, such as a pole
            number.
          examples:
            - POLE_NO
        description:
          type: string
        location_type:
          type: string
          description: >
            A column naming the row's location type. Matched against the
            organisation's own types by

            name, case-insensitively. A name the organisation has not defined
            skips the row rather than

            falling back to the default, because typing every such row as the
            default would classify

            locations as something nobody asked for.
          examples:
            - ASSET_TYPE
        latitude:
          type: string
        longitude:
          type: string
        easting:
          type: string
        northing:
          type: string
        address_number:
          type: string
        address_name:
          type: string
        address_thoroughfare:
          type: string
        address_post_town:
          type: string
        address_postcode:
          type: string
    LocationImportProgress:
      type: object
      description: >
        How far through the file the import is. What a poll reads to draw a
        progress bar.


        The counters advance per chunk rather than per row, so `processed_rows`
        moves in steps.
      required:
        - total_rows
        - processed_rows
      properties:
        total_rows:
          type: integer
          description: >
            How many data rows the file had, excluding the header. Known before
            the import starts,

            because the file is read and validated when the import is requested.
          examples:
            - 30000
        processed_rows:
          type: integer
          description: How many rows have been dealt with, written or skipped.
          examples:
            - 12500
    LocationImportResults:
      type: object
      description: >
        What became of the rows. `inserted`, `updated` and `skipped` sum to the
        processed count.


        A row is inserted when its reference is new to the organisation and
        updated when the reference

        already names a location, which is what makes re-importing the same file
        idempotent rather than

        duplicating every row.
      required:
        - inserted
        - updated
        - skipped
        - row_error_count
      properties:
        inserted:
          type: integer
          description: Rows whose reference was new, so a location was created.
          examples:
            - 29850
        updated:
          type: integer
          description: >-
            Rows whose reference already named a location, which was updated in
            place.
          examples:
            - 146
        skipped:
          type: integer
          description: Rows that were not written.
          examples:
            - 4
        row_error_count:
          type: integer
          description: >
            How many rows were skipped with a reason, including any whose reason
            `row_errors` does not

            carry. Read it alongside the length of `row_errors` to tell whether
            the list is complete: a

            file with tens of thousands of bad rows would otherwise push the
            record past the database's

            document limit, so the reasons are capped and the count is not.
          examples:
            - 4
    LocationImportRowError:
      type: object
      description: One row the import did not write, and why.
      required:
        - row
        - reason
      properties:
        row:
          type: integer
          description: >
            The line in the uploaded file, counting the header as line 1, so it
            is the line number the

            user sees in their spreadsheet.
          examples:
            - 4512
        reference:
          type: string
          description: >
            The row's reference, where it had one. Carried alongside the line
            number because somebody

            looking for the offending row searches for the reference.
          examples:
            - POLE-004512
        reason:
          type: string
          examples:
            - the latitude "53.4o8" is not a number
    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
    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
    LocationTypeRelationship:
      type: object
      description: Represents a relationship to a location type
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: The unique identifier of the location type
        type:
          type: string
          const: location-types
    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'
    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'
    LocationTypeAttributes:
      type: object
      description: Attributes for a location type
      properties:
        name:
          type: string
          description: The location type name
        description:
          type: string
          description: A description of the location type
    LocationTypeMeta:
      type: object
      description: Metadata for a location type
      required:
        - created_at
        - updated_at
      properties:
        created_at:
          type: string
          format: date-time
          description: The date and time when the location type was created
        updated_at:
          type: string
          format: date-time
          description: The date and time when the location type was last updated
    LocationTypeRelationships:
      type: object
      description: Relationships for a location type
      required:
        - organisation
      properties:
        organisation:
          type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/OrganisationRelationship'
    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
    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
    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
  securitySchemes:
    Session:
      description: |
        Session token for authentication.
      in: header
      name: X-Session-Token
      type: apiKey
    Cookie:
      description: |
        Cookie token for authentication.
      in: cookie
      name: ctrl_hub_session
      type: apiKey
    OAuth2:
      description: |
        OAuth2 token for authentication.
      flows:
        clientCredentials:
          scopes: {}
          tokenUrl: https://auth.ctrl-hub.com/oauth2/token
      type: oauth2

````