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

# Hardware Prices: As Of

> Prices to buy GPU hardware outright, from resale and reseller listings.

Returns the same view as `/latest`, as it stood at the moment you pass in `at`. Give it a date or a full timestamp; a plain date means the end of that day.

If nothing was published at that exact moment — a weekend, a holiday, a gap in a vendor's feed — you get the most recent value before it, rather than an empty response.

A date earlier than your licensed history is rejected rather than quietly moved forward, so you are never handed an answer to a different question.

<Note>
  **Needs historical access to this data**, which is granted separately from access to current
  values — so a token may be able to read today's figures but not last year's. How far back you
  can read is reported by [`/metadata`](/pricing/endpoint/gpu-hardware-prices-metadata) as
  `history_starts_at`.
</Note>

<Info>
  Results are paged. Follow `meta.next` until it is `null`, and send nothing alongside it — the
  link already carries your filters, dates and ordering. See
  [Paging](/pricing/concepts#paging).
</Info>

## Example

```bash theme={null}
curl -H "Authorization: Bearer $TOKEN" \
  "https://data-api.compute-index.com/v2/gpu/hardware/prices/as-of?at=2026-06-01T12:00:00Z&gpu_canonical_name=nvidia-h100-sxm5-80gb"
```


## OpenAPI

````yaml pricing/openapi.json GET /v2/gpu/hardware/prices/as-of
openapi: 3.1.0
info:
  title: GPU Pricing API (v2)
  description: >

    Pricing data for GPU compute — rental and purchase prices, settled

    transactions, published indices, and LLM inference prices.


    Every data type exposes the same four endpoints over one filter vocabulary,

    one response envelope and one error format, so learning one is learning all
    of

    them. **Start at `/metadata`**, which lists the values a type accepts and
    the

    range it holds.


    &lt;details>

    &lt;summary>&lt;strong>Endpoints&lt;/strong> — what the four paths
    return&lt;/summary>


    | path | returns |

    | --- | --- |

    | `/latest` | the current state, one row per thing |

    | `/as-of` | the state as it stood on a given date |

    | `/history` | rows over a time window |

    | `/metadata` | the type's own vocabulary — the valid filter values, and
    what it covers |


    Some types have fewer. Settled transactions are events, and "the current
    state

    of events" is not a question, so those types serve `/history` and
    `/metadata`

    and nothing else.


    &lt;/details>


    &lt;details>

    &lt;summary>&lt;strong>Responses and paging&lt;/strong> — the envelope, and
    how to get page two&lt;/summary>


    Every response is `&#123;"data": [...], "meta": &#123;...&#125;&#125;`.
    `data` is the rows; `meta`

    describes the request they answer — the sort applied, the window resolved,
    and

    the paging position.


    Nulls are always present. A null means the value is not published, which is

    different from zero and different from absent.


    `page_size` sets the rows per page (default 100, max 1000). Follow
    `meta.next`

    for the following page, and stop when it is null.


    `meta.next` is an object describing the following page three ways: `url` is
    an

    absolute URL ready to call, and `path` plus `query_params` are the same
    request

    split up for clients that build their own. Use whichever suits your HTTP
    layer.


    Each carries a `page_token`, and the token IS the request — it replays your

    filters, window and sort exactly — so a following page cannot silently
    change

    the question. There is nothing to merge in and nothing to add: do not
    construct

    or edit a token, and send no parameters beside it. There is no offset, and
    no

    total count.


    &lt;/details>


    &lt;details>

    &lt;summary>&lt;strong>Filtering, sorting and time&lt;/strong> — anchors,
    sort fields, UTC windows&lt;/summary>


    Filters are per type and listed on each operation. Values are exact matches

    unless the parameter says otherwise, and where a list is accepted it is

    comma-separated.


    **Some types require an anchor** — at least one filter that narrows the
    query,

    such as a vendor or a GPU. Asking for everything at once is rejected with a

    clear error naming the fields that qualify, and `/metadata` lists them.


    `sort_by` and `sort_order` control ordering, from that type's own set of

    sortable fields; `meta.sort` reports what was applied.


    All timestamps are UTC, ISO-8601. Windows are `start`/`end` and are
    half-open

    — `start` is included, `end` is not — so consecutive windows tile without

    double-counting a boundary row.


    &lt;/details>


    &lt;details>

    &lt;summary>&lt;strong>Access and errors&lt;/strong> — tokens, entitlements,
    rate limits&lt;/summary>


    Send a bearer token: `Authorization: Bearer &lt;token>`. Entitlements are
    per

    data type, so a token reaches the types it is granted and 403s on the rest.

    Rate limits are reported on every response in the `X-RateLimit-*` headers.


    Errors are RFC 9457 problem details, served as `application/problem+json`
    with

    `type`, `title`, `status` and `detail`.


    &lt;/details>
  contact:
    name: API Support
    email: david@compute-index.com
  version: 2.0.0
servers:
  - url: https://data-api.compute-index.com
security: []
tags:
  - name: GPU Rental Prices
    description: >-
      What it costs to rent GPU compute, as listed by the vendors themselves.
      One row is one vendor's price for one product.


      Prices are normalised so they compare across vendors: read
      `price_usd_per_gpu_hour`. `raw_price` and `raw_price_unit` keep whatever
      the vendor actually published, for when you need the original.


      A price that changes produces a new row rather than editing the old one,
      so `/history` reads as a list of changes and `/as-of` as a single state.


      Collection queries need an anchor — a vendor, a GPU, or another narrowing
      filter. `/metadata` lists which fields qualify here.
  - name: GPU Rental Aggregated Transactions
    description: >-
      Settled GPU deals published as blends rather than individually. Every row
      is a volume-weighted blend of at least two deals, so no single deal can be
      identified from it.


      `price` is the only price figure on a row: there is no median, range or
      spread to ask for.


      **Do not sum across rows.** Some rows share a deal with the row before
      them, so adding up `total_gpu_count` or `total_gpu_hours` will
      double-count. `is_rolling` marks those rows, and `blend_axis` names what
      was combined to make up the row.


      There is no `/latest` or `/as-of` — use `/history` with a window.
  - name: GPU Price Indexes
    description: >-
      Published GPU price indices — blended transaction indices at daily and
      30-minute resolution, by GPU family or by GPU, per region — and the GPU
      reference price, the fleet-weighted mean of the per-GPU indices.


      **One index per request.** Every data endpoint takes a required `id`;
      `/metadata` lists the ids you hold, and an id you do not hold returns 404.


      **Two row shapes, told apart by `type`.** A `daily` row's `timestamp` is a
      calendar date (`2026-09-02`); an `intraday` row's is the UTC instant its
      interval starts (`2026-09-02T10:00:00+00:00`). `/metadata` gives each
      index's `row_type`, so you know the shape before you ask. Sort by
      `timestamp` or `value`.


      `/metadata` says who computes each index. `p5` and `p95` bracket `value`
      where an envelope is published, and are null where it is not.
  - name: GPU Hardware Prices
    description: >-
      What it costs to buy GPU hardware outright, from resale, marketplace and
      reseller listings — the capex counterpart to rental prices. One row is one
      listing on one day it was seen.


      A listing that was not seen on a given day has no row for that day, so
      `/latest` returns each listing's most recent observation rather than a
      single snapshot. Check `last_observed` in `/metadata` before reading a
      product's price as current.


      **Seller identity is not published** — no platform, seller or listing URL,
      and none of them filterable. What you get instead is the classification a
      price needs to be read correctly: `market`, `channel`, `price_type`,
      `source_type`, `confidence` and `counterparty_class`. Check the
      `includes_*` fields too — a whole-chassis price and a bare-module price
      are not the same number.
  - name: LLM Token Prices
    description: >-
      Published prices for LLM inference, normalised to USD per 1M tokens so
      they compare across sources that quote per-token, per-1k and per-1M.


      **One model has many rows.** A row is identified by the whole combination
      of source, model, serving provider, price type, region, metric and
      qualifiers — input and output are priced separately, and the same model
      appears once per source and once per provider. Filtering to a model and
      expecting a single row will not work.


      Implausible prices are flagged rather than removed: `is_price_outlier`
      marks them and they are included by default, so a response is the data as
      recorded. Pass `exclude_outliers=true` to drop them.
paths:
  /v2/gpu/hardware/prices/as-of:
    get:
      tags:
        - GPU Hardware Prices
      summary: GPU Hardware Prices on a given date
      description: >-
        Prices to buy GPU hardware outright, from resale and reseller listings.


        Returns the same view as `/latest`, as it stood at the moment you pass
        in `at`. Give it a date or a full timestamp; a plain date means the end
        of that day.


        If nothing was published at that exact moment — a weekend, a holiday, a
        gap in a vendor's feed — you get the most recent value before it, rather
        than an empty response.


        A date earlier than your licensed history is rejected rather than
        quietly moved forward, so you are never handed an answer to a different
        question.
      operationId: as_of_gpu_hardware_prices_as_of_get
      parameters:
        - name: at
          in: query
          required: true
          schema:
            type: string
            description: >-
              Point in time (ISO 8601 datetime, UTC assumed if no offset) or a
              bare date. A bare date means the end of that day (23:59:59.999999
              UTC) — 'as of June 1st' includes June 1st. Returns the records
              that were valid at exactly the resolved instant.
            examples:
              - '2026-06-01T12:00:00Z'
              - '2026-06-01'
            title: At
          description: >-
            Point in time (ISO 8601 datetime, UTC assumed if no offset) or a
            bare date. A bare date means the end of that day (23:59:59.999999
            UTC) — 'as of June 1st' includes June 1st. Returns the records that
            were valid at exactly the resolved instant.
        - name: gpu_canonical_name
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Canonical GPU name, exact match — the catalog slug form.
              Comma-separated list accepted (max 20). Values are listed by the
              data type's `/metadata` endpoint.
            examples:
              - nvidia-h100-sxm5-80gb
            title: Gpu Canonical Name
          description: >-
            Canonical GPU name, exact match — the catalog slug form.
            Comma-separated list accepted (max 20). Values are listed by the
            data type's `/metadata` endpoint.
        - name: listing_key
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Listing identity, stable across scrapes: all observed days of one
              listing. Obtain it from a previous response — it is the natural
              anchor for a single listing's history.
            title: Listing Key
          description: >-
            Listing identity, stable across scrapes: all observed days of one
            listing. Obtain it from a previous response — it is the natural
            anchor for a single listing's history.
        - name: condition
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Unit condition, exact match. Comma-separated list accepted (max
              20). Example: `new_sealed,refurbished,used`
            title: Condition
          description: >-
            Unit condition, exact match. Comma-separated list accepted (max 20).
            Example: `new_sealed,refurbished,used`
        - name: market
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Market: `primary` (new channel) or `secondary` (resale).
              Comma-separated list accepted.
            title: Market
          description: >-
            Market: `primary` (new channel) or `secondary` (resale).
            Comma-separated list accepted.
        - name: channel
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Sales channel, exact match. Comma-separated list accepted.
              Example: `var_reseller,marketplace,broker,retailer`
            title: Channel
          description: >-
            Sales channel, exact match. Comma-separated list accepted. Example:
            `var_reseller,marketplace,broker,retailer`
        - name: transaction_level
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              What the price is for, exact match. Comma-separated list accepted.
              Example: `bare_module,server,rack`
            title: Transaction Level
          description: >-
            What the price is for, exact match. Comma-separated list accepted.
            Example: `bare_module,server,rack`
        - name: stock_status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Stock status, exact match. Comma-separated list accepted. Example:
              `in_stock`
            title: Stock Status
          description: >-
            Stock status, exact match. Comma-separated list accepted. Example:
            `in_stock`
        - name: country
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              ISO 3166 country code of the listing, exact match (case-sensitive,
              upper). Comma-separated list accepted. Null on rows whose source
              states no location.
            examples:
              - US
            title: Country
          description: >-
            ISO 3166 country code of the listing, exact match (case-sensitive,
            upper). Comma-separated list accepted. Null on rows whose source
            states no location.
        - name: country_group
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Coarse trading group, exact match. Comma-separated list accepted.
              Example: `north_america,europe,apac`
            title: Country Group
          description: >-
            Coarse trading group, exact match. Comma-separated list accepted.
            Example: `north_america,europe,apac`
        - name: min_price_usd
          in: query
          required: false
          schema:
            anyOf:
              - type: number
                minimum: 0
              - type: 'null'
            description: Only observations with price_usd >= this value (inclusive).
            title: Min Price Usd
          description: Only observations with price_usd >= this value (inclusive).
        - name: max_price_usd
          in: query
          required: false
          schema:
            anyOf:
              - type: number
                minimum: 0
              - type: 'null'
            description: Only observations with price_usd <= this value (inclusive).
            title: Max Price Usd
          description: Only observations with price_usd <= this value (inclusive).
        - name: sort_by
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Sort field. One of: condition, gpu_canonical_name, observed_date,
              price_usd. Default: `gpu_canonical_name`.
            title: Sort By
          description: >-
            Sort field. One of: condition, gpu_canonical_name, observed_date,
            price_usd. Default: `gpu_canonical_name`.
        - name: sort_order
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 'Sort direction: `asc` or `desc`. Default: `asc`.'
            title: Sort Order
          description: 'Sort direction: `asc` or `desc`. Default: `asc`.'
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            maximum: 1000
            minimum: 1
            description: Rows per page (max 1000).
            default: 100
            title: Page Size
          description: Rows per page (max 1000).
        - name: page_token
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Opaque token token from a previous response's `meta.next`. It
              carries the whole request — filters, ordering, window and position
              — so supply it alone; the only parameter that may accompany it is
              `page_size`. Do not construct or parse these; the format is not
              part of the contract.
            title: Page Token
          description: >-
            Opaque token token from a previous response's `meta.next`. It
            carries the whole request — filters, ordering, window and position —
            so supply it alone; the only parameter that may accompany it is
            `page_size`. Do not construct or parse these; the format is not part
            of the contract.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Page_HardwarePriceRow_AsOfMeta_'
        '401':
          description: Unauthorized — `code` is `unauthenticated`.
          content:
            application/problem+json:
              example:
                status: 401
                title: Unauthorized
                detail: Missing or invalid bearer token.
                code: unauthenticated
                request_id: 01JQ2X8N4T6V9WZ0ABCD
        '403':
          description: Forbidden — `code` is `insufficient_entitlement`.
          content:
            application/problem+json:
              example:
                status: 403
                title: Forbidden
                detail: The token does not carry the scopes this endpoint requires.
                code: insufficient_entitlement
                request_id: 01JQ2X8N4T6V9WZ0ABCD
        '404':
          description: Not Found — `code` is `not_found`.
          content:
            application/problem+json:
              example:
                status: 404
                title: Not Found
                detail: No such resource, or none you are entitled to see.
                code: not_found
                request_id: 01JQ2X8N4T6V9WZ0ABCD
        '422':
          description: Unprocessable Content — `code` is `validation_failed`.
          content:
            application/problem+json:
              example:
                status: 422
                title: Unprocessable Content
                detail: A parameter failed validation.
                code: validation_failed
                request_id: 01JQ2X8N4T6V9WZ0ABCD
        '429':
          description: Too Many Requests — `code` is `rate_limited`.
          content:
            application/problem+json:
              example:
                status: 429
                title: Too Many Requests
                detail: Rate limit exceeded; see the X-RateLimit-* headers.
                code: rate_limited
                request_id: 01JQ2X8N4T6V9WZ0ABCD
      security:
        - HTTPBearer: []
components:
  schemas:
    Page_HardwarePriceRow_AsOfMeta_:
      properties:
        data:
          items:
            $ref: '#/components/schemas/HardwarePriceRow'
          type: array
          title: Data
          description: The rows in this page, ordered as `meta.sort` reports.
        meta:
          $ref: '#/components/schemas/AsOfMeta'
      additionalProperties: false
      type: object
      required:
        - data
        - meta
      title: Page[HardwarePriceRow, AsOfMeta]
    HardwarePriceRow:
      properties:
        observation_id:
          type: string
          title: Observation Id
          description: >-
            `&#123;listing_key&#125;:&#123;observed_date&#125;` — one listing on
            one day.
        listing_key:
          type: string
          title: Listing Key
          description: Stable identity of the listing across the days it was observed.
        gpu_canonical_name:
          type: string
          title: Gpu Canonical Name
          description: Catalog GPU slug.
          examples:
            - nvidia-h100-sxm5-80gb
        observed_date:
          anyOf:
            - type: string
            - type: 'null'
          title: Observed Date
          description: The day this observation was made, ISO date.
        listing_last_updated_date:
          anyOf:
            - type: string
            - type: 'null'
          title: Listing Last Updated Date
          description: When the seller last touched the listing.
        price_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Price Amount
          description: The price as listed, in `currency`.
        currency:
          anyOf:
            - type: string
            - type: 'null'
          title: Currency
          examples:
            - USD
        price_usd:
          type: number
          title: Price Usd
          description: >-
            The price in USD, and the only price this type will order on.
            Non-null on every row served: `price_usd IS NOT null` is a base
            predicate, because an availability-only observation is not a price
            observation.
        price_usd_low:
          anyOf:
            - type: number
            - type: 'null'
          title: Price Usd Low
          description: Lower bound, where the listing gave a range.
        price_usd_high:
          anyOf:
            - type: number
            - type: 'null'
          title: Price Usd High
          description: Upper bound, where the listing gave a range.
        price_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Price Type
          description: Ask, sold, or estimate.
          examples:
            - ask
        price_per_gpu_system_attach:
          anyOf:
            - type: number
            - type: 'null'
          title: Price Per Gpu System Attach
          description: >-
            Price per GPU where the unit is a system, so a server and a module
            compare.
        price_basis:
          anyOf:
            - type: string
            - type: 'null'
          title: Price Basis
          description: What one priced unit IS.
          examples:
            - per_module
        taxes_included:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Taxes Included
          description: Whether the listed price includes tax.
        payment_terms:
          anyOf:
            - type: string
            - type: 'null'
          title: Payment Terms
          description: Terms the seller states.
        stock_status:
          anyOf:
            - type: string
            - type: 'null'
          title: Stock Status
          description: Availability as the listing states it.
          examples:
            - in_stock
        units_available:
          anyOf:
            - type: integer
            - type: 'null'
          title: Units Available
          description: Units the seller says they hold.
        min_order_quantity:
          anyOf:
            - type: integer
            - type: 'null'
          title: Min Order Quantity
          description: Smallest order the seller accepts.
        lead_time_weeks:
          anyOf:
            - type: number
            - type: 'null'
          title: Lead Time Weeks
          description: Quoted lead time in weeks.
        market:
          anyOf:
            - type: string
            - type: 'null'
          title: Market
          description: Which market this observation belongs to.
          examples:
            - secondary
        channel:
          anyOf:
            - type: string
            - type: 'null'
          title: Channel
          description: The channel class it was observed through.
        source_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Source Type
          description: The kind of source, never the source itself.
        confidence:
          anyOf:
            - type: string
            - type: 'null'
          title: Confidence
          description: How much weight to give this observation.
        counterparty_class:
          anyOf:
            - type: string
            - type: 'null'
          title: Counterparty Class
          description: >-
            The class of counterparty (dealer, OEM, end user) — never an
            identity.
        transaction_level:
          anyOf:
            - type: string
            - type: 'null'
          title: Transaction Level
          description: Where in the chain the price sits.
        gpu_count_in_unit:
          anyOf:
            - type: integer
            - type: 'null'
          title: Gpu Count In Unit
          description: GPUs in the priced unit.
          examples:
            - 8
        includes_host_cpus:
          anyOf:
            - type: integer
            - type: 'null'
          title: Includes Host Cpus
          description: How many host CPUs are in the price — a count, not a flag.
          examples:
            - 2
        includes_dram_gb:
          anyOf:
            - type: number
            - type: 'null'
          title: Includes Dram Gb
          description: System DRAM included, in GB.
        includes_storage_tb:
          anyOf:
            - type: number
            - type: 'null'
          title: Includes Storage Tb
          description: Storage included, in TB.
        includes_nics:
          anyOf:
            - type: string
            - type: 'null'
          title: Includes Nics
          description: Which NICs are included, as the listing describes them.
          examples:
            - 8x CX-7
        includes_nvswitch:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Includes Nvswitch
          description: Whether NVSwitch is included.
        includes_scaleout_fabric:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Includes Scaleout Fabric
          description: Whether scale-out fabric is included.
        includes_chassis_psu:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Includes Chassis Psu
          description: Whether chassis and PSUs are included.
        includes_cooling_hw:
          anyOf:
            - type: string
            - type: 'null'
          title: Includes Cooling Hw
          description: What cooling hardware is included, as described.
          examples:
            - liquid
        software_entitlements:
          anyOf:
            - type: string
            - type: 'null'
          title: Software Entitlements
          description: Software licences bundled with the unit.
        support_years:
          anyOf:
            - type: number
            - type: 'null'
          title: Support Years
          description: Years of support included.
        warranty_months:
          anyOf:
            - type: number
            - type: 'null'
          title: Warranty Months
          description: Warranty length included, in months.
        services_included:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Services Included
          description: Services bundled with the unit.
        condition:
          anyOf:
            - type: string
            - type: 'null'
          title: Condition
          description: New, refurbished, used.
          examples:
            - used
        module_packaging:
          anyOf:
            - type: string
            - type: 'null'
          title: Module Packaging
          description: How the GPU is packaged.
          examples:
            - SXM
        unit_age_months:
          anyOf:
            - type: number
            - type: 'null'
          title: Unit Age Months
          description: Age of the unit in months.
        unit_age_basis:
          anyOf:
            - type: string
            - type: 'null'
          title: Unit Age Basis
          description: How the age was established.
        warranty_remaining_months:
          anyOf:
            - type: number
            - type: 'null'
          title: Warranty Remaining Months
          description: Warranty remaining, in months.
        hours_used:
          anyOf:
            - type: number
            - type: 'null'
          title: Hours Used
          description: Reported hours on the unit.
        warranty_transferable:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Warranty Transferable
          description: Whether the warranty transfers to a buyer.
        firmware_region_lock:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Firmware Region Lock
          description: Whether the firmware is region-locked.
        country:
          anyOf:
            - type: string
            - type: 'null'
          title: Country
          description: >-
            ISO country the unit is located in. This is a country, not a cloud
            region — hardware listings are not filtered by `region`.
          examples:
            - US
        country_group:
          anyOf:
            - type: string
            - type: 'null'
          title: Country Group
          description: Coarse country grouping.
        export_control_regime:
          anyOf:
            - type: string
            - type: 'null'
          title: Export Control Regime
          description: Export-control regime governing the unit.
      additionalProperties: false
      type: object
      required:
        - observation_id
        - listing_key
        - gpu_canonical_name
        - observed_date
        - listing_last_updated_date
        - price_amount
        - currency
        - price_usd
        - price_usd_low
        - price_usd_high
        - price_type
        - price_per_gpu_system_attach
        - price_basis
        - taxes_included
        - payment_terms
        - stock_status
        - units_available
        - min_order_quantity
        - lead_time_weeks
        - market
        - channel
        - source_type
        - confidence
        - counterparty_class
        - transaction_level
        - gpu_count_in_unit
        - includes_host_cpus
        - includes_dram_gb
        - includes_storage_tb
        - includes_nics
        - includes_nvswitch
        - includes_scaleout_fabric
        - includes_chassis_psu
        - includes_cooling_hw
        - software_entitlements
        - support_years
        - warranty_months
        - services_included
        - condition
        - module_packaging
        - unit_age_months
        - unit_age_basis
        - warranty_remaining_months
        - hours_used
        - warranty_transferable
        - firmware_region_lock
        - country
        - country_group
        - export_control_regime
      title: HardwarePriceRow
      description: >-
        One listing, as seen on one day.


        A listing that was not seen on a given day has no row for that day, so

        `/as-of` returns each listing's most recent earlier observation rather
        than

        resolving one date across the whole response.


        Seller identity is not published: there is no platform, seller or
        listing

        URL on any endpoint, and none of them can be filtered on. What is
        published

        is the classification a price needs to be read correctly — `market`,

        `channel`, `price_type`, `source_type`, `confidence` and

        `counterparty_class`.


        The `includes_*` fields are what make prices comparable: a whole-chassis

        price and a bare-module price are not the same number, and these say
        which

        one you are looking at.
    AsOfMeta:
      properties:
        page_size:
          type: integer
          title: Page Size
          description: Rows requested per page.
          examples:
            - 100
        returned:
          type: integer
          title: Returned
          description: Rows in this page, which is `page_size` or fewer.
          examples:
            - 100
        has_more:
          type: boolean
          title: Has More
          description: Whether a further page exists.
        next:
          anyOf:
            - $ref: '#/components/schemas/NextPage'
            - type: 'null'
          description: >-
            How to fetch the following page, or null at the end of the walk. Use
            it exactly as given: it locks in every defaulted parameter — the
            window and the resolved ordering in particular — so later pages
            cannot drift against earlier ones. There is no `offset`, and nothing
            may be added to the request it describes.
        sort:
          $ref: '#/components/schemas/SortMeta'
        as_of:
          type: string
          title: As Of
          description: The instant the state was read at, normalised to a UTC instant.
          examples:
            - '2026-06-15T00:00:00+00:00'
      additionalProperties: false
      type: object
      required:
        - page_size
        - returned
        - has_more
        - next
        - sort
        - as_of
      title: AsOfMeta
      description: '`/as-of`, which additionally echoes the instant it resolved.'
    NextPage:
      properties:
        path:
          type: string
          title: Path
          description: Path to call, without an origin.
          examples:
            - /v2/gpu/rental/prices/history
        query_params:
          additionalProperties:
            type: string
          type: object
          title: Query Params
          description: >-
            The query parameters to send, unencoded. Always exactly the token
            and the page size — the token carries every filter, the window and
            the ordering, so nothing else may accompany it.
          examples:
            - page_size: '100'
              page_token: eyJkIjoicHJpY2VzIiwiZSI6Imhpc3RvcnkiLC4uLg.qgLm5w
        url:
          type: string
          title: Url
          description: The same request as an absolute URL, ready to call.
          examples:
            - >-
              https://data-api.compute-index.com/v2/gpu/rental/prices/history?page_token=eyJkIjoicHJpY2VzIiwiZSI6Imhpc3RvcnksLi4u.qgLm5w&page_size=100
      additionalProperties: false
      type: object
      required:
        - path
        - query_params
        - url
      title: NextPage
      description: >-
        Where to get the following page, given three ways.


        All three describe the same request, so use whichever suits your HTTP

        layer: `url` to call directly, `path` if you already hold a base URL,
        and

        `query_params` if you pass parameters as a mapping rather than building
        a

        query string.


        There is nothing to merge in and nothing to add: the page token carries
        the

        whole request — every filter, the window and the ordering — so this is
        the

        complete next call.
    SortMeta:
      properties:
        by:
          type: string
          title: By
          description: The field the rows are ordered by.
          examples:
            - valid_from
        order:
          type: string
          title: Order
          description: '`asc` or `desc`.'
          examples:
            - desc
      additionalProperties: false
      type: object
      required:
        - by
        - order
      title: SortMeta
      description: |-
        The ordering actually applied, echoed so a caller who sent no sort
        parameters can read what they got instead of inferring it from the docs.
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````