> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getcomputable.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Index methodology

> The GPU SKUs covered by the index, how their prices are calculated, and the history limits and license terms.

Currently B300, B200, H100 and H200; `data.skus` is the live list. Values are in USD per GPU-hour, published every 15 minutes.

Data is licensed CC BY-NC 4.0 with attribution. This endpoint accepts no query parameters.



## OpenAPI

````yaml https://mcp.getcomputable.com/openapi.json get /v1/methodology
openapi: 3.1.0
info:
  title: Computable GPU Index API
  version: '1'
  summary: GPU compute price index in USD per GPU-hour.
  description: >-
    Anonymous, read-only. No API key and no registration.


    Successful responses contain `data`, publication details in `meta`, and
    `license`. Errors contain `error`, `meta`, and `license`. Preserve or ignore
    unfamiliar calculation and receipt disclosure fields.


    Values are published every 15 minutes. History covers the last 90 days;
    older values are available at
    [data.getcomputable.com](https://data.getcomputable.com).


    Data is licensed CC BY-NC 4.0 with attribution; each response includes the
    attribution to use.
  license:
    name: CC BY-NC 4.0
    identifier: CC-BY-NC-4.0
servers:
  - url: https://api.getcomputable.com
    description: Public REST host.
security: []
tags:
  - name: Index
    description: Latest index values and price history.
  - name: Methodology
    description: Covered SKUs, calculation methods and history limits.
paths:
  /v1/methodology:
    get:
      tags:
        - Methodology
      summary: Index methodology
      description: >-
        The GPU SKUs covered by the index, how their prices are calculated, and
        the history limits and license terms.


        Currently B300, B200, H100 and H200; `data.skus` is the live list.
        Values are in USD per GPU-hour, published every 15 minutes.


        Data is licensed CC BY-NC 4.0 with attribution. This endpoint accepts no
        query parameters.
      operationId: getIndexMethodology
      parameters: []
      responses:
        '200':
          description: Covered SKUs, calculation methods, history limits and license terms.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlLatest'
            ETag:
              $ref: '#/components/headers/ETag'
            x-index-artifact:
              $ref: '#/components/headers/IndexArtifact'
            x-index-artifact-sha256:
              $ref: '#/components/headers/IndexArtifactSha256'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AboutIndexDataResponse'
              examples:
                methodology:
                  summary: Four GPU SKUs
                  value:
                    data:
                      index_name: Computable GPU Index
                      index_domain: mcp.getcomputable.com
                      primary_sku: B300
                      unit: USD/GPU/hour
                      skus:
                        - B300
                        - B200
                        - H100
                        - H200
                      methodologies:
                        - sku: B300
                          methodology_id: annex_a_v0_2_calc_v14
                          methodology_version: '0.2'
                          aggregation: median_ci_votes
                          composite_statistic: median_ci_votes
                          iqm_alpha: 0.16666
                        - sku: B200
                          methodology_id: annex_a2_v0_3_calc_v14
                          methodology_version: '0.3'
                          aggregation: median_ci_votes
                          composite_statistic: median_ci_votes
                          iqm_alpha: 0.16666
                        - sku: H100
                          methodology_id: h100_sxm_v1_calc_v10
                          methodology_version: '1'
                          aggregation: median_ci_votes
                          composite_statistic: median_ci_votes
                          iqm_alpha: 0.16666
                        - sku: H200
                          methodology_id: h200_sxm_v1_calc_v10
                          methodology_version: '1'
                          aggregation: median_ci_votes
                          composite_statistic: median_ci_votes
                          iqm_alpha: 0.16666
                      statistic_description: >-
                        The index uses an interquantile mean over a weighted
                        vote ballot: each source votes at its price, price minus
                        standard deviation, and price plus standard deviation,
                        all at its receipt weight.
                      config_spec_priced: One B300 SXM accelerator-hour.
                      license_terms: CC-BY-NC-4.0
                      changelog_tail: []
                      history_policy:
                        availability: trailing_window_only
                        resolution: 15-minute
                        window_days: 90
                        default_limit: 168
                        max_limit: 2976
                    meta:
                      scope: primary_lane
                      index_name: Computable GPU Index
                      methodology_id: annex_a_v0_2_calc_v14
                      input_snapshot_sha256: >-
                        8e1df331554b6b256ba89297a541ccdd3b7e75b88f9fdf3f4db98f275cdd3c2a
                      as_of_observed_at: '2026-08-27T06:00:00.000Z'
                      generated_at: '2026-08-27T06:04:24.000Z'
                      coverage:
                        n_sources: 8
                        n_passing: 8
                        frozen: []
                        excluded: []
                      status: ok
                      reason: null
                      freshness: fresh
                    license:
                      spdx: CC-BY-NC-4.0
                      url: https://creativecommons.org/licenses/by-nc/4.0/
                      attribution: >-
                        Computable GPU Index by Computable —
                        mcp.getcomputable.com
        '304':
          description: >-
            The response has not changed since the `ETag` sent in
            `If-None-Match`. No body is returned.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlLatest'
            ETag:
              $ref: '#/components/headers/ETag'
            x-index-artifact:
              $ref: '#/components/headers/IndexArtifact'
            x-index-artifact-sha256:
              $ref: '#/components/headers/IndexArtifactSha256'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
        '400':
          description: >-
            Request failed. `invalid_request`: A parameter is malformed or over
            the limit.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                invalid_request:
                  $ref: '#/components/examples/invalid_request'
        '403':
          description: '`invalid_request`: The `Host` or `Origin` header is not allowed.'
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                invalid_request:
                  $ref: '#/components/examples/invalid_request'
        '404':
          description: >-
            Request failed. `artifact_missing`: The requested published data
            file is not available.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                artifact_missing:
                  $ref: '#/components/examples/artifact_missing'
        '429':
          description: >-
            Request failed. `rate_limited`: The fair-use request limit has been
            reached.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                rate_limited:
                  $ref: '#/components/examples/rate_limited'
        '500':
          description: >-
            Request failed. `internal_error`: The request could not be
            completed.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                internal_error:
                  $ref: '#/components/examples/internal_error'
        '502':
          description: >-
            Request failed. `artifact_digest_mismatch`: The published data file
            failed its checksum check. `artifact_path_violation`: The published
            data file has an invalid path. `invalid_artifact`: The published
            data file could not be read as valid index data.
            `unknown_methodology`: The published data uses a methodology that is
            not available for this SKU.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                artifact_digest_mismatch:
                  $ref: '#/components/examples/artifact_digest_mismatch'
                artifact_path_violation:
                  $ref: '#/components/examples/artifact_path_violation'
                invalid_artifact:
                  $ref: '#/components/examples/invalid_artifact'
                unknown_methodology:
                  $ref: '#/components/examples/unknown_methodology'
        '503':
          description: >-
            Request failed. `upstream_unavailable`: The published data is
            temporarily unavailable.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControlRefusal'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefusalEnvelope'
              examples:
                upstream_unavailable:
                  $ref: '#/components/examples/upstream_unavailable'
components:
  headers:
    CacheControlLatest:
      description: 'Cache policy for methodology: `public, max-age=300`.'
      schema:
        type: string
        const: public, max-age=300
    ETag:
      description: >-
        Strong entity tag over the response body. Send it back in
        `If-None-Match` for a `304`.
      schema:
        type: string
    IndexArtifact:
      description: The published data file used to produce this response.
      schema:
        type: string
    IndexArtifactSha256:
      description: SHA-256 checksum of the published data file used for this response.
      schema:
        $ref: '#/components/schemas/Sha256'
    RateLimitLimit:
      description: >-
        Requests allowed in the current window. Available on the Node server;
        not sent by the Cloudflare Worker.
      schema:
        type: integer
        minimum: 0
    RateLimitPolicy:
      description: >-
        The quota policy in force, as `<limit>;w=<window-seconds>`. Available on
        the Node server; not sent by the Cloudflare Worker.
      schema:
        type: string
    RateLimitRemaining:
      description: >-
        Requests left in the current window. Available on the Node server; not
        sent by the Cloudflare Worker.
      schema:
        type: integer
        minimum: 0
    RateLimitReset:
      description: >-
        Seconds until the current window resets. Available on the Node server;
        not sent by the Cloudflare Worker.
      schema:
        type: integer
        minimum: 0
    CacheControlRefusal:
      description: 'Errors are never cached: `no-store`.'
      schema:
        type: string
        const: no-store
    RetryAfter:
      description: >-
        Seconds to wait before retrying. Sent on `429` only; back off until it
        elapses. Available on the Node server; not sent by the Cloudflare
        Worker.
      schema:
        type: integer
        minimum: 0
  schemas:
    AboutIndexDataResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/AboutIndexData'
        meta:
          $ref: '#/components/schemas/PrimaryLanePublicationMeta'
        license:
          $ref: '#/components/schemas/License'
      required:
        - data
        - meta
        - license
      additionalProperties: false
    RefusalEnvelope:
      type: object
      properties:
        error:
          $ref: '#/components/schemas/RefusalError'
        meta:
          $ref: '#/components/schemas/RefusalMeta'
        license:
          $ref: '#/components/schemas/License'
      required:
        - error
        - meta
        - license
      additionalProperties: false
      description: >-
        An error code and message, with the same license information as a
        successful response.
    Sha256:
      type: string
      pattern: ^[a-f0-9]{64}$
    AboutIndexData:
      type: object
      properties:
        index_name:
          $ref: '#/components/schemas/IndexName'
        index_domain:
          $ref: '#/components/schemas/Hostname'
        primary_sku:
          $ref: '#/components/schemas/Identifier'
        unit:
          $ref: '#/components/schemas/Unit'
        skus:
          type: array
          items:
            $ref: '#/components/schemas/Identifier'
        methodologies:
          type: array
          items:
            $ref: '#/components/schemas/MethodologyLane'
        statistic_description:
          type: string
          const: >-
            The index uses an interquantile mean over a weighted vote ballot:
            each source votes at its price, price minus standard deviation, and
            price plus standard deviation, all at its receipt weight.
        config_spec_priced:
          type: string
          minLength: 1
          pattern: \S
          maxLength: 512
        license_terms:
          type: string
          const: CC-BY-NC-4.0
        changelog_tail:
          type: array
          items:
            $ref: '#/components/schemas/ChangelogEntry'
        history_policy:
          type: object
          properties:
            availability:
              type: string
              const: trailing_window_only
            resolution:
              $ref: '#/components/schemas/ObservationCadence'
            window_days:
              type: integer
              exclusiveMinimum: 0
              maximum: 9007199254740991
            default_limit:
              type: number
              const: 168
            max_limit:
              type: integer
              exclusiveMinimum: 0
              maximum: 20000
          required:
            - availability
            - resolution
            - window_days
            - default_limit
            - max_limit
          additionalProperties: false
      required:
        - index_name
        - index_domain
        - primary_sku
        - unit
        - skus
        - methodologies
        - statistic_description
        - config_spec_priced
        - license_terms
        - changelog_tail
        - history_policy
      additionalProperties: false
    PrimaryLanePublicationMeta:
      anyOf:
        - $ref: '#/components/schemas/PrimaryLanePublicationMetaOk'
        - $ref: '#/components/schemas/PrimaryLanePublicationMetaStale'
        - $ref: '#/components/schemas/PrimaryLanePublicationMetaNoPrint'
      description: Publication details for the methodology response.
    License:
      type: object
      properties:
        spdx:
          type: string
          const: CC-BY-NC-4.0
        url:
          type: string
          const: https://creativecommons.org/licenses/by-nc/4.0/
        attribution:
          type: string
          minLength: 1
          pattern: \S
          maxLength: 512
      required:
        - spdx
        - url
        - attribution
      additionalProperties: false
    RefusalError:
      anyOf:
        - $ref: '#/components/schemas/StandardRefusalError'
        - $ref: '#/components/schemas/HistoryWindowExceededError'
    RefusalMeta:
      type: object
      properties:
        scope:
          type: string
          const: refusal
        index_name:
          $ref: '#/components/schemas/IndexName'
        methodology_id:
          type: 'null'
        input_snapshot_sha256:
          type: 'null'
        as_of_observed_at:
          type: 'null'
        generated_at:
          $ref: '#/components/schemas/DateTimeString'
        status:
          type: 'null'
        reason:
          type: 'null'
        freshness:
          type: 'null'
        coverage:
          type: 'null'
      required:
        - scope
        - index_name
        - methodology_id
        - input_snapshot_sha256
        - as_of_observed_at
        - generated_at
        - status
        - reason
        - freshness
        - coverage
      additionalProperties: false
    IndexName:
      type: string
      minLength: 1
      pattern: \S
      maxLength: 256
    Hostname:
      type: string
      maxLength: 253
      pattern: >-
        ^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)(?:\.(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?))*$
      description: A DNS hostname with no scheme, port or path.
    Identifier:
      type: string
      minLength: 1
      maxLength: 128
      pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
      description: An identifier for a GPU SKU, provider or methodology.
    Unit:
      type: string
      const: USD/GPU/hour
      description: USD per GPU-hour.
    MethodologyLane:
      oneOf:
        - type: object
          properties:
            sku:
              $ref: '#/components/schemas/Identifier'
            methodology_id:
              $ref: '#/components/schemas/Identifier'
            methodology_version:
              $ref: '#/components/schemas/DisplayLabel'
            aggregation:
              type: string
              enum:
                - median_stddev_votes
                - median_ci_votes
          required:
            - sku
            - methodology_id
            - methodology_version
            - aggregation
          additionalProperties: false
        - type: object
          properties:
            sku:
              $ref: '#/components/schemas/Identifier'
            methodology_id:
              $ref: '#/components/schemas/Identifier'
            methodology_version:
              $ref: '#/components/schemas/DisplayLabel'
            aggregation:
              type: string
              enum:
                - median_stddev_votes
                - median_ci_votes
            composite_statistic:
              type: string
              const: median_ci_votes
            iqm_alpha:
              type: number
          required:
            - sku
            - methodology_id
            - methodology_version
            - aggregation
            - composite_statistic
            - iqm_alpha
          additionalProperties: false
    ChangelogEntry:
      type: object
      properties:
        methodology_id:
          $ref: '#/components/schemas/Identifier'
        methodology_version:
          $ref: '#/components/schemas/DisplayLabel'
        date:
          $ref: '#/components/schemas/DateString'
        summary:
          type: string
          minLength: 1
          pattern: \S
          maxLength: 512
        url:
          $ref: '#/components/schemas/HttpsUrl'
      required:
        - methodology_id
        - methodology_version
        - date
        - summary
        - url
      additionalProperties: false
    ObservationCadence:
      anyOf:
        - type: string
          const: hourly
        - $ref: '#/components/schemas/MinuteObservationCadence'
    PrimaryLanePublicationMetaOk:
      type: object
      properties:
        scope:
          $ref: '#/components/schemas/PrimaryLaneScope'
        index_name:
          $ref: '#/components/schemas/IndexName'
        methodology_id:
          $ref: '#/components/schemas/Identifier'
        input_snapshot_sha256:
          $ref: '#/components/schemas/NullableSha256'
        as_of_observed_at:
          $ref: '#/components/schemas/ObservationDateTimeString'
        generated_at:
          $ref: '#/components/schemas/DateTimeString'
        coverage:
          $ref: '#/components/schemas/Coverage'
        status:
          type: string
          const: ok
        reason:
          type: 'null'
        freshness:
          type: string
          const: fresh
      required:
        - scope
        - index_name
        - methodology_id
        - input_snapshot_sha256
        - as_of_observed_at
        - generated_at
        - coverage
        - status
        - reason
        - freshness
      additionalProperties: false
    PrimaryLanePublicationMetaStale:
      type: object
      properties:
        scope:
          $ref: '#/components/schemas/PrimaryLaneScope'
        index_name:
          $ref: '#/components/schemas/IndexName'
        methodology_id:
          $ref: '#/components/schemas/Identifier'
        input_snapshot_sha256:
          $ref: '#/components/schemas/NullableSha256'
        as_of_observed_at:
          $ref: '#/components/schemas/ObservationDateTimeString'
        generated_at:
          $ref: '#/components/schemas/DateTimeString'
        coverage:
          $ref: '#/components/schemas/Coverage'
        status:
          type: string
          const: stale
        reason:
          type: string
          const: artifact_stale
        freshness:
          type: string
          const: stale
      required:
        - scope
        - index_name
        - methodology_id
        - input_snapshot_sha256
        - as_of_observed_at
        - generated_at
        - coverage
        - status
        - reason
        - freshness
      additionalProperties: false
    PrimaryLanePublicationMetaNoPrint:
      type: object
      properties:
        scope:
          $ref: '#/components/schemas/PrimaryLaneScope'
        index_name:
          $ref: '#/components/schemas/IndexName'
        methodology_id:
          $ref: '#/components/schemas/Identifier'
        input_snapshot_sha256:
          $ref: '#/components/schemas/NullableSha256'
        as_of_observed_at:
          $ref: '#/components/schemas/ObservationDateTimeString'
        generated_at:
          $ref: '#/components/schemas/DateTimeString'
        coverage:
          $ref: '#/components/schemas/Coverage'
        status:
          type: string
          const: no_print
        reason:
          $ref: '#/components/schemas/NoPrintReason'
        freshness:
          $ref: '#/components/schemas/Freshness'
      required:
        - scope
        - index_name
        - methodology_id
        - input_snapshot_sha256
        - as_of_observed_at
        - generated_at
        - coverage
        - status
        - reason
        - freshness
      additionalProperties: false
    StandardRefusalError:
      type: object
      properties:
        code:
          $ref: '#/components/schemas/StandardRefusalCode'
        message:
          type: string
          minLength: 1
          pattern: \S
          maxLength: 256
      required:
        - code
        - message
      additionalProperties: false
    HistoryWindowExceededError:
      type: object
      properties:
        code:
          type: string
          const: history_window_exceeded
        message:
          type: string
          minLength: 1
          pattern: \S
          maxLength: 256
        details:
          type: object
          properties:
            history_window_days:
              type: integer
              exclusiveMinimum: 0
              maximum: 9007199254740991
          required:
            - history_window_days
          additionalProperties: false
      required:
        - code
        - message
        - details
      additionalProperties: false
    DateTimeString:
      type: string
      format: date-time
      pattern: >-
        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
    DisplayLabel:
      type: string
      minLength: 1
      pattern: \S
      maxLength: 128
    DateString:
      type: string
      format: date
      pattern: >-
        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
    HttpsUrl:
      type: string
      maxLength: 2048
      pattern: >-
        ^https:\/\/(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)(?:\.(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?))*(?:[/?#](?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?#]|%[A-Fa-f0-9]{2})*)?$
      description: An absolute `https:` URL.
    MinuteObservationCadence:
      type: string
      pattern: ^(?:[1-9]\d{0,2}|1[0-3]\d{2}|14[0-3]\d|1440)-minute$
    PrimaryLaneScope:
      type: string
      const: primary_lane
    NullableSha256:
      anyOf:
        - $ref: '#/components/schemas/Sha256'
        - type: 'null'
    ObservationDateTimeString:
      type: string
      allOf:
        - pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
        - pattern: ^\d{4}-\d{2}-\d{2}T(?:[01]\d|2[0-3]):[0-5]\d:00\.000Z$
      description: >-
        Observation time in UTC on the 15-minute grid, e.g.
        `2026-09-01T00:00:00.000Z`.
      format: date-time
    Coverage:
      type: object
      properties:
        n_sources:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        n_passing:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        frozen:
          $ref: '#/components/schemas/IdentifierSet'
        excluded:
          $ref: '#/components/schemas/IdentifierSet'
      required:
        - n_sources
        - n_passing
        - frozen
        - excluded
      additionalProperties: false
      description: >-
        Provider participation behind one observation. `n_passing` counts the
        providers that contributed to the value, so it is at most `n_sources`.
    NoPrintReason:
      type: string
      enum:
        - observation_missed
        - record_quarantined
        - insufficient_coverage
        - all_sources_filtered
        - no_eligible_sources
      description: Why an observation published no value.
    Freshness:
      type: string
      enum:
        - fresh
        - stale
      description: >-
        `stale` when the newest published observation is more than 4 publication
        intervals (60 minutes) old.
    StandardRefusalCode:
      type: string
      enum:
        - artifact_missing
        - artifact_digest_mismatch
        - artifact_path_violation
        - unknown_methodology
        - invalid_artifact
        - invalid_request
        - no_data
        - unknown_sku
        - rate_limited
        - upstream_unavailable
        - internal_error
    IdentifierSet:
      type: array
      items:
        $ref: '#/components/schemas/Identifier'
      uniqueItems: true
  examples:
    invalid_request:
      summary: '`invalid_request` error'
      value:
        error:
          code: invalid_request
          message: A parameter is malformed or over the limit.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    artifact_missing:
      summary: '`artifact_missing` error'
      value:
        error:
          code: artifact_missing
          message: The requested published data file is not available.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    rate_limited:
      summary: '`rate_limited` error'
      value:
        error:
          code: rate_limited
          message: The fair-use request limit has been reached.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    internal_error:
      summary: '`internal_error` error'
      value:
        error:
          code: internal_error
          message: The request could not be completed.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    artifact_digest_mismatch:
      summary: '`artifact_digest_mismatch` error'
      value:
        error:
          code: artifact_digest_mismatch
          message: The published data file failed its checksum check.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    artifact_path_violation:
      summary: '`artifact_path_violation` error'
      value:
        error:
          code: artifact_path_violation
          message: The published data file has an invalid path.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    invalid_artifact:
      summary: '`invalid_artifact` error'
      value:
        error:
          code: invalid_artifact
          message: The published data file could not be read as valid index data.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    unknown_methodology:
      summary: '`unknown_methodology` error'
      value:
        error:
          code: unknown_methodology
          message: >-
            The published data uses a methodology that is not available for this
            SKU.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com
    upstream_unavailable:
      summary: '`upstream_unavailable` error'
      value:
        error:
          code: upstream_unavailable
          message: The published data is temporarily unavailable.
        meta:
          scope: refusal
          index_name: Computable GPU Index
          methodology_id: null
          input_snapshot_sha256: null
          as_of_observed_at: null
          generated_at: '2026-08-27T07:52:16.640Z'
          status: null
          reason: null
          freshness: null
          coverage: null
        license:
          spdx: CC-BY-NC-4.0
          url: https://creativecommons.org/licenses/by-nc/4.0/
          attribution: Computable GPU Index by Computable — mcp.getcomputable.com

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.