DoiT PerfectScale for Commitments AWS API

PerfectScale for Commitments (AWS) — commitment inventory, recommendations, and planned purchases.

Business capability
IT Financial Management BC-600.80

Operations 10

GET /ps4commitments/v1/aws/organizations List AWS organizations #
GET /ps4commitments/v1/aws/organizations/{managementAccountId} Get an AWS organization #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/member-accounts List member accounts under an organization #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/member-accounts/{memberAccountId} Get a member account #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/savings-plans List AWS Savings Plans #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/reserved-instances List AWS Reserved Instances #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/recommendations List AWS recommendations #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/recommendations/{serviceId} Get an AWS recommendation #
GET /ps4commitments/v1/aws/organizations/{managementAccountId}/planned-purchases List AWS planned purchases #
GET /ps4commitments/v1/aws/settings List organization engine settings #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/doit-perfectscale-for-commitments-aws-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

doit-perfectscale-for-commitments-aws-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: DoiT PerfectScale for Commitments AWS API
  description: Programmatic access to DoiT Platform
  version: v1
servers:
- url: https://api.doit.com
security:
- api_key: []
- tenantId: []
  api_key: []
tags:
- name: PerfectScale for Commitments AWS
  description: PerfectScale for Commitments (AWS) — commitment inventory, recommendations, and planned purchases.
paths:
  /ps4commitments/v1/aws/organizations:
    get:
      operationId: listAwsOrganizations
      tags:
      - PerfectScale for Commitments AWS
      summary: List AWS organizations
      description: 'Returns all AWS Organizations accessible to the authenticated tenant.

        Each item includes metadata, trailing 30-day aggregate statistics, precomputed

        YTD/lifetime savings totals per SP type so customer-level savings can be aggregated

        client-side by summing across organizations, and estimated monthly potential

        savings (`monthlyPotentialSavings`) per SP type from the latest projection.'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/ps4cPageToken'
      - $ref: '#/components/parameters/ps4cMaxResults'
      responses:
        '200':
          description: List of AWS Organizations.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                type: object
                required:
                - items
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AwsOrganization'
                  pageToken:
                    type:
                    - string
                    - 'null'
                  rowCount:
                    type:
                    - integer
                    - 'null'
                    format: int64
                    description: Best-effort count for the filtered result set. May be null or omitted for expensive counts.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}:
    get:
      operationId: getAwsOrganization
      tags:
      - PerfectScale for Commitments AWS
      summary: Get an AWS organization
      description: 'Returns a single AWS Organization including metadata, 30-day aggregates,

        and the trailing-window stats that drive the customer Overview screen:

        - `monthlyStats` — last 6 calendar months (ESR, on-demand cost, cost with savings).

        - `dailyCoverage` — last 30 days of commitment coverage breakdown.

        - `savingsTotals` — year-to-date and lifetime savings per SP type.

        - `monthlyPotentialSavings` — estimated monthly additional savings per SP type from the latest projection.

        '
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      responses:
        '200':
          description: AWS Organization detail.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AwsOrganizationDetail'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/member-accounts:
    get:
      operationId: listAwsMemberAccounts
      tags:
      - PerfectScale for Commitments AWS
      summary: List member accounts under an organization
      description: 'Returns all member AWS accounts under the specified organization that have

        active or historical commitment coverage. Includes 30-day statistics and estimated

        monthly potential savings (`monthlyPotentialSavings`) per SP type.'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      - $ref: '#/components/parameters/ps4cPageToken'
      - $ref: '#/components/parameters/ps4cMaxResults'
      responses:
        '200':
          description: List of member accounts.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                type: object
                required:
                - items
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AwsMemberAccount'
                  pageToken:
                    type:
                    - string
                    - 'null'
                  rowCount:
                    type:
                    - integer
                    - 'null'
                    format: int64
                    description: Best-effort count for the filtered result set. May be null or omitted for expensive counts.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/member-accounts/{memberAccountId}:
    get:
      operationId: getAwsMemberAccount
      tags:
      - PerfectScale for Commitments AWS
      summary: Get a member account
      description: "Returns a single member AWS account including 30-day aggregates and the\ntrailing-window stats that drive the member-account Overview view:\n- `monthlyStats` — last 6 calendar months per SP type.\n- `dailyCoverage` — last 30 days of commitment coverage breakdown.\n- `savingsTotals` — year-to-date and lifetime savings per SP type, clamped to\n  the parent organization's onboarding start.\n- `monthlyPotentialSavings` — estimated monthly additional savings per SP type,\n  attributed from the parent organization's projection.\n"
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      - $ref: '#/components/parameters/memberAccountId'
      responses:
        '200':
          description: Member account detail.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AwsMemberAccountDetail'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/savings-plans:
    get:
      operationId: listAwsSavingsPlans
      tags:
      - PerfectScale for Commitments AWS
      summary: List AWS Savings Plans
      description: 'Returns the paginated list of Savings Plans for the specified organization.

        Filterable by plan type and state.'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      - in: query
        name: type
        required: false
        description: Filter by Savings Plan type.
        schema:
          type: string
          enum:
          - compute
          - ec2_instance
          - sagemaker
          - database
      - in: query
        name: status
        required: false
        description: Filter by Savings Plan state.
        schema:
          type: string
          enum:
          - pending_return
          - returning
          - active
          - expired
          - queued
          - queued_returning
          - payment_failed
          - payment_pending
      - $ref: '#/components/parameters/ps4cPageToken'
      - $ref: '#/components/parameters/ps4cMaxResults'
      responses:
        '200':
          description: Paginated list of Savings Plans.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                type: object
                required:
                - items
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AwsSavingsPlan'
                  pageToken:
                    type:
                    - string
                    - 'null'
                  rowCount:
                    type:
                    - integer
                    - 'null'
                    format: int64
                    description: Best-effort count for the filtered result set. May be null or omitted for expensive counts.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/reserved-instances:
    get:
      operationId: listAwsReservedInstances
      tags:
      - PerfectScale for Commitments AWS
      summary: List AWS Reserved Instances
      description: 'Returns the paginated list of Reserved Instances (RIs) for the specified organization.

        Filterable by state, instance type/family, region, and offering class.'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      - in: query
        name: status
        required: false
        description: Filter by Reserved Instance state.
        schema:
          type: string
          enum:
          - active
          - retired
          - payment_pending
          - payment_failed
          - queued
          - queued_deleted
      - in: query
        name: instanceType
        required: false
        description: Filter by exact EC2 instance type (e.g. `m5.large`). Case-sensitive.
        schema:
          type: string
      - in: query
        name: instanceFamily
        required: false
        description: Filter by EC2 instance family — the leading segment of `instanceType` before the dot (e.g. `m5` matches `m5.large`, `m5.xlarge`). Case-sensitive.
        schema:
          type: string
      - in: query
        name: region
        required: false
        description: Filter by AWS region (e.g. `us-east-1`). Case-sensitive.
        schema:
          type: string
      - in: query
        name: offeringClass
        required: false
        description: Filter by RI offering class.
        schema:
          type: string
          enum:
          - standard
          - convertible
      - $ref: '#/components/parameters/ps4cPageToken'
      - $ref: '#/components/parameters/ps4cMaxResults'
      responses:
        '200':
          description: Paginated list of Reserved Instances.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                type: object
                required:
                - items
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AwsReservedInstance'
                  pageToken:
                    type:
                    - string
                    - 'null'
                  rowCount:
                    type:
                    - integer
                    - 'null'
                    format: int64
                    description: Best-effort count for the filtered result set. May be null or omitted for expensive counts.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/recommendations:
    get:
      operationId: listAwsRecommendations
      tags:
      - PerfectScale for Commitments AWS
      summary: List AWS recommendations
      description: 'Returns commitment purchase recommendations for the organization.

        Multiple recommendations may exist per organization (one per service).'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      responses:
        '200':
          description: List of recommendations.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AwsRecommendations'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/recommendations/{serviceId}:
    get:
      operationId: getAwsRecommendation
      tags:
      - PerfectScale for Commitments AWS
      summary: Get an AWS recommendation
      description: Returns full detail for a single recommendation including analysis metrics.
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      - $ref: '#/components/parameters/serviceId'
      - $ref: '#/components/parameters/eligibleSpendGranularity'
      responses:
        '200':
          description: Recommendation detail.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AwsRecommendationWithEligibleSpend'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/organizations/{managementAccountId}/planned-purchases:
    get:
      operationId: listAwsPlannedPurchases
      tags:
      - PerfectScale for Commitments AWS
      summary: List AWS planned purchases
      description: 'Returns the laddering projections for the organization — one item per available

        `purchases-projection` document (typically `compute` and/or `database`; up to four

        product lines as PS4C expands).


        With no filters, returns all existing projection documents for the organization in

        stable product-line order (`compute`, then `database`, then any future lines in enum

        order). When a filtered product line has no projection document, the response is an

        empty `items` array (not `404`). Partial projection documents return only the fields

        available in storage.


        `404` is returned only when the organization does not exist or the caller cannot

        access it. An organization that is not onboarded for PS4C still returns `200` with an

        empty `items` array when no projection documents exist — use

        `GET /ps4commitments/v1/aws/organizations` (or get-by-id) for `onboardingStatus`.


        **Pagination**: results are returned in stable product-line order (`compute`, then

        `database`, then any future lines in enum order). Use `maxResults` to limit page size

        (default 50, max 500). When more items remain, the response includes a non-null

        `pageToken`; pass it unchanged on the next request with the same query parameters

        (`service`, `maxResults`). `rowCount` is the number of items in this page. An invalid

        `pageToken` returns `400` with code `pagination_token_invalid`; an expired token returns

        `400` with code `pagination_token_expired`.'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/managementAccountId'
      - $ref: '#/components/parameters/service'
      - $ref: '#/components/parameters/ps4cPageToken'
      - $ref: '#/components/parameters/ps4cMaxResults'
      responses:
        '200':
          description: Paginated list of planned purchase projections.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                type: object
                required:
                - items
                - rowCount
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AwsPlannedPurchase'
                  pageToken:
                    type:
                    - string
                    - 'null'
                  rowCount:
                    type: integer
                    format: int64
                    description: Number of items in `items` for this response.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  /ps4commitments/v1/aws/settings:
    get:
      operationId: listAwsOrganizationsSettings
      tags:
      - PerfectScale for Commitments AWS
      summary: List organization engine settings
      description: 'Returns automation and recommendation engine settings for every onboarded

        organization, broken down by product line (`compute`, `database`).

        Settings are configured at the customer level and apply uniformly across all organizations.

        Only product lines that are activated/onboarded for a given organization are returned.

        The `purchaseAccountId` is the member AWS account designated to execute SP

        purchases on behalf of that organization.'
      parameters:
      - $ref: '#/components/parameters/tenantId'
      - $ref: '#/components/parameters/ps4cPageToken'
      - $ref: '#/components/parameters/ps4cMaxResults'
      responses:
        '200':
          description: List of per-organization per-product-line engine settings.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
          content:
            application/json:
              schema:
                type: object
                required:
                - items
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AwsOrganizationSettingsItem'
                  pageToken:
                    type:
                    - string
                    - 'null'
                    description: Opaque cursor for the next page. Absent when this is the last page.
                  rowCount:
                    type: integer
                    format: int64
                    description: Number of items returned in this page.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  responses:
    Unauthorized:
      description: Missing or invalid credentials.
      headers:
        WWW-Authenticate:
          description: Bearer challenge per RFC 6750.
          schema:
            type: string
            example: Bearer realm="api.doit.com"
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Content-Language:
          $ref: '#/components/headers/ContentLanguage'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://developer.doit.com/errors/unauthorized
            title: Unauthorized
            status: 401
            detail: missing or invalid bearer token
            instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
            code: unauthorized
            retryable: false
    BadRequest:
      description: Syntactically malformed request, missing required parameter, or unsupported parameter value.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Content-Language:
          $ref: '#/components/headers/ContentLanguage'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            validationFailed:
              summary: Missing or invalid parameter
              value:
                type: https://developer.doit.com/errors/validation_failed
                title: Validation failed
                status: 400
                detail: The request is missing a required parameter or contains an invalid value.
                instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
                code: validation_failed
                retryable: false
            tenantIdRequired:
              summary: Tenant scope not resolvable (§15)
              value:
                type: https://developer.doit.com/errors/tenant_id_required
                title: Tenant ID required
                status: 400
                detail: X-Tenant-Id header is required when the credential can access more than one tenant.
                instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
                code: tenant_id_required
                retryable: false
            tenantIdMismatch:
              summary: Header conflicts with the key's tenant (§15)
              value:
                type: https://developer.doit.com/errors/tenant_id_mismatch
                title: Tenant ID mismatch
                status: 400
                detail: X-Tenant-Id does not match the tenant the credential is scoped to.
                instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
                code: tenant_id_mismatch
                retryable: false
            gcpServiceRequired:
              summary: GCP region filter without product line
              value:
                type: https://developer.doit.com/errors/gcp_service_required
                title: GCP service required
                status: 400
                detail: The region query parameter requires gcp_service.
                instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
                code: gcp_service_required
                retryable: false
            paginationTokenInvalid:
              summary: Structurally invalid pagination cursor (§8)
              value:
                type: https://developer.doit.com/errors/pagination_token_invalid
                title: Invalid pagination token
                status: 400
                detail: The pageToken cursor is structurally invalid (decode failure or tampering).
                instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
                code: pagination_token_invalid
                retryable: false
            paginationTokenExpired:
              summary: Expired pagination cursor (§8)
              value:
                type: https://developer.doit.com/errors/pagination_token_expired
                title: Expired pagination token
                status: 400
                detail: The pageToken cursor is no longer valid; restart pagination from the beginning.
                instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
                code: pagination_token_expired
                retryable: false
    NotFound:
      description: The requested resource does not exist.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Content-Language:
          $ref: '#/components/headers/ContentLanguage'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://developer.doit.com/errors/not_found
            title: Resource not found
            status: 404
            detail: organization not found
            instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
            code: not_found
            retryable: false
    ServiceUnavailable:
      description: Service temporarily unavailable; retry after the indicated delay.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            example: 30
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Content-Language:
          $ref: '#/components/headers/ContentLanguage'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://developer.doit.com/errors/service_unavailable
            title: Service unavailable
            status: 503
            detail: entitlement check temporarily unavailable
            instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
            code: service_unavailable
            retryable: true
    InternalServerError:
      description: Unexpected server error.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Content-Language:
          $ref: '#/components/headers/ContentLanguage'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://developer.doit.com/errors/internal_error
            title: Internal server error
            status: 500
            detail: an unexpected error occurred
            instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
            code: internal_error
            retryable: true
    Forbidden:
      description: Authenticated but not authorised to access this customer's PS4C resources.
      headers:
        Request-Id:
          $ref: '#/components/headers/RequestId'
        Content-Language:
          $ref: '#/components/headers/ContentLanguage'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://developer.doit.com/errors/forbidden
            title: Forbidden
            status: 403
            detail: caller does not have permission to access this customer's commitments
            instance: https://api.doit.com/requests/req_01HX9P2KQVJ8Z3M4T5N6V7W8Y9
            code: forbidden
            retryable: false
  schemas:
    AwsOnboardingStatusEntry:
      type: object
      required:
      - status
      description: Per-product-line PS4C onboarding state.
      properties:
        status:
          type: string
          description: Current onboarding lifecycle stage for this product line.
          enum:
          - not_started
          - onboarding
          - done
          - error
        onboardingStartedAt:
          type:
          - string
          - 'null'
          format: date-time
          description: 'When PS4C first began tracking commitments for this product line. Used to bound

            lifetime savings totals and to render onboarding history in the DoiT Console.

            '
    Policy:
      type: string
      enum:
      - conservative
      - balanced
      - max_savings
      description: 'Coverage target policy.

        - `conservative` — lower coverage target (~65%)

        - `balanced` — moderate coverage target (~80%)

        - `max_savings` — aggressive coverage target (~90%)

        '
    AwsMonthlyStatsEntry:
      type: object
      required:
      - month
      - esr
      - onDemandCost
      - costWithSavings
      description: 'One calendar-month aggregate for the organization. Money fields are wrapped

        objects (`{amount, currency}`).

        '
      properties:
        month:
          type: string
          pattern: ^\d{4}-(0[1-9]|1[0-2])$
          example: 2025-06
        esr:
          type: number
          format: double
          description: Effective Savings Rate for the month (0–1).
        onDemandCost:
          allOf:
          - $ref: '#/components/schemas/Money'
          description: Eligible on-demand cost for the month.
        costWithSavings:
          allOf:
          - $ref: '#/components/schemas/Money'
          description: Actual cost after commitments for the month.
    AwsOrganization:
      type: object
      required:
      - managementAccountId
      properties:
        managementAccountId:
          type: string
          description: 12-digit account number of the organization's management (payer) account.
          example: '123456789012'
        displayName:
          type:
          - string
          - 'null'
          description: Human-readable account alias, if available.
          example: Acme Prod
        onboardingStatus:
          allOf:
          - $ref: '#/components/schemas/AwsOnboardingStatus'
          description: Per-product-line PS4C onboarding state for this organization.
        savingsPlansSyncTime:
          type:
          - string
          - 'null'
          format: date-time
          description: Timestamp of the last successful Savings Plan inventory sync.
        stats30d:
          type: object
  

# --- truncated at 32 KB (66 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/doit/refs/heads/main/openapi/doit-perfectscale-for-commitments-aws-api-openapi.yml