openapi: 3.0.3
tags:
  - name: Tenant Configuration
    description: >-
      Defining customer and non-customer organizations for TonicDM internal
      purposes.
  - name: Data Hosting Zone Configuration
    description: >-
      Information the TonicDM system needs to function in a multi-zone
      environment.
  - name: Global Disciplines
    description: Disciplines defined centrally that are pushed out to all Zones.
x-tagGroups:
  - name: GLOBAL
    tags:
      - Tenant Configuration
      - Data Hosting Zone Configuration
      - Global Disciplines
info:
  title: Global API
  version: 0.0.5
  description: APIs for the Global service of TonicDM
  contact:
    name: Reg Prentice
    url: https://developers-internal.tonicdm.com
    email: apisupport@tonicdm.com
  termsOfService: http://www.tonicdm.com/terms
  license:
    name: Proprietary
    url: https://www.tonicdm.com/license-api
servers:
  - url: https://us-api.tonicdm.com
    description: Server located in the USA
  - url: https://de-api.tonicdm.com
    description: Server located in Germany
  - url: https://ie-api.tonicdm.com
    description: Server located in Ireland
security:
  - OAuth2:
      - read
      - write
  - apiKeyAuth: []
paths:
  /global/tenants:
    description: >
      The global Tenant objects. Used like DNS.


      Objects in this DB can have some of the same properties as the Zone DB
      (eg. name) the difference being the value in the Global DB belongs to
      TonicDM whereas the value in the Zone DB belongs to the customer.
    get:
      summary: Get Global Tenants
      x-internal: true
      tags:
        - Tenant Configuration
      operationId: get-global-tenants
      description: >-
        Returns a list of all Tenants.

        Most often this will be used to look up an Tenant by its domain to
        determine what its home zone is. Then that zone will be queried for
        further information.
      parameters:
        - $ref: '#/components/parameters/searchQuery'
        - $ref: '#/components/parameters/filterIds'
        - $ref: '#/components/parameters/filterStatuses'
        - $ref: '#/components/parameters/filterIndustryRoles'
        - $ref: '#/components/parameters/filterCustomerTypes'
        - $ref: '#/components/parameters/filterDisciplineIds'
        - $ref: '#/components/parameters/dataQuantity'
        - $ref: '#/components/parameters/pageSize'
        - $ref: '#/components/parameters/pageNumber'
        - $ref: '#/components/parameters/sortByRoutingDomain'
        - $ref: '#/components/parameters/sortDirection'
      responses:
        '200':
          description: >-
            Successfully read the resource you requested. One or more records
            are returned in the form of an array.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TenantWithId'
              examples:
                TenantsArray:
                  $ref: '#/components/examples/TenantsArray'
        '204':
          $ref: '#/components/responses/NoContentSuccess'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
      x-amazon-apigateway-integration:
        requestParameters:
          integration.request.header.searchQuery: method.request.header.searchQuery
          integration.request.header.filterIds: method.request.header.filterIds
          integration.request.header.filterStatuses: method.request.header.filterStatuses
          integration.request.header.filterIndustryRoles: method.request.header.filterIndustryRoles
          integration.request.header.filterCustomerTypes: method.request.header.filterCustomerTypes
          integration.request.header.filterDisciplineIds: method.request.header.filterDisciplineIds
          integration.request.header.dataQuantity: method.request.header.dataQuantity
          integration.request.header.pageSize: method.request.header.pageSize
          integration.request.header.pageNumber: method.request.header.pageNumber
          integration.request.header.sortByRoutingDomain: method.request.header.sortByRoutingDomain
          integration.request.header.sortDirection: method.request.header.sortDirection
        responses:
          default:
            statusCode: '200'
            responseTemplates:
              application/json: |
                #if ($input.params('filterStatuses') == 'active')
                  [
                    { "id": 1, "name": "John Active" }
                    { "id": 2, "name": "Jane Active" }
                    { "id": 3, "name": "John Active"}
                    { "id": 4, "name": "Jane Active"}
                  ]
                #else
                  [
                    { "id": 1, "name": "John Doe" },
                    { "id": 2, "name": "Jane Smith" }
                    { "id": 3, "name": "John Active"}
                    { "id": 4, "name": "Jane Active"}
                    { "id": 5, "name": "John Inactive"}
                    { "id": 6, "name": "Jane Inactive"}
                    { "id": 7, "name": "John Deleted"}
                    { "id": 8, "name": "Jane Deleted"}
                  ]
                #end
        type: mock
    post:
      summary: New Global Tenant
      x-internal: true
      tags:
        - Tenant Configuration
      operationId: post-global-tenant
      description: Creates a new Tenant in the global (TonicDM controlled) directory.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Tenant'
      responses:
        '201':
          description: Successfully created the resource you sent
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantWithId'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
    patch:
      summary: Edit Global Tenant
      x-internal: true
      tags:
        - Tenant Configuration
      operationId: patch-global-tenant
      description: Edit an org in the global (TonicDM controlled) directory.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TenantWithId'
      responses:
        '200':
          description: >-
            Successfully read the resource you requested. One or more records
            are returned in the form of an array.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantWithId'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
  /global/zones:
    description: >
      Zones are data centers where Tenant and Project data can be stored.


      This endpoint is functionally the same as `/core/zones` except this one is
      intended for TonicDM management and so can be queried with filters and
      include POST, PATCH etc.
    get:
      summary: Get Zones
      x-internal: true
      tags:
        - Data Hosting Zone Configuration
      operationId: get-global-zones
      description: >-
        Lists all the Zones configured for operation. Tenants and Projects are
        homed to a Zone.
      parameters:
        - $ref: '#/components/parameters/searchQuery'
        - $ref: '#/components/parameters/filterIds'
        - $ref: '#/components/parameters/filterStatuses'
        - $ref: '#/components/parameters/dataQuantity'
        - $ref: '#/components/parameters/pageSize'
        - $ref: '#/components/parameters/pageNumber'
        - $ref: '#/components/parameters/sortByZone'
        - $ref: '#/components/parameters/sortDirection'
      responses:
        '200':
          description: >-
            Successfully read the resource you requested. One or more records
            are returned in the form of an array.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Zone'
              examples:
                ZoneArray:
                  $ref: '#/components/examples/ZoneArray'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
      x-amazon-apigateway-integration:
        requestParameters:
          integration.request.header.searchQuery: method.request.header.searchQuery
          integration.request.header.filterIds: method.request.header.filterIds
          integration.request.header.filterStatuses: method.request.header.filterStatuses
          integration.request.header.dataQuantity: method.request.header.dataQuantity
          integration.request.header.pageSize: method.request.header.pageSize
          integration.request.header.pageNumber: method.request.header.pageNumber
          integration.request.header.sortByZone: method.request.header.sortByZone
          integration.request.header.sortDirection: method.request.header.sortDirection
    post:
      summary: New Zone
      x-internal: true
      tags:
        - Data Hosting Zone Configuration
      operationId: post-global-zone
      description: Create a new Zone in the global (TonicDM controlled) directory.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Zone'
      responses:
        '201':
          description: Successfully created the resource you sent
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Zone'
              examples:
                zone:
                  $ref: '#/components/examples/Zone'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
    patch:
      summary: Edit Zone
      x-internal: true
      tags:
        - Data Hosting Zone Configuration
      operationId: patch-global-zone
      description: Edit a Zone in the global (TonicDM controlled) directory.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Zone'
            examples:
              zone:
                $ref: '#/components/examples/Zone'
      responses:
        '200':
          description: Successfully edited the resource you requested
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
    delete:
      summary: Delete Zone
      x-internal: true
      tags:
        - Data Hosting Zone Configuration
      operationId: delete-global-zone
      description: Delete a Zone in the global (TonicDM controlled) directory.
      parameters:
        - name: zoneId
          in: query
          description: The GUID of the Zone to be deleted
          schema:
            type: string
      responses:
        '200':
          description: Successfully deleted the resource you requested
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
  /global/disciplines:
    description: >-
      Disciplines are standardized across the TonicDM system. This endpoint gets
      the list of disciplines in the Global disciplines table. Edits and
      additions to that table should be done by hand.
    get:
      summary: Get Disciplines from the TonicDM Global system.
      x-internal: true
      operationId: get-global-disciplines
      tags:
        - Global Disciplines
      description: Get information on one or more disciplines
      responses:
        '200':
          description: >-
            Successfully read the resource you requested. One or more records
            are returned in the form of an array.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DisciplineWithId'
        '204':
          $ref: '#/components/responses/NoContentSuccess'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/NoAccessError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
        '500':
          $ref: '#/components/responses/UnexpectedError'
components:
  securitySchemes:
    OAuth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://example.com/oauth/authorize
          tokenUrl: https://example.com/oauth/token
          scopes:
            read: Read access to protected resources
            write: Write access to protected resources
    apiKeyAuth:
      type: apiKey
      in: query
      name: X-API-KEY
  parameters:
    searchQuery:
      name: searchQuery
      in: query
      description: A JSON-encoded string containing the query options.
      schema:
        type: string
        format: JSON
      example: '{"example"}'
    filterIds:
      name: filterIds
      in: query
      description: >-
        Returns data for the specified GUIDs. If this filter is specifed, all
        other filters will be ignored.
      style: form
      explode: false
      schema:
        type: array
        items:
          $ref: '#/components/schemas/CompactUUID'
      example: '{id},{id},{id}'
    filterStatuses:
      name: filterStatuses
      description: >
        Provide the values of one or more statuses separated by comma (no
        spaces). If more than one filter is given, they will be combined with
        AND. If no value is supplied, `active` is assumed.
      in: query
      style: form
      explode: false
      schema:
        type: array
        items:
          type: string
          $ref: '#/components/schemas/Status'
      example: active,inactive
    filterIndustryRoles:
      name: filterIndustryRoles
      description: >-
        provide the keywords of one or more Industry Roles separated by comma
        (no spaces). If more than one filter is given, they will be combined
        with AND.
      in: query
      style: form
      explode: false
      schema:
        type: array
        items:
          type: string
      example: generalcontractor,primeconsultant
    filterCustomerTypes:
      name: filterCustomerTypes
      description: >-
        provide the keywords of one or more Customer Types separated by comma
        (no spaces). If more than one filter is given, they will be combined
        with AND.
      in: query
      style: form
      explode: false
      schema:
        type: array
        items:
          type: string
          $ref: '#/components/schemas/CustomerType'
      example: unpaid,paid
    filterDisciplineIds:
      name: filterDisciplineIds
      description: >-
        provide the GUIDs of one or more disciplines separated by comma (no
        spaces). If more than one filter is given, they will be combined with
        AND.
      in: query
      style: form
      explode: false
      schema:
        type: array
        items:
          $ref: '#/components/schemas/CompactUUID'
      example: '{id},{id},{id}'
    dataQuantity:
      name: dataQuantity
      in: query
      required: false
      description: >-
        If caching data on the client side, the
        `data_quantity=id_only|basic|complete` option can be passed to manage
        the completeness of the data received and therefore rate limiting.
      schema:
        type: string
        default: id_only
        enum:
          - id_only
          - basic
          - complete
      example: id_only
    pageSize:
      name: pageSize
      in: query
      description: The number of results to return per page
      schema:
        type: integer
        minimum: 1
        maximum: 1000
        default: 50
      example: '100'
    pageNumber:
      name: pageNumber
      in: query
      schema:
        type: integer
      description: Which page of the results to return
      example: '1'
    sortByRoutingDomain:
      description: The **field** by which to sort the results
      name: sortBy
      in: query
      schema:
        type: string
        enum:
          - domain
          - nameLong
          - nameShort
    sortDirection:
      name: sortDirection
      in: query
      schema:
        type: string
        enum:
          - asc
          - desc
      description: The sort direction for the results
    sortByZone:
      description: The **field** by which to sort the results
      name: sortBy
      in: query
      schema:
        type: string
        enum:
          - name
  schemas:
    CompactUUID:
      type: string
      pattern: ^[0-9a-fA-F]{32}$
      x-format: uuid-no-hyphens
      example: 8e8aa42241794371ae9d0ed7b67a8c86
    Status:
      title: Status
      description: >-
        Whether the item is active or inactive in TonicDM. Potentially the item
        could be (soft) deleted.
      type: string
      enum:
        - active
        - inactive
        - deleted
      default: active
    CustomerType:
      title: CustomerType
      type: string
      enum:
        - none
        - former
        - pilot
        - unpaid
        - paid
      default: none
      description: Customer lifecycle. Controls the UI offered to users in this Tenant.
    Discipline:
      title: Discipline
      type: object
      description: The list of disciplines in TonicDM.
      properties:
        initials:
          description: 1-2 letter abbreviation
          type: string
          readOnly: true
        abbreviation:
          description: 4 letter abbreviation
          type: string
          readOnly: true
        name:
          description: Unabbreviated discipline name
          type: string
          readOnly: true
    DisciplineWithId:
      allOf:
        - type: object
          properties:
            id:
              description: The GUID of the Discipline record
              $ref: '#/components/schemas/CompactUUID'
        - $ref: '#/components/schemas/Discipline'
    OrganizationIndustryRole:
      title: IndustryRole
      type: string
      enum:
        - notspecified
        - subcontractor
        - primecontractor
        - owner
        - primeconsultant
        - subconsultant
        - vendor
        - jurisdiction
        - designbuild
      default: notspecified
      description: Controls the UI offered to the users in this Organization.
    RoutingDomain:
      title: RoutingDomain
      type: object
      x-internal: true
      properties:
        domain:
          description: >-
            Each Tenant can own one or more domains. A Person whose email domain
            matches any one of these domains will automatically join this
            Tenant. ONLY TonicDM support can add additional domains to an Org,
            merge Orgs etc.
          type: string
        slug:
          type: string
          readOnly: true
          description: >-
            Unique human readable identifier for a Brand eg
            `pacific-architects`.  This is typically all but the last part of
            the associated domain.   This needs to be in Global because it\'s
            part of routing.
        emailPattern:
          type: string
          description: >
            The pattern that this Tenant\'s staff emails will match. 

            For Tenants which separate first and last name with a dot, the `dot`
            choice indicates that for real people, the local part of the email
            address will **always** include a dot. This helps us not auto-create
            contacts for email addresses that aren't people (eg.
            `accounting@example.com`).

            Similarly for Tenants which separate first and last name with
            underscore. If we know an Tenant doesn't use a separator, email
            addresses that include one are almost certainly a mistake and
            therefore shouldn\'t be auto-created.
          enum:
            - notspecified
            - dot
            - underscore
            - none
        disciplines:
          description: >-
            Offers default disciplines for any person in this Org to help
            consistency.
          type: array
          items:
            $ref: '#/components/schemas/DisciplineWithId'
        industryRole:
          description: >-
            It is important for this to be at the domain/brand level not the
            Global Tenant level, because it will be able to switch the UI at the
            project level within an Orgnization, and it will be used to offer
            the correct Role for Contact Orgs based on Domain.
          $ref: '#/components/schemas/OrganizationIndustryRole'
        brandColor:
          description: >-
            TonicDMs brand color for the brand associated with this domain. Used
            as the default for UserOrg Settings.
          type: string
          format: hex
          pattern: ^(?:[0-9a-fA-F]{6}|)$
        logoUrl:
          type: string
          description: >-
            TonicDMs logo for the brand associated with this domain. Used as the
            default for UserOrg Settings.
        nameLong:
          description: >-
            TonicDMs name for the brand associated with this domain. This should
            match Org Name Billing in Pipedrive and the Tenant name in Intercom.
            Used as the default Full Official Name value in ContactOrg creation.
          type: string
          minLength: 1
          maxLength: 40
        nameShort:
          description: >-
            TonicDMs short name for the brand associated with this domain. This
            should match Org Name Colloquial in Pipedrive. Used as the default
            Friendly Name value in ContactOrg creation.
          type: string
          minLength: 0
          maxLength: 20
        nameInitials:
          description: Used as the default value in ContactOrg creation
          type: string
          minLength: 1
          maxLength: 4
    Tenant:
      title: Tenant
      type: object
      description: >
        This data uniquely identifies all Tenants (organizations) known to
        TonicDM (whether

        customers or not). It only stores TonicDMs info on the Tenant, not any
        data for

        the TonicDM app. 

        It includes GUIDs for the same org in our other systems like Intercom
        and Pipedrive so we

        can collate data from those APIs. Specifics about their engagement with
        us are in Pipedrive or Intercom and

        should be referenced from there via their API.


        The data it contains belongs to TonicDM (Name, BrandColor, Logo) for

        internal use but also with the intention of helping customers maintain
        an up

        to date CRM. It is not considered the UserOrg record because our values
        for Name etc

        might not match the ones the Org uses for itself.


        A domain can only occur once in the Global DB. 

        It has a primary role mapping domains to Tenants. 
      x-internal: true
      properties:
        datetimeCreated:
          description: The date and time this Tenant was created.
          type: string
          format: date-time
          readOnly: true
        datetimeUpdated:
          description: The date and time this Tenant was last updated.
          type: string
          format: date-time
          readOnly: true
        domains:
          description: >
            One or more domains that belong to this Tenant. This is similar to,
            but not the same as Brands.

            Users logging in are assigned an Org based on their email domain. 

            This section is read-only. Domains are assigned to an Org and edited
            using the RoutingDomain endpoints.
          readOnly: true
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/RoutingDomain'
        pipedriveId:
          type: string
        intercomId:
          type: string
        uniqueCode:
          description: >-
            A code used to identify the Tenant, mainly used as the email address
            prefix when emailing data into the system.
          type: string
          readOnly: true
          pattern: ^o\d{3}-\d{3}-\d{3}$
        customerType:
          $ref: '#/components/schemas/CustomerType'
        homeZoneId:
          type: string
    TenantWithId:
      allOf:
        - type: object
          properties:
            id:
              description: The GUID of the Tenant record.
              $ref: '#/components/schemas/CompactUUID'
        - $ref: '#/components/schemas/Tenant'
    Errors:
      title: Errors
      type: object
      required:
        - errors
      properties:
        errors:
          description: x
          type: array
          minItems: 1
          items:
            required:
              - code
              - message
            properties:
              code:
                description: x
                type: string
              message:
                description: x
                type: string
              source:
                description: x
                title: ErrorSource
                required:
                  - location
                  - name
                properties:
                  location:
                    description: x
                    type: string
                    enum:
                      - path
                      - query
                      - body
                      - header
                  name:
                    type: string
                    description: The name of the property or parameter causing the error
                  path:
                    type: string
                    description: >-
                      JSON path targeting the source of error (only used when
                      location is `body`)
    Zone:
      title: Zone
      type: object
      description: >
        A zone is an independent working copy of the Tonic infrastructure,
        including

        all services, queues and databases required to make the system run.


        A Tenant\'s Home Zone or the Zone of a particular Project can be
        **changed** only by TonicDM Support.
      properties:
        status:
          $ref: '#/components/schemas/Status'
        bucketPath:
          type: string
        servicesPath:
          type: string
        databasesPath:
          type: string
  examples:
    TenantsArray:
      summary: Sample data for the Global Tenant object.
      value:
        - id: da9c62640a894f61b247801a2e300c44
          domains:
            - slug: pacific-architects
              domain: pacific-architects.com
              brandColor: 00b6e8
              logoUrl: pacific-architects.com.png
              industryRole: primeconsultant
              emailPattern: dot
            - slug: pacific-engineers
              domain: pacific-engineers.com
              brandColor: 00b6e8
              logoUrl: pacific-engineers.com.png
              industryRole: subconsultant
              emailPattern: none
          pipedriveId: X
          intercomId: X
          customerType: paid
          homeZoneId: aws-us
        - id: 5a40f72e966b4428a0af1375e4833849
          domains:
            - slug: argo-structural
              domain: argo-structural.com
              brandColor: 41a548
              logoUrl: argo-structural.com.png
              emailPattern: dot
              industryRole: subconsultant
          pipedriveId: X
          intercomId: X
          customerType: paid
          homeZoneId: aws-us
    ZoneArray:
      summary: Sample data for the Zone object.
      value:
        - name: aws-us
          status: active
          bucketPath: X
          servicesPath: X
          databasesPath: X
        - name: aws-eu
          status: active
          bucketPath: X
          servicesPath: X
          databasesPath: X
    Zone:
      summary: Sample data for the Zone object.
      value:
        name: aws-us
        status: active
        bucketPath: X
        servicesPath: X
        databasesPath: X
  responses:
    NoContentSuccess:
      description: >-
        No content. The request was successfully executed on the server but
        there is no data to return.
    BadRequestError:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
    AuthenticationError:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
    NoAccessError:
      description: >-
        Authentication succeeded, but the user does not have access to the
        resource
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
    NotFoundError:
      description: The resource cannot be found, client-side error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
    RateLimitExceededError:
      description: Surpassed the max number of request units for the current hour.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
    UnexpectedError:
      description: Unexpected error. Consumer may try to send the request again.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
