---
openapi: 3.0.1
info:
  title: API
  version: v1
  description: 'Authenticate with a personal access token from your profile, sent
    as `Authorization: Bearer <token>`. Errors are RFC 9457 problem details; match
    on `code`, which is stable, never on `type` or the human-readable `title` and
    `detail`.'
paths:
  "/api/v1/orgs/{org_id}/invoices":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    get:
      summary: Invoices (owners and admins)
      tags:
      - Billing
      parameters:
      - name: project_id
        in: query
        format: uuid
        required: false
        description: Only this project's invoices
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: every invoice but drafts, newest first
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/invoice"
                  next_cursor:
                    type: string
                    nullable: true
  "/api/v1/orgs/{org_id}/invoices/{id}":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    get:
      summary: One invoice, with its line items, or its PDF
      tags:
      - Billing
      responses:
        '200':
          description: 'the invoice and its line items (Accept: application/pdf returns
            the PDF)'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/invoice"
            application/pdf:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/invoice"
  "/api/v1/orgs/{org_id}/projects/{project_id}/usage":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: project_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    get:
      summary: A project's billed usage for a month (owners and admins)
      tags:
      - Billing
      parameters:
      - name: year
        in: query
        required: false
        description: Defaults to this year
        schema:
          type: integer
      - name: month
        in: query
        required: false
        description: 1 to 12, defaults to this month
        schema:
          type: integer
      responses:
        '200':
          description: the month's lines by section, subscriptions, subtotal and total
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: object
                    required:
                    - period_start
                    - period_end
                    - currency
                    - line_items
                    - subscriptions
                    - subtotal
                    - total
                    properties:
                      period_start:
                        type: string
                        format: date
                      period_end:
                        type: string
                        format: date
                      currency:
                        type: string
                      line_items:
                        type: array
                        items:
                          "$ref": "#/components/schemas/line_item"
                      subscriptions:
                        type: array
                        items:
                          type: object
                          properties:
                            kind:
                              type: string
                            name:
                              type: string
                            description:
                              type: string
                            cost:
                              type: integer
                      subtotal:
                        type: integer
                        description: Usage, minor units
                      total:
                        type: integer
                        description: Usage plus subscriptions, minor units
        '400':
          description: not a calendar month
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/me":
    get:
      summary: The caller and the token in use
      tags:
      - Account
      responses:
        '200':
          description: the caller
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: object
                    required:
                    - id
                    - name
                    - email
                    - timezone
                    - created_at
                    - token
                    properties:
                      id:
                        type: string
                        format: uuid
                      name:
                        type: string
                      email:
                        type: string
                      timezone:
                        type: string
                      created_at:
                        type: string
                        format: date-time
                      token:
                        type: object
                        required:
                        - id
                        - name
                        - prefix
                        - expires_at
                        - created_at
                        properties:
                          id:
                            type: string
                            format: uuid
                          name:
                            type: string
                          prefix:
                            type: string
                          organisation_id:
                            type: string
                            format: uuid
                            nullable: true
                          expires_at:
                            type: string
                            format: date-time
                          created_at:
                            type: string
                            format: date-time
        '401':
          description: missing, invalid, revoked or expired token
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/members/{id}":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    patch:
      summary: Change a member's role or project access
      tags:
      - Members
      parameters: []
      responses:
        '200':
          description: the updated member
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/member"
        '409':
          description: your own membership
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                role:
                  type: string
                  enum:
                  - owner
                  - admin
                  - member
                  description: Owner only. owner transfers ownership; you become an
                    admin
                project_ids:
                  type: array
                  items:
                    type: string
                    format: uuid
                  description: Owners and admins, member-role memberships, while per-project
                    access is on
    delete:
      summary: Remove a member (owners and admins)
      tags:
      - Members
      responses:
        '204':
          description: removed
    get:
      summary: One member
      tags:
      - Members
      responses:
        '200':
          description: the member
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/member"
        '404':
          description: not a member of this organisation
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/invitations":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    post:
      summary: Invite someone (owners and admins)
      tags:
      - Members
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        schema:
          type: string
      responses:
        '201':
          description: the invitation, emailed to them, or with its link while email
            is off
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/invitation"
        '409':
          description: already a member, already invited, or an account not yet set
            up
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - email
              - role
              properties:
                email:
                  type: string
                role:
                  type: string
                  enum:
                  - member
                  - admin
                project_ids:
                  type: array
                  items:
                    type: string
                    format: uuid
                  description: Only while per-project access is on
    get:
      summary: Pending invitations (owners and admins)
      tags:
      - Members
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: pending invitations, newest first
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/invitation"
                  next_cursor:
                    type: string
                    nullable: true
        '403':
          description: a member, not an owner or admin
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/members":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    get:
      summary: The organisation's members
      tags:
      - Members
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: every member, oldest first
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/member"
                  next_cursor:
                    type: string
                    nullable: true
  "/api/v1/orgs/{org_id}/audit_events":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    get:
      summary: The organisation's audit log (owners and admins)
      tags:
      - Audit
      parameters:
      - name: action_type
        in: query
        required: false
        description: Only this action, e.g. project.created
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: audit events, newest first, through the whole history
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/audit_event"
                  next_cursor:
                    type: string
                    nullable: true
  "/api/v1/orgs":
    get:
      summary: The organisations you belong to
      tags:
      - Organisations
      parameters:
      - name: limit
        in: query
        required: false
        description: Page size, 1 to 100 (default 50)
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        description: next_cursor from the previous page
        schema:
          type: string
      responses:
        '200':
          description: a page of organisations, each with your role
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/organisation"
                  next_cursor:
                    type: string
                    nullable: true
        '400':
          description: a cursor this API did not issue
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{id}":
    parameters:
    - name: id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    get:
      summary: One organisation you belong to
      tags:
      - Organisations
      responses:
        '200':
          description: the organisation, with your role
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/organisation"
        '403':
          description: suspended, or waiting on billing setup
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
        '404':
          description: not an organisation you belong to
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/projects":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    post:
      summary: Create a project (owners and admins)
      tags:
      - Projects
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        description: Retrying with the same key returns the original response instead
          of creating again
        schema:
          type: string
      responses:
        '202':
          description: created; its default region provisions in the background, so
            poll it until ready
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/project"
        '403':
          description: a member, or the organisation's billing details are incomplete
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
        '422':
          description: the project does not validate
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - name
              properties:
                name:
                  type: string
                description:
                  type: string
    get:
      summary: The projects you can see in an organisation
      tags:
      - Projects
      parameters:
      - name: limit
        in: query
        required: false
        description: Page size, 1 to 100 (default 50)
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        description: next_cursor from the previous page
        schema:
          type: string
      responses:
        '200':
          description: a page of projects, every status, with where each is provisioned
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/project"
                  next_cursor:
                    type: string
                    nullable: true
        '404':
          description: not an organisation you belong to
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/projects/{id}":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    patch:
      summary: Edit a project, or archive it
      tags:
      - Projects
      parameters: []
      responses:
        '200':
          description: the updated project
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/project"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                description:
                  type: string
                  nullable: true
                monthly_budget:
                  type: integer
                  nullable: true
                  description: Minor units (cents); null clears it
                status:
                  type: string
                  enum:
                  - archived
                  description: Archives the project (owner only)
    delete:
      summary: Delete a project (owner only)
      tags:
      - Projects
      responses:
        '202':
          description: marked deleting and torn down in the background; it then reads
            as gone
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/project"
        '409':
          description: the project still holds instances or volumes
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
    get:
      summary: One project
      tags:
      - Projects
      responses:
        '200':
          description: the project
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/project"
        '404':
          description: not a project you can see
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/projects/{project_id}/quota_increase_requests":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: project_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    post:
      summary: Request more quota in a region (owners and admins)
      tags:
      - Quotas
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        schema:
          type: string
      responses:
        '201':
          description: the request, holding the limits asked for
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/quota_increase_request"
        '422':
          description: nothing requested, or a request already open in that region
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - region
              - reason
              - add
              properties:
                region:
                  type: string
                  description: Keystone region id
                reason:
                  type: string
                add:
                  type: object
                  description: Amounts to add to the current limits, each a positive
                    whole number
                  properties:
                    ram_gb:
                      type: integer
                    storage_gb:
                      type: integer
                    instances:
                      type: integer
                    vcpus:
                      type: integer
                    floating_ips:
                      type: integer
    get:
      summary: A project's quota increase requests, every region
      tags:
      - Quotas
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: requests, newest first
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/quota_increase_request"
                  next_cursor:
                    type: string
                    nullable: true
  "/api/v1/orgs/{org_id}/projects/{project_id}/quota_increase_requests/{id}":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: project_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    patch:
      summary: Resubmit a request staff sent back for more information
      tags:
      - Quotas
      parameters: []
      responses:
        '200':
          description: resubmitted, pending review again
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/quota_increase_request"
        '409':
          description: staff have not sent it back
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - reason
              - add
              properties:
                reason:
                  type: string
                add:
                  type: object
                  description: Amounts to add to the current limits, each a positive
                    whole number
                  properties:
                    ram_gb:
                      type: integer
                    storage_gb:
                      type: integer
                    instances:
                      type: integer
                    vcpus:
                      type: integer
                    floating_ips:
                      type: integer
    get:
      summary: One quota increase request
      tags:
      - Quotas
      responses:
        '200':
          description: the request, with any review note
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/quota_increase_request"
  "/api/v1/orgs/{org_id}/projects/{project_id}/regions/{region_id}/quota":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: project_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: region_id
      in: path
      description: Keystone region id
      required: true
      schema:
        type: string
    get:
      summary: A project's quota and usage in one region
      tags:
      - Quotas
      responses:
        '200':
          description: used and limit for each dimension; a null limit is unlimited
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    "$ref": "#/components/schemas/quota"
        '404':
          description: an unknown or disabled region
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
        '503':
          description: the cloud's quota could not be read just now
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/orgs/{org_id}/projects/{project_id}/regions/{region_id}/provisioning":
    parameters:
    - name: org_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: project_id
      in: path
      format: uuid
      required: true
      schema:
        type: string
    - name: region_id
      in: path
      description: Keystone region id
      required: true
      schema:
        type: string
    post:
      summary: Provision a project in a region, or retry a failed run
      tags:
      - Projects
      responses:
        '202':
          description: provisioning; poll the project's regions until this one is
            ready or failed
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: object
                    required:
                    - region
                    - status
                    properties:
                      region:
                        type: string
                        description: Keystone region id
                      status:
                        type: string
                        enum:
                        - pending
                        - ready
                        - failed
        '200':
          description: already provisioned there; nothing to do
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: object
                    required:
                    - region
                    - status
                    properties:
                      region:
                        type: string
                        description: Keystone region id
                      status:
                        type: string
                        enum:
                        - pending
                        - ready
                        - failed
        '409':
          description: the project is still being created
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/problem"
  "/api/v1/regions":
    get:
      summary: The regions you can choose between
      tags:
      - Regions
      responses:
        '200':
          description: every enabled region, default first by position
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      "$ref": "#/components/schemas/region"
                  next_cursor:
                    type: string
                    nullable: true
components:
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
  schemas:
    problem:
      type: object
      required:
      - type
      - code
      - title
      - status
      - detail
      - request_id
      properties:
        type:
          type: string
        code:
          type: string
        title:
          type: string
        status:
          type: integer
        detail:
          type: string
        request_id:
          type: string
        errors:
          type: array
          items:
            type: object
            properties:
              field:
                type: string
              message:
                type: string
    region:
      type: object
      required:
      - id
      - name
      - default
      properties:
        id:
          type: string
          description: Keystone region id
        name:
          type: string
        default:
          type: boolean
    project:
      type: object
      required:
      - id
      - name
      - description
      - status
      - created_at
      - regions
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        description:
          type: string
          nullable: true
        status:
          type: string
          enum:
          - active
          - suspended
          - archived
          - deleting
        created_at:
          type: string
          format: date-time
        monthly_budget:
          type: integer
          nullable: true
          description: Minor units (cents); owners and admins only
        regions:
          type: array
          description: The default region first, then each region the project has
            been opened in
          items:
            type: object
            required:
            - region
            - status
            properties:
              region:
                type: string
                description: Keystone region id
              status:
                type: string
                enum:
                - pending
                - ready
                - failed
    member:
      type: object
      required:
      - id
      - name
      - email
      - role
      - joined_at
      properties:
        id:
          type: string
          format: uuid
          description: Membership id
        name:
          type: string
        email:
          type: string
        role:
          type: string
          enum:
          - owner
          - admin
          - member
        joined_at:
          type: string
          format: date-time
        project_access:
          description: Only while per-project access is on. "all" for owners and admins;
            for a member, the granted project ids to an owner or admin, a count to
            anyone else.
          oneOf:
          - type: string
            enum:
            - all
          - type: object
            required:
            - project_ids
            properties:
              project_ids:
                type: array
                items:
                  type: string
                  format: uuid
          - type: object
            required:
            - granted
            - total
            properties:
              granted:
                type: integer
              total:
                type: integer
    invitation:
      type: object
      required:
      - id
      - email
      - role
      - expires_at
      - created_at
      properties:
        id:
          type: string
          format: uuid
        email:
          type: string
        role:
          type: string
          enum:
          - owner
          - admin
          - member
        expires_at:
          type: string
          format: date-time
        created_at:
          type: string
          format: date-time
        url:
          type: string
          description: The invitation link, only while email delivery is off
    audit_event:
      type: object
      required:
      - id
      - action
      - description
      - actor
      - created_at
      properties:
        id:
          type: string
          format: uuid
        action:
          type: string
          description: Stable action code, e.g. project.created
        description:
          type: string
        actor:
          type: string
        project_id:
          type: string
          format: uuid
          nullable: true
        created_at:
          type: string
          format: date-time
    line_item:
      type: object
      required:
      - section
      - resource_name
      - cost
      properties:
        section:
          type: string
          description: compute, volumes, snapshots, floating_ips, ...
        resource_name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        region:
          type: string
          nullable: true
          description: Keystone region id
        hours:
          type: number
          nullable: true
        start_at:
          type: string
          format: date-time
          nullable: true
        end_at:
          type: string
          format: date-time
          nullable: true
        cost:
          type: integer
          description: Minor units (cents)
    invoice:
      type: object
      required:
      - id
      - invoice_number
      - billing_period
      - status
      - currency
      - subtotal
      - total
      - tax_rate
      properties:
        id:
          type: string
          format: uuid
        invoice_number:
          type: string
        billing_period:
          type: string
          example: 2026-09
        status:
          type: string
          enum:
          - sent
          - paid
          - void
        project_id:
          type: string
          format: uuid
          nullable: true
        project_name:
          type: string
        issued_at:
          type: string
          format: date-time
          nullable: true
        due_date:
          type: string
          format: date
          nullable: true
        autopay:
          type: boolean
          nullable: true
        currency:
          type: string
          example: CAD
        subtotal:
          type: integer
          description: Minor units (cents)
        discount:
          type: integer
        credit_applied:
          type: integer
        tax_label:
          type: string
          nullable: true
        tax_rate:
          type: string
          description: Decimal string, e.g. "0.1300"
        tax:
          type: integer
        total:
          type: integer
        line_items:
          type: array
          items:
            "$ref": "#/components/schemas/line_item"
    quota:
      type: object
      required:
      - region
      - provisioned
      - dimensions
      properties:
        region:
          type: string
          description: Keystone region id
        provisioned:
          type: boolean
          description: 'false: the project has not been used in this region yet; limits
            are the profile it will start from'
        dimensions:
          type: object
          properties:
            ram_gb:
              type: object
              required:
              - used
              - limit
              properties:
                used:
                  type: integer
                limit:
                  type: integer
                  nullable: true
                  description: null means unlimited
            storage_gb:
              type: object
              required:
              - used
              - limit
              properties:
                used:
                  type: integer
                limit:
                  type: integer
                  nullable: true
                  description: null means unlimited
            instances:
              type: object
              required:
              - used
              - limit
              properties:
                used:
                  type: integer
                limit:
                  type: integer
                  nullable: true
                  description: null means unlimited
            vcpus:
              type: object
              required:
              - used
              - limit
              properties:
                used:
                  type: integer
                limit:
                  type: integer
                  nullable: true
                  description: null means unlimited
            floating_ips:
              type: object
              required:
              - used
              - limit
              properties:
                used:
                  type: integer
                limit:
                  type: integer
                  nullable: true
                  description: null means unlimited
    quota_increase_request:
      type: object
      required:
      - id
      - region
      - status
      - requested
      - created_at
      properties:
        id:
          type: string
          format: uuid
        region:
          type: string
          description: Keystone region id
        status:
          type: string
          enum:
          - pending
          - approved
          - rejected
          - needs_info
        requested:
          type: object
          description: The limit asked for in each dimension the request touches
          properties:
            ram_gb:
              type: integer
            storage_gb:
              type: integer
            instances:
              type: integer
            vcpus:
              type: integer
            floating_ips:
              type: integer
        reason:
          type: string
          nullable: true
        review_note:
          type: string
          nullable: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    organisation:
      type: object
      required:
      - id
      - name
      - slug
      - status
      - role
      - created_at
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        status:
          type: string
          enum:
          - pending
          - active
          - suspended
        role:
          type: string
          enum:
          - owner
          - admin
          - member
        created_at:
          type: string
          format: date-time
security:
- bearer: []
