openapi: 3.0.0
paths:
  /v1/oracle/scu:
    get:
      operationId: OraclePublicController_getScu
      summary: Current SCU value with methodology-versioned breakdown
      description: >-
        Returns the live SCU index, reference workload, methodology version, and
        the per-family breakdown as a discriminated union keyed by
        methodologyVersion. Empty basket returns 204.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScuResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '204':
          description: No confirmed revision exists yet
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/models:
    get:
      operationId: OraclePublicController_getModels
      summary: 'List catalog models: current basket members plus retired ex-members'
      description: >-
        Current basket members carry inBasket=true with manifest-attested
        prices. Models that were representatives in a past confirmed revision
        but left the basket stay listed with inBasket=false and
        retiredAtRevision set; their prices come from the live catalog
        (ModelPrice). Soft-deleted models and retired models without any catalog
        price are not listed. Prices here are what providers charge:
        usdPricePerMillion and the cache and reasoning blocks carry no routing
        markup, and markedUpUsdPricePerMillion carries it. For prices as billed,
        use /v1/oracle/pricing.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelsResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/models/{key}:
    get:
      operationId: OraclePublicController_getModel
      summary: Get single catalog model (basket member or retired) by key
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '404':
          description: '`not_found` — The requested resource does not exist.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      message: The requested resource does not exist.
                      type: not_found
                      code: not_found
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/models/{key}/price-history:
    get:
      operationId: OraclePublicController_getModelPriceHistory
      summary: Per-model input/output price history (JSON or CSV via Accept header)
      description: >-
        Returns one time series of input/output USD prices for any tracked
        model; every point is resolved with the same rule as price-at and
        carries its own source, so a single series mixes provenance. Instants
        where the confirmed revision in force attests the model are
        manifest-sourced (source=manifest, cross-linking revisionVersion,
        methodologyVersion and metadataHash); every other instant falls back to
        the live catalog's temporal history (source=catalog). Consecutive points
        repeating the same source and prices are collapsed; granularity defaults
        to per-revision, daily and weekly carry forward the last observed price,
        and catchup revisions whose manifest is unavailable are surfaced via
        unavailableRevisions. Models with neither an attested appearance nor a
        catalog price return 404.
      parameters: []
      responses:
        '200':
          description: Per-model price history series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelPriceHistoryResponseDto'
            text/csv:
              schema:
                type: string
                description: >-
                  RFC 4180 CSV with header:
                  date,inputPriceUsdPerMillion,outputPriceUsdPerMillion,source,revisionVersion,methodologyVersion,metadataHash.
                  The three provenance columns are empty on catalog-sourced
                  rows.
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '404':
          description: '`not_found` — The requested resource does not exist.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      message: The requested resource does not exist.
                      type: not_found
                      code: not_found
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/models/{key}/price-at:
    get:
      operationId: OraclePublicController_getModelPriceAt
      summary: Per-model input/output USD price effective at a given ISO-8601 date
      description: >-
        Resolves from the confirmed revision in force at the requested date when
        that revision attests the model (source=manifest, cross-linking
        revisionVersion, methodologyVersion, metadataHash and family; observedAt
        is that revision's publishedAt). Otherwise the live catalog's temporal
        history answers (source=catalog, observedAt is the price row's own
        observedAt, family may be null). Returns 404 only when the model is
        untracked, or when neither the attested manifest nor the catalog holds a
        price at that date.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelPriceAtResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '404':
          description: '`not_found` — The requested resource does not exist.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      message: The requested resource does not exist.
                      type: not_found
                      code: not_found
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/basket:
    get:
      operationId: OraclePublicController_getBasket
      summary: Get full basket composition
      description: >-
        Prices follow the /v1/oracle/models convention: unmarked figures are
        provider list prices, markedUp* figures carry the routing markup.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BasketResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/baseline:
    get:
      operationId: OraclePublicController_getBaseline
      summary: Inception SCU snapshot for Efficiency Index denominator
      parameters: []
      responses:
        '200':
          description: Inception SCU snapshot
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaselineResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '204':
          description: No confirmed revision exists yet
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/scu-at:
    get:
      operationId: OraclePublicController_getScuAt
      summary: SCU value active at a given timestamp (step function, no interpolation)
      description: >-
        Resolves the latest confirmed revision with publishedAt <= date and
        returns its SCU, methodologyVersion, revisionVersion, publishedAt and
        metadataHash. On equal publishedAt the highest revisionVersion wins.
        Returns 204 when the requested timestamp precedes the genesis revision;
        422 if date is in the future or malformed.
      parameters: []
      responses:
        '200':
          description: SCU at the requested timestamp
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScuAtResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '204':
          description: Requested timestamp precedes the genesis revision
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/history:
    get:
      operationId: OraclePublicController_getHistory
      summary: >-
        SCU time series with granularity bucketing (JSON or CSV via Accept
        header)
      description: >-
        Returns the SCU index time series for the requested range. Granularity
        defaults to per-revision; daily and weekly buckets carry forward the
        last revision's value. Set Accept: text/csv to download a
        spreadsheet-friendly CSV instead of JSON.
      parameters: []
      responses:
        '200':
          description: Index history series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OracleHistoryResponseDto'
            text/csv:
              schema:
                type: string
                description: >-
                  RFC 4180 CSV with header:
                  date,scuUsd,computeIndex,revisionVersion,methodologyVersion,metadataHash
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/reconstitutions:
    get:
      operationId: OraclePublicController_getReconstitutions
      summary: Get reconstitution event log
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReconstitutionsResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/reconstitutions/export:
    get:
      operationId: OraclePublicController_exportReconstitutions
      summary: Export reconstitution history as markdown
      parameters: []
      responses:
        '200':
          description: Reconstitution log rendered as a downloadable markdown attachment
          content:
            text/markdown:
              schema:
                type: string
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/revisions/{revision}:
    get:
      operationId: OraclePublicController_getRevision
      summary: Get a single confirmed revision by version number
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OracleRevisionResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '404':
          description: '`not_found` — The requested resource does not exist.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      message: The requested resource does not exist.
                      type: not_found
                      code: not_found
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/latest:
    get:
      operationId: OraclePublicController_getLatest
      summary: Latest confirmed revision summary
      description: >-
        Lightweight endpoint returning the latest CONFIRMED revision's version,
        publish timestamp, tx hash, confirmation time, SCU in USD, and basket
        size. No full basket payload.
      parameters: []
      responses:
        '200':
          description: Latest revision summary
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LatestRevisionSummaryResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '204':
          description: No confirmed revision exists yet
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/health:
    get:
      operationId: OraclePublicController_getHealth
      summary: Oracle health probe
      description: >-
        Latest confirmed revision version and timestamp. Returns nulls when no
        revisions have been confirmed yet.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OracleHealthResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/contract-metadata:
    get:
      operationId: OraclePublicController_getContractMetadata
      summary: Live OracleRegistry contract identity and role membership
      description: >-
        Returns the chainId, proxy address, and on-chain version() of the
        OracleRegistry, plus the declared DEFAULT_ADMIN_ROLE and MAINTAINER_ROLE
        holders with their live hasRole verdict from the RPC. verifiedOnChain is
        null when the RPC call fails. Cached for five minutes on the backend.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractMetadataResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/stats:
    get:
      operationId: OraclePublicController_getStats
      summary: Public aggregate protocol stats
      parameters: []
      responses:
        '200':
          description: Aggregate protocol metrics
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/activity:
    get:
      operationId: OraclePublicController_getActivityFeed
      summary: Live activity feed
      parameters: []
      responses:
        '200':
          description: Paginated activity events
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/manifest/{metadataHash}:
    get:
      operationId: OraclePublicController_getManifest
      summary: Fetch published revision manifest by metadataHash
      description: >-
        Returns the off-chain content-addressed manifest for a confirmed
        revision. Verify: keccak256(JCS(manifest)) == metadataHash == on-chain
        metadataHash. contentHash covers a projection instead — methodology plus
        modelKey, family and the two prices per entry — so a display-metadata
        correction moves metadataHash without invalidating prices.
      parameters: []
      responses:
        '200':
          description: Revision manifest JSON document
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '404':
          description: '`not_found` — The requested resource does not exist.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      message: The requested resource does not exist.
                      type: not_found
                      code: not_found
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/pricing:
    get:
      operationId: OraclePublicController_getPricing
      summary: Per-model pricing in token and USD, as billed
      description: >-
        Every figure carries the routing markup, cache and reasoning included,
        so it matches what a request is charged. For provider list prices
        without markup, use /v1/oracle/models.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/catalog:
    get:
      operationId: OraclePublicController_getCatalog
      summary: Full catalog of tracked models with current prices and index-member flag
      description: >-
        Returns every tracked model, including non-latest family versions.
        Sourced from Model rows + the live catalog (ModelPrice); the indexMember
        flag is set when the model is the current family representative in the
        latest CONFIRMED revision's manifest. Models without a catalog price row
        are excluded.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatalogResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/resolve:
    get:
      operationId: OraclePublicController_resolveBatch
      summary: Resolve a batch of model names to canonical prices and priceSource
      description: >-
        Same logic as /resolve/:key for each comma-separated key in the query.
        Preserves input order. Unknown models return priceSource='off-basket'
        with null prices instead of an error. Batch size capped at 100;
        URL-length safe in practice.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResolveBatchResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/resolve/{key}:
    get:
      operationId: OraclePublicController_resolveModel
      summary: >-
        Resolve a single model name to its canonical key, prices, and
        priceSource
      description: >-
        Normalizes the input (dash→dot, strips bracket annotations and trailing
        date suffixes), then matches against the catalog. priceSource is one of:
        oracle-basket (current index member), oracle-catalog (priced but not a
        current index member), off-basket (not in catalog). Unknown models
        return 200 + off-basket + null prices, never 404. Accepts the model key
        only; never reads token or usage payload.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResolveResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/methodology:
    get:
      operationId: MethodologyPublicController_getChangelog
      summary: Methodology changelog
      description: >-
        Every registered methodology version with its formula summary, family
        rule, reference workload, and spec reference. activeVersion is the
        version in force now — the same value served in the
        X-Methodology-Version response header.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MethodologyChangelogResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
  /v1/oracle/methodology/{version}:
    get:
      operationId: MethodologyPublicController_getByVersion
      summary: Single methodology record by version
      description: >-
        Returns 404 for versions absent from the catalog. A revision row may
        reference a version this catalog does not know (legacy data before
        cutover); the row still serves its numeric version while this lookup
        stays the authority on definitions.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MethodologyRecordResponseDto'
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '404':
          description: '`not_found` — The requested resource does not exist.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      message: The requested resource does not exist.
                      type: not_found
                      code: not_found
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '422':
          description: >-
            `validation_failed` — The request body failed validation. Per-field
            details are in `error.issues[]`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validation_failed:
                  summary: validation_failed
                  value:
                    error:
                      message: >-
                        The request body failed validation. Per-field details
                        are in `error.issues[]`.
                      type: invalid_request_error
                      code: validation_failed
          headers:
            X-Methodology-Version:
              description: >-
                Methodology version in force at response time — the version of
                the latest synced confirmed revision (catalog max before the
                first sync). Body fields named methodologyVersion are per-row
                provenance and may differ on historical reads. Absent on 429
                responses, which are emitted before interceptors run.
              schema:
                type: integer
                minimum: 1
        '429':
          description: >-
            `rate_limited` — The caller exceeded a rate-limit window on this
            endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                rate_limited:
                  summary: rate_limited
                  value:
                    error:
                      message: >-
                        The caller exceeded a rate-limit window on this
                        endpoint.
                      type: rate_limit_error
                      code: rate_limited
      tags:
        - Oracle Public
info:
  title: Compute Finance Public API
  description: >-
    Read-only public endpoints for the Compute Price Index (CPI). No
    authentication. JSON responses. Stable schemas. Covers the Standard Compute
    Unit (SCU), basket composition, model prices, historical snapshots, and
    aggregate protocol statistics. For the full internal spec see
    /docs/openapi.yaml. MCP server: install via `npx @compute-finance/mcp`
    (stdio, no API key). GitHub: https://github.com/compute-finance/mcp
  version: '1.0'
  contact:
    name: Compute Finance
    url: https://compute.finance
    email: info@compute.finance
  license:
    name: MIT
    url: https://opensource.org/license/mit
tags:
  - name: Oracle Public
    description: >-
      REST resources for the Compute Price Index. Each endpoint is an idempotent
      GET on a noun:
      /v1/oracle/{scu,basket,models,models/{key},revisions,revisions/{r},history,reconstitutions,baseline,latest,health,contract-metadata,pricing,methodology,methodology/{v},manifest/{metadataHash}}.
      All read paths return CONFIRMED state only; pending revisions are never
      surfaced. Write paths (publish, approve, refork, discard) are RPC
      operations served from the admin tag and require maintainer
      authentication; they are not part of this public spec.
  - name: Errors
    description: >-
      All API error responses share a unified envelope:


      ```json

      {
        "error": {
          "message": "...",
          "type": "...",
          "code": "<canonical code>"
        }
      }

      ```


      Optional fields: `param` (field name), `details` (code-specific payload),
      `issues[]` (Zod issues for VALIDATION_FAILED).


      ## Catalog


      | Code | Status | Type | Meaning | When |

      |---|---|---|---|---|

      | `unauthorized` | 401 | `invalid_request_error` | Authentication is
      required to access this endpoint. | The session cookie is missing or
      invalid, the Bearer token is absent, or the timestamp on a signed request
      is outside the 5-minute freshness window. |

      | `forbidden` | 403 | `forbidden` | The caller is authenticated but is not
      allowed to perform this action. | The caller lacks the required role, or a
      request was signed by an address different from the authenticated wallet.
      |

      | `invalid_signature` | 401 | `invalid_request_error` | The provided
      signature could not be verified. | The EIP-191 signature is malformed,
      truncated, or does not recover to a valid signer. |

      | `signature_reused` | 409 | `invalid_request_error` | This signed request
      has already been submitted. | The nonce for this signed request was
      consumed by an earlier submission. |

      | `invalid_api_key` | 401 | `invalid_request_error` | The Bearer API key
      is missing, malformed, or not recognized. | The token is empty, does not
      use the `ct_live_` format, or does not match any active key. |

      | `api_key_frozen` | 403 | `forbidden` | The API key is currently frozen
      and cannot be used for requests. | The key was frozen from the API keys
      page or by support. Reactivate it from the API keys page, or contact
      support if it was frozen by an administrator. |

      | `api_key_revoked` | 401 | `invalid_request_error` | The API key has been
      revoked and can no longer be used. | The key was revoked from the API keys
      page. Revocation is permanent — issue a new key to continue. |

      | `model_restricted` | 403 | `forbidden` | The requested model is not in
      this key's allowed-models list. | The key was restricted to a specific set
      of models; the request referenced a model outside that set. |

      | `bad_request` | 400 | `invalid_request_error` | The request is invalid
      in a way that does not match a more specific error code. | A generic 400
      for request-shape issues that no other code describes more precisely. |

      | `validation_failed` | 422 | `invalid_request_error` | The request body
      failed validation. Per-field details are in `error.issues[]`. | One or
      more fields are missing, of the wrong type, or outside their allowed
      range. |

      | `method_not_allowed` | 405 | `invalid_request_error` | The endpoint
      exists but does not accept this HTTP method. | A request used a method the
      route does not support; the `Allow` response header lists the accepted
      methods. |

      | `not_found` | 404 | `not_found` | The requested resource does not exist.
      | The identifier did not match any resource, or the URL does not match any
      endpoint. |

      | `already_exists` | 409 | `conflict` | A resource with the same unique
      identity already exists. | A duplicate was detected during pre-check, or a
      concurrent write violated a unique constraint. |

      | `conflict` | 409 | `conflict` | The resource was modified concurrently;
      retry with the latest version. | A serializable transaction aborted due to
      concurrent writes, or an operation found the resource in an inconsistent
      state. |

      | `insufficient_balance` | 402 | `insufficient_quota` | The account's
      $COMPUTE balance is below the requested amount. | Triggered when
      withdrawing more than the balance, or when an inference request would
      exceed the balance after billing. |

      | `spending_limit_reached` | 429 | `rate_limit_error` | A per-key spending
      cap has been reached. | The key carries a daily, weekly, or monthly cap,
      and this request would exceed it. |

      | `all_keys_exhausted` | 502 | `server_error` | No upstream capacity is
      currently available for the routed model. | All contributor keys serving
      this model were unavailable, rate-limited, or in a cool-down; retry
      shortly. |

      | `rate_limited` | 429 | `rate_limit_error` | The caller exceeded a
      rate-limit window on this endpoint. | Either the per-endpoint request-rate
      cap or the provider-pool RPM/TPM cap was hit. |

      | `stream_interrupted` | 500 | `server_error` | The SSE stream aborted
      before completion. | The upstream provider connection dropped mid-stream.
      This error is delivered inside the SSE body, not as an HTTP status. |

      | `contract_error` | 500 | `server_error` | An on-chain call reverted or
      could not be confirmed. | The transaction failed to broadcast, timed out
      waiting for a receipt, or the receipt reported failure. |

      | `internal_error` | 500 | `server_error` | An unexpected server-side
      failure occurred. | A fallback for exceptions that no other error code
      describes; the failure is logged for investigation. |

      | `service_unavailable` | 503 | `server_error` | A required upstream
      dependency is temporarily unavailable. | A dependency needed for this
      request is unreachable; security-critical paths intentionally reject
      rather than degrade. |
servers:
  - url: https://api.compute.finance
    description: Production
components:
  schemas:
    ScuResponseDto:
      type: object
      properties:
        scuUsd:
          type: number
        computeIndex:
          type: number
          nullable: true
        referenceWorkload:
          type: object
          properties:
            inputTokens:
              type: number
            outputTokens:
              type: number
          selfRequired: true
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        breakdown:
          oneOf:
            - type: object
              properties:
                methodologyVersion:
                  type: number
                  minimum: 1
                  maximum: 1
                familyRepresentatives:
                  type: array
                  items:
                    type: object
                    properties:
                      family:
                        type: string
                      modelKey:
                        type: string
                      inputPriceUsdPerMillion:
                        type: number
                      outputPriceUsdPerMillion:
                        type: number
                      blendedCostUsd:
                        type: number
                    required:
                      - family
                      - modelKey
                      - inputPriceUsdPerMillion
                      - outputPriceUsdPerMillion
                      - blendedCostUsd
              required:
                - methodologyVersion
                - familyRepresentatives
        updatedAt:
          type: string
      required:
        - scuUsd
        - computeIndex
        - referenceWorkload
        - methodologyVersion
        - breakdown
        - updatedAt
    ModelsResponseDto:
      type: object
      properties:
        models:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              displayName:
                type: string
              provider:
                type: object
                properties:
                  key:
                    type: string
                  name:
                    type: string
                required:
                  - key
                  - name
              family:
                description: >-
                  Provider product line (e.g. 'openai.gpt'). One family per
                  basket slot; the latest released model in the family is the
                  representative.
                type: string
              weiPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              usdPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              markedUpWeiPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              markedUpUsdPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              releasedAt:
                type: string
                format: date-time
                nullable: true
              cache:
                type: object
                properties:
                  cachedInput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite5m:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite1h:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  read_multiplier:
                    type: number
                    nullable: true
                  write_multiplier_5m:
                    type: number
                    nullable: true
                  write_multiplier_1h:
                    type: number
                    nullable: true
                required:
                  - cachedInput
                  - cacheWrite5m
                  - cacheWrite1h
                  - read_multiplier
                  - write_multiplier_5m
                  - write_multiplier_1h
                nullable: true
              reasoning:
                type: object
                properties:
                  reasoningOutput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                required:
                  - reasoningOutput
                nullable: true
              inBasket:
                description: >-
                  True when the model is a family representative in the latest
                  confirmed revision; false for retired models that stay listed
                  in the catalog.
                type: boolean
              retiredAtRevision:
                description: >-
                  First confirmed revision in which the model no longer appears
                  in the basket; null for current basket members.
                type: integer
                minimum: 0
                exclusiveMinimum: true
                nullable: true
            required:
              - id
              - displayName
              - provider
              - family
              - weiPricePerMillion
              - usdPricePerMillion
              - markedUpWeiPricePerMillion
              - markedUpUsdPricePerMillion
              - releasedAt
              - cache
              - reasoning
              - inBasket
              - retiredAtRevision
      required:
        - models
    ModelResponseDto:
      type: object
      properties:
        id:
          type: string
        displayName:
          type: string
        provider:
          type: object
          properties:
            key:
              type: string
            name:
              type: string
          selfRequired: true
        family:
          description: >-
            Provider product line (e.g. 'openai.gpt'). One family per basket
            slot; the latest released model in the family is the representative.
          type: string
        weiPricePerMillion:
          type: object
          properties:
            input:
              type: number
            output:
              type: number
          selfRequired: true
        usdPricePerMillion:
          type: object
          properties:
            input:
              type: number
            output:
              type: number
          selfRequired: true
        markedUpWeiPricePerMillion:
          type: object
          properties:
            input:
              type: number
            output:
              type: number
          selfRequired: true
        markedUpUsdPricePerMillion:
          type: object
          properties:
            input:
              type: number
            output:
              type: number
          selfRequired: true
        cache:
          type: object
          properties:
            cachedInput:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
            cacheWrite5m:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
            cacheWrite1h:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
            read_multiplier:
              type: number
              nullable: true
            write_multiplier_5m:
              type: number
              nullable: true
            write_multiplier_1h:
              type: number
              nullable: true
          nullable: true
          selfRequired: true
        reasoning:
          type: object
          properties:
            reasoningOutput:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
          nullable: true
          selfRequired: true
        inBasket:
          description: >-
            True when the model is a family representative in the latest
            confirmed revision; false for retired models that stay listed in the
            catalog.
          type: boolean
        retiredAtRevision:
          description: >-
            First confirmed revision in which the model no longer appears in the
            basket; null for current basket members.
          type: integer
          minimum: 0
          exclusiveMinimum: true
          nullable: true
      required:
        - id
        - displayName
        - provider
        - family
        - weiPricePerMillion
        - usdPricePerMillion
        - markedUpWeiPricePerMillion
        - markedUpUsdPricePerMillion
        - cache
        - reasoning
        - inBasket
        - retiredAtRevision
    ModelPriceHistoryResponseDto:
      type: object
      properties:
        from:
          type: string
        to:
          type: string
        granularity:
          type: string
          enum:
            - per-revision
            - daily
            - weekly
        count:
          type: integer
          minimum: 0
          exclusiveMinimum: false
        truncated:
          type: boolean
        modelKey:
          type: string
        family:
          type: string
          nullable: true
        unavailableRevisions:
          type: array
          items:
            type: integer
            minimum: 0
            exclusiveMinimum: true
        data:
          type: array
          items:
            type: object
            properties:
              date:
                type: string
              inputPriceUsdPerMillion:
                type: number
              outputPriceUsdPerMillion:
                type: number
              source:
                type: string
                enum:
                  - manifest
                  - catalog
              revisionVersion:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              methodologyVersion:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              metadataHash:
                type: string
                pattern: ^0x[0-9a-f]{64}$
            required:
              - date
              - inputPriceUsdPerMillion
              - outputPriceUsdPerMillion
              - source
      required:
        - from
        - to
        - granularity
        - count
        - truncated
        - modelKey
        - family
        - unavailableRevisions
        - data
    ModelPriceAtResponseDto:
      type: object
      properties:
        modelKey:
          type: string
        date:
          type: string
          format: date-time
        inputPriceUsdPerMillion:
          type: number
        outputPriceUsdPerMillion:
          type: number
        observedAt:
          type: string
          format: date-time
        source:
          type: string
          enum:
            - manifest
            - catalog
        revisionVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        metadataHash:
          type: string
          pattern: ^0x[0-9a-f]{64}$
        family:
          type: string
          nullable: true
      required:
        - modelKey
        - date
        - inputPriceUsdPerMillion
        - outputPriceUsdPerMillion
        - observedAt
        - source
        - family
    BasketResponseDto:
      type: object
      properties:
        models:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              displayName:
                type: string
              provider:
                type: object
                properties:
                  key:
                    type: string
                  name:
                    type: string
                required:
                  - key
                  - name
              family:
                description: >-
                  Provider product line (e.g. 'openai.gpt'). One family per
                  basket slot; the latest released model in the family is the
                  representative.
                type: string
              weiPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              usdPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              markedUpWeiPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              markedUpUsdPricePerMillion:
                type: object
                properties:
                  input:
                    type: number
                  output:
                    type: number
                required:
                  - input
                  - output
              releasedAt:
                type: string
                format: date-time
                nullable: true
              cache:
                type: object
                properties:
                  cachedInput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite5m:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite1h:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  read_multiplier:
                    type: number
                    nullable: true
                  write_multiplier_5m:
                    type: number
                    nullable: true
                  write_multiplier_1h:
                    type: number
                    nullable: true
                required:
                  - cachedInput
                  - cacheWrite5m
                  - cacheWrite1h
                  - read_multiplier
                  - write_multiplier_5m
                  - write_multiplier_1h
                nullable: true
              reasoning:
                type: object
                properties:
                  reasoningOutput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                required:
                  - reasoningOutput
                nullable: true
            required:
              - id
              - displayName
              - provider
              - family
              - weiPricePerMillion
              - usdPricePerMillion
              - markedUpWeiPricePerMillion
              - markedUpUsdPricePerMillion
              - releasedAt
              - cache
              - reasoning
        scuUsd:
          type: number
        routingFeeRate:
          type: number
        revisionVersion:
          type: number
          nullable: true
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          nullable: true
        lastUpdated:
          type: string
      required:
        - models
        - scuUsd
        - routingFeeRate
        - revisionVersion
        - methodologyVersion
        - lastUpdated
    BaselineResponseDto:
      type: object
      properties:
        date:
          type: string
        scuUsd:
          type: number
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
      required:
        - date
        - scuUsd
        - methodologyVersion
    ScuAtResponseDto:
      type: object
      properties:
        at:
          type: string
          format: date-time
        scuUsd:
          type: number
        scuUsd18:
          type: string
        computeIndex:
          type: number
          nullable: true
        revisionVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        publishedAt:
          type: string
          format: date-time
        metadataHash:
          type: string
          pattern: ^0x[0-9a-f]{64}$
      required:
        - at
        - scuUsd
        - scuUsd18
        - computeIndex
        - revisionVersion
        - methodologyVersion
        - publishedAt
        - metadataHash
    OracleHistoryResponseDto:
      type: object
      properties:
        from:
          type: string
        to:
          type: string
        granularity:
          type: string
          enum:
            - per-revision
            - daily
            - weekly
        count:
          type: integer
          minimum: 0
          exclusiveMinimum: false
        truncated:
          type: boolean
        data:
          type: array
          items:
            type: object
            properties:
              date:
                type: string
              scuUsd:
                type: number
              computeIndex:
                type: number
                nullable: true
              revisionVersion:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              methodologyVersion:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              metadataHash:
                type: string
                pattern: ^0x[0-9a-f]{64}$
            required:
              - date
              - scuUsd
              - computeIndex
              - revisionVersion
              - methodologyVersion
              - metadataHash
      required:
        - from
        - to
        - granularity
        - count
        - truncated
        - data
    ReconstitutionsResponseDto:
      type: object
      properties:
        entries:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              revisionVersion:
                type: integer
              methodologyVersion:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              previousVersion:
                type: integer
                nullable: true
              publishedAt:
                type: string
              summary:
                type: string
              scuBefore:
                type: number
                nullable: true
              scuAfter:
                type: number
              changes:
                type: array
                items:
                  type: object
                  properties:
                    type:
                      type: string
                    modelKey:
                      type: string
                    description:
                      type: string
                    before:
                      type: object
                      additionalProperties: {}
                    after:
                      type: object
                      additionalProperties: {}
                  required:
                    - type
                    - description
              txHash:
                type: string
                nullable: true
            required:
              - id
              - revisionVersion
              - methodologyVersion
              - previousVersion
              - publishedAt
              - summary
              - scuBefore
              - scuAfter
              - changes
              - txHash
      required:
        - entries
    OracleRevisionResponseDto:
      type: object
      properties:
        revisionVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: false
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        publishedAt:
          type: string
        publishedBlock:
          type: integer
        txHash:
          type: string
        scuUsd:
          type: number
        scuUsd18:
          type: string
        basketSize:
          type: integer
          minimum: 0
          exclusiveMinimum: false
        basket:
          type: object
          properties:
            schemaVersion:
              type: number
              minimum: 1
              maximum: 1
            models:
              type: array
              items:
                type: object
                properties:
                  modelKey:
                    type: string
                  family:
                    type: string
                  inputPrice:
                    type: string
                  outputPrice:
                    type: string
                  displayName:
                    type: string
                  providerKey:
                    type: string
                  sdkId:
                    type: string
                    nullable: true
                required:
                  - modelKey
                  - family
                  - inputPrice
                  - outputPrice
                  - displayName
                  - providerKey
                  - sdkId
          selfRequired: true
        status:
          type: string
        confirmedAt:
          type: string
          nullable: true
        manifestUrl:
          type: string
          nullable: true
      required:
        - revisionVersion
        - methodologyVersion
        - publishedAt
        - publishedBlock
        - txHash
        - scuUsd
        - scuUsd18
        - basketSize
        - basket
        - status
        - confirmedAt
        - manifestUrl
    LatestRevisionSummaryResponseDto:
      type: object
      properties:
        revisionVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: false
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        publishedAt:
          type: string
        confirmedAt:
          type: string
          nullable: true
        scuUsd:
          type: number
        computeIndex:
          type: number
          nullable: true
        basketSize:
          type: integer
          minimum: 0
          exclusiveMinimum: false
        workload:
          type: object
          properties:
            inputTokens:
              type: integer
              minimum: 0
              exclusiveMinimum: false
            outputTokens:
              type: integer
              minimum: 0
              exclusiveMinimum: false
          selfRequired: true
        metadataHash:
          type: string
          pattern: ^0x[0-9a-f]{64}$
      required:
        - revisionVersion
        - methodologyVersion
        - publishedAt
        - confirmedAt
        - scuUsd
        - computeIndex
        - basketSize
        - workload
        - metadataHash
    OracleHealthResponseDto:
      type: object
      properties:
        latestRevisionVersion:
          type: integer
          nullable: true
        methodologyVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          nullable: true
        latestRevisionConfirmedAt:
          type: string
          format: date-time
          nullable: true
        lastSyncAt:
          type: string
          format: date-time
          nullable: true
        stale:
          type: boolean
        liveModelCount:
          type: integer
          minimum: 0
          exclusiveMinimum: false
          nullable: true
        emptyBasket:
          type: boolean
        basketRevisionVersion:
          type: integer
          nullable: true
        pendingRevision:
          type: object
          properties:
            ageMs:
              type: integer
              minimum: 0
              exclusiveMinimum: false
          nullable: true
          selfRequired: true
      required:
        - latestRevisionVersion
        - methodologyVersion
        - latestRevisionConfirmedAt
        - lastSyncAt
        - stale
        - liveModelCount
        - emptyBasket
        - basketRevisionVersion
        - pendingRevision
    ContractMetadataResponseDto:
      type: object
      properties:
        chainId:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        address:
          type: string
          pattern: ^0x[0-9a-fA-F]{40}$
        version:
          type: integer
          nullable: true
        bytecodeHash:
          type: string
          pattern: ^0x[0-9a-f]{64}$
          nullable: true
        checkedAt:
          type: string
          format: date-time
      required:
        - chainId
        - address
        - version
        - bytecodeHash
        - checkedAt
    PricingResponseDto:
      type: object
      properties:
        object:
          type: string
          enum:
            - pricing
        pegUsd:
          type: number
        models:
          type: object
          additionalProperties:
            type: object
            properties:
              input:
                type: object
                properties:
                  weiPerMillion:
                    type: number
                  usdPerMillion:
                    type: number
                required:
                  - weiPerMillion
                  - usdPerMillion
              output:
                type: object
                properties:
                  weiPerMillion:
                    type: number
                  usdPerMillion:
                    type: number
                required:
                  - weiPerMillion
                  - usdPerMillion
              cache:
                type: object
                properties:
                  cachedInput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite5m:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite1h:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  read_multiplier:
                    type: number
                    nullable: true
                  write_multiplier_5m:
                    type: number
                    nullable: true
                  write_multiplier_1h:
                    type: number
                    nullable: true
                required:
                  - cachedInput
                  - cacheWrite5m
                  - cacheWrite1h
                  - read_multiplier
                  - write_multiplier_5m
                  - write_multiplier_1h
                nullable: true
              reasoning:
                type: object
                properties:
                  reasoningOutput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                required:
                  - reasoningOutput
                nullable: true
            required:
              - input
              - output
              - cache
              - reasoning
          selfRequired: true
        updatedAt:
          type: string
      required:
        - object
        - pegUsd
        - models
        - updatedAt
    CatalogResponseDto:
      type: object
      properties:
        models:
          type: array
          items:
            type: object
            properties:
              modelKey:
                type: string
              displayName:
                type: string
              provider:
                type: object
                properties:
                  key:
                    type: string
                  name:
                    type: string
                required:
                  - key
                  - name
              family:
                type: string
                nullable: true
              indexMember:
                description: >-
                  Whether this model is the current family representative in the
                  latest confirmed SCU revision.
                type: boolean
              releasedAt:
                type: string
                format: date-time
                nullable: true
              currentPrice:
                type: object
                properties:
                  inputPriceUsdPerMillion:
                    type: number
                  outputPriceUsdPerMillion:
                    type: number
                  observedAt:
                    type: string
                    format: date-time
                required:
                  - inputPriceUsdPerMillion
                  - outputPriceUsdPerMillion
                  - observedAt
              cache:
                type: object
                properties:
                  cachedInput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite5m:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite1h:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  read_multiplier:
                    type: number
                    nullable: true
                  write_multiplier_5m:
                    type: number
                    nullable: true
                  write_multiplier_1h:
                    type: number
                    nullable: true
                required:
                  - cachedInput
                  - cacheWrite5m
                  - cacheWrite1h
                  - read_multiplier
                  - write_multiplier_5m
                  - write_multiplier_1h
                nullable: true
              reasoning:
                type: object
                properties:
                  reasoningOutput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                required:
                  - reasoningOutput
                nullable: true
            required:
              - modelKey
              - displayName
              - provider
              - family
              - indexMember
              - releasedAt
              - currentPrice
              - cache
              - reasoning
        truncated:
          type: boolean
        generatedAt:
          type: string
          format: date-time
      required:
        - models
        - truncated
        - generatedAt
    ResolveBatchResponseDto:
      type: object
      properties:
        results:
          type: array
          items:
            type: object
            properties:
              inputKey:
                type: string
              resolvedKey:
                type: string
              family:
                type: string
                nullable: true
              provider:
                type: object
                properties:
                  key:
                    type: string
                  name:
                    type: string
                required:
                  - key
                  - name
                nullable: true
              prices:
                type: object
                properties:
                  inputUsdPerMillion:
                    type: number
                  outputUsdPerMillion:
                    type: number
                required:
                  - inputUsdPerMillion
                  - outputUsdPerMillion
                nullable: true
              cache:
                type: object
                properties:
                  cachedInput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite5m:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  cacheWrite1h:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                  read_multiplier:
                    type: number
                    nullable: true
                  write_multiplier_5m:
                    type: number
                    nullable: true
                  write_multiplier_1h:
                    type: number
                    nullable: true
                required:
                  - cachedInput
                  - cacheWrite5m
                  - cacheWrite1h
                  - read_multiplier
                  - write_multiplier_5m
                  - write_multiplier_1h
                nullable: true
              reasoning:
                type: object
                properties:
                  reasoningOutput:
                    type: object
                    properties:
                      usdPerMillion:
                        type: number
                        nullable: true
                      ratioOfInput:
                        type: number
                        nullable: true
                      source:
                        type: string
                      sourceUrl:
                        type: string
                        nullable: true
                      createdAt:
                        type: string
                        nullable: true
                    required:
                      - usdPerMillion
                      - ratioOfInput
                      - source
                      - sourceUrl
                      - createdAt
                    nullable: true
                required:
                  - reasoningOutput
                nullable: true
              inBasket:
                type: boolean
              priceSource:
                type: string
                enum:
                  - oracle-basket
                  - oracle-catalog
                  - off-basket
            required:
              - inputKey
              - resolvedKey
              - family
              - provider
              - prices
              - cache
              - reasoning
              - inBasket
              - priceSource
      required:
        - results
    ResolveResponseDto:
      type: object
      properties:
        inputKey:
          type: string
        resolvedKey:
          type: string
        family:
          type: string
          nullable: true
        provider:
          type: object
          properties:
            key:
              type: string
            name:
              type: string
          nullable: true
          selfRequired: true
        prices:
          type: object
          properties:
            inputUsdPerMillion:
              type: number
            outputUsdPerMillion:
              type: number
          nullable: true
          selfRequired: true
        cache:
          type: object
          properties:
            cachedInput:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
            cacheWrite5m:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
            cacheWrite1h:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
            read_multiplier:
              type: number
              nullable: true
            write_multiplier_5m:
              type: number
              nullable: true
            write_multiplier_1h:
              type: number
              nullable: true
          nullable: true
          selfRequired: true
        reasoning:
          type: object
          properties:
            reasoningOutput:
              type: object
              properties:
                usdPerMillion:
                  type: number
                  nullable: true
                ratioOfInput:
                  type: number
                  nullable: true
                source:
                  type: string
                sourceUrl:
                  type: string
                  nullable: true
                createdAt:
                  type: string
                  nullable: true
              required:
                - usdPerMillion
                - ratioOfInput
                - source
                - sourceUrl
                - createdAt
              nullable: true
          nullable: true
          selfRequired: true
        inBasket:
          type: boolean
        priceSource:
          type: string
          enum:
            - oracle-basket
            - oracle-catalog
            - off-basket
      required:
        - inputKey
        - resolvedKey
        - family
        - provider
        - prices
        - cache
        - reasoning
        - inBasket
        - priceSource
    MethodologyChangelogResponseDto:
      type: object
      properties:
        activeVersion:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        entries:
          type: array
          items:
            type: object
            properties:
              version:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              title:
                type: string
              meanType:
                type: string
              weighting:
                type: string
              familyRule:
                type: object
                properties:
                  oneFamilyOneSlot:
                    type: boolean
                  familyKeyScheme:
                    type: string
                  representativeSelection:
                    type: string
                required:
                  - oneFamilyOneSlot
                  - familyKeyScheme
                  - representativeSelection
              referenceWorkload:
                type: object
                properties:
                  inputTokens:
                    type: integer
                    minimum: 0
                    exclusiveMinimum: true
                  outputTokens:
                    type: integer
                    minimum: 0
                    exclusiveMinimum: true
                required:
                  - inputTokens
                  - outputTokens
              cacheReasoningInIndex:
                type: boolean
              formulaSummary:
                type: string
              rationale:
                type: string
              specUrl:
                type: string
                nullable: true
            required:
              - version
              - title
              - meanType
              - weighting
              - familyRule
              - referenceWorkload
              - cacheReasoningInIndex
              - formulaSummary
              - rationale
              - specUrl
      required:
        - activeVersion
        - entries
    MethodologyRecordResponseDto:
      type: object
      properties:
        version:
          type: integer
          minimum: 0
          exclusiveMinimum: true
        title:
          type: string
        meanType:
          type: string
        weighting:
          type: string
        familyRule:
          type: object
          properties:
            oneFamilyOneSlot:
              type: boolean
            familyKeyScheme:
              type: string
            representativeSelection:
              type: string
          selfRequired: true
        referenceWorkload:
          type: object
          properties:
            inputTokens:
              type: integer
              minimum: 0
              exclusiveMinimum: true
            outputTokens:
              type: integer
              minimum: 0
              exclusiveMinimum: true
          selfRequired: true
        cacheReasoningInIndex:
          type: boolean
        formulaSummary:
          type: string
        rationale:
          type: string
        specUrl:
          type: string
          nullable: true
      required:
        - version
        - title
        - meanType
        - weighting
        - familyRule
        - referenceWorkload
        - cacheReasoningInIndex
        - formulaSummary
        - rationale
        - specUrl
    ErrorEnvelope:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - message
            - type
            - code
          properties:
            message:
              type: string
              description: Human-readable summary.
            type:
              type: string
              description: >-
                OpenAI-compatible coarse category derived from the canonical
                code.
            code:
              $ref: '#/components/schemas/ErrorCode'
            param:
              type: string
              nullable: true
              description: Field name when the error is bound to a specific input.
            details:
              type: object
              additionalProperties: true
              nullable: true
              description: Code-specific structured payload.
            issues:
              type: array
              items:
                type: object
                additionalProperties: true
              description: Zod issues for VALIDATION_FAILED responses.
    ErrorCode:
      type: string
      description: Canonical taxonomy code. Full descriptions live under the `Errors` tag.
      enum:
        - unauthorized
        - forbidden
        - invalid_signature
        - signature_reused
        - invalid_api_key
        - api_key_frozen
        - api_key_revoked
        - model_restricted
        - bad_request
        - validation_failed
        - method_not_allowed
        - not_found
        - already_exists
        - conflict
        - insufficient_balance
        - spending_limit_reached
        - all_keys_exhausted
        - rate_limited
        - stream_interrupted
        - contract_error
        - internal_error
        - service_unavailable
  responses:
    Error_unauthorized:
      description: 401 unauthorized — Authentication is required to access this endpoint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: Authentication is required to access this endpoint.
              type: invalid_request_error
              code: unauthorized
    Error_forbidden:
      description: >-
        403 forbidden — The caller is authenticated but is not allowed to
        perform this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: >-
                The caller is authenticated but is not allowed to perform this
                action.
              type: forbidden
              code: forbidden
    Error_invalid_signature:
      description: 401 invalid_signature — The provided signature could not be verified.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The provided signature could not be verified.
              type: invalid_request_error
              code: invalid_signature
    Error_signature_reused:
      description: 409 signature_reused — This signed request has already been submitted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: This signed request has already been submitted.
              type: invalid_request_error
              code: signature_reused
    Error_invalid_api_key:
      description: >-
        401 invalid_api_key — The Bearer API key is missing, malformed, or not
        recognized.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The Bearer API key is missing, malformed, or not recognized.
              type: invalid_request_error
              code: invalid_api_key
    Error_api_key_frozen:
      description: >-
        403 api_key_frozen — The API key is currently frozen and cannot be used
        for requests.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The API key is currently frozen and cannot be used for requests.
              type: forbidden
              code: api_key_frozen
    Error_api_key_revoked:
      description: >-
        401 api_key_revoked — The API key has been revoked and can no longer be
        used.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The API key has been revoked and can no longer be used.
              type: invalid_request_error
              code: api_key_revoked
    Error_model_restricted:
      description: >-
        403 model_restricted — The requested model is not in this key's
        allowed-models list.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The requested model is not in this key's allowed-models list.
              type: forbidden
              code: model_restricted
    Error_bad_request:
      description: >-
        400 bad_request — The request is invalid in a way that does not match a
        more specific error code.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: >-
                The request is invalid in a way that does not match a more
                specific error code.
              type: invalid_request_error
              code: bad_request
    Error_validation_failed:
      description: >-
        422 validation_failed — The request body failed validation. Per-field
        details are in `error.issues[]`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: >-
                The request body failed validation. Per-field details are in
                `error.issues[]`.
              type: invalid_request_error
              code: validation_failed
    Error_method_not_allowed:
      description: >-
        405 method_not_allowed — The endpoint exists but does not accept this
        HTTP method.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The endpoint exists but does not accept this HTTP method.
              type: invalid_request_error
              code: method_not_allowed
    Error_not_found:
      description: 404 not_found — The requested resource does not exist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The requested resource does not exist.
              type: not_found
              code: not_found
    Error_already_exists:
      description: >-
        409 already_exists — A resource with the same unique identity already
        exists.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: A resource with the same unique identity already exists.
              type: conflict
              code: already_exists
    Error_conflict:
      description: >-
        409 conflict — The resource was modified concurrently; retry with the
        latest version.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: >-
                The resource was modified concurrently; retry with the latest
                version.
              type: conflict
              code: conflict
    Error_insufficient_balance:
      description: >-
        402 insufficient_balance — The account's $COMPUTE balance is below the
        requested amount.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The account's $COMPUTE balance is below the requested amount.
              type: insufficient_quota
              code: insufficient_balance
    Error_spending_limit_reached:
      description: 429 spending_limit_reached — A per-key spending cap has been reached.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: A per-key spending cap has been reached.
              type: rate_limit_error
              code: spending_limit_reached
    Error_all_keys_exhausted:
      description: >-
        502 all_keys_exhausted — No upstream capacity is currently available for
        the routed model.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: >-
                No upstream capacity is currently available for the routed
                model.
              type: server_error
              code: all_keys_exhausted
    Error_rate_limited:
      description: >-
        429 rate_limited — The caller exceeded a rate-limit window on this
        endpoint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The caller exceeded a rate-limit window on this endpoint.
              type: rate_limit_error
              code: rate_limited
    Error_stream_interrupted:
      description: 500 stream_interrupted — The SSE stream aborted before completion.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: The SSE stream aborted before completion.
              type: server_error
              code: stream_interrupted
    Error_contract_error:
      description: >-
        500 contract_error — An on-chain call reverted or could not be
        confirmed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: An on-chain call reverted or could not be confirmed.
              type: server_error
              code: contract_error
    Error_internal_error:
      description: 500 internal_error — An unexpected server-side failure occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: An unexpected server-side failure occurred.
              type: server_error
              code: internal_error
    Error_service_unavailable:
      description: >-
        503 service_unavailable — A required upstream dependency is temporarily
        unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              message: A required upstream dependency is temporarily unavailable.
              type: server_error
              code: service_unavailable
externalDocs:
  description: Methodology and guides
  url: https://docs.compute.finance
x-mcp-server:
  package: '@compute-finance/mcp'
  version: 0.3.0
  transport: stdio
  install:
    command: npx
    args:
      - '@compute-finance/mcp'
  setupCommand: npx @compute-finance/mcp setup
  serverCard: https://compute.finance/.well-known/mcp/server-card.json
  repository: https://github.com/compute-finance/mcp
  npm: https://www.npmjs.com/package/@compute-finance/mcp
  registry: >-
    https://registry.modelcontextprotocol.io/v0/servers?search=io.github.compute-finance/mcp
