> ## 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.

# Transaction Aggregates: Blends

> Returns privacy-safe blends of settled GPU transactions, paginated. Each row is a volume-weighted blend of settled transactions from the same (GPU model, region group, contract type, reserved tenor) bucket, adjacent by date. Only the volume-weighted price is published (no median/min/max), and rows are NOT additive: neighbouring rows can share underlying transactions, so never SUM `total_gpu_count` / `total_gpu_hours` across rows.

Privacy-safe blends of settled GPU transactions, paginated. Each row is a volume-weighted blend of settled transactions from the same **(GPU model, region group, contract type, reserved tenor)** bucket, adjacent by date.

<Info>
  Only the volume-weighted price is published. Rows are **not additive** — neighbouring rows can share underlying transactions, so never SUM `total_gpu_count` / `total_gpu_hours` across rows.
</Info>

## Example

```bash theme={null}
# First page of H100 reserved blends, US
curl -H "Authorization: Bearer $TOKEN" \
  "https://data-api.compute-index.com/v1/txn-aggregate?gpu_model=H100&contract_type=reserved&region_group=US&page=1&page_size=50"
```


## OpenAPI

````yaml pricing/openapi.json GET /v1/txn-aggregate
openapi: 3.1.0
info:
  title: GPU Pricing API
  description: |2-

        **GPU Pricing API** provides real-time and historical pricing data
        for GPU compute across 50+ cloud providers and GPU marketplaces.

        ## Features
        - Search current prices across vendors
        - Historical price trends
        - GPU transaction data
        - **Transaction Aggregates** — privacy-safe blends of settled GPU transactions
        - **Informational Price Index** — EWMA-smoothed composite indices by GPU family, region, and contract type
        - **Transaction Price Index** — smoothed indices derived from verified GPU transactions
        - **Custom Index** — EWMA-smoothed H100 sub-model indices by region, contract type, and vendor category
        - Global region coverage (US, EU, APAC)
        - GPU availability tracking
        - Scope-based API key access control

        ## Authentication
        Send your token as a Bearer token in the `Authorization` header on every request:
        ```
        Authorization: Bearer YOUR_TOKEN
        ```
        Example:
        ```bash
        curl -H "Authorization: Bearer $TOKEN" "https://data-api.compute-index.com/v1/vendors"
        ```
        Tokens are issued by Compute Index (david@compute-index.com); long-lived, treat as secrets.

        > The legacy `X-API-Key` header is deprecated — use the `Authorization: Bearer` header above.

        ## Rate Limits
        - **Free tier**: 10 requests/minute, 1,000/day
        - **Pro tier**: 100 requests/minute, 100,000/day
        - **Enterprise**: Custom limits

        Limits are per key, on fixed windows: the per-minute window resets at the top
        of each minute and the daily quota at 00:00 UTC.

        ## Data Coverage
        - 50+ vendors (AWS, Azure, GCP, Oracle, CoreWeave, Lambda, RunPod, Vast.AI, FluidStack, Vultr, etc.)
        - 30M+ historical pricing records
        - Updated multiple times daily

        ## Support
        - Support: david@compute-index.com
        
  contact:
    name: API Support
    email: david@compute-index.com
  license:
    name: Commercial License
    url: https://compute-desk.com/license
  version: 1.0.0
servers:
  - url: https://data-api.compute-index.com
security: []
paths:
  /v1/txn-aggregate:
    get:
      tags:
        - Transaction Aggregates
      summary: Get transaction blends
      description: >-
        Returns privacy-safe blends of settled GPU transactions, paginated. Each
        row is a volume-weighted blend of settled transactions from the same
        (GPU model, region group, contract type, reserved tenor) bucket,
        adjacent by date. Only the volume-weighted price is published (no
        median/min/max), and rows are NOT additive: neighbouring rows can share
        underlying transactions, so never SUM `total_gpu_count` /
        `total_gpu_hours` across rows.
      operationId: get_transaction_aggregates_v1_txn_aggregate_get
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            description: Page number (starts at 1)
            default: 1
            title: Page
          description: Page number (starts at 1)
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            maximum: 1000
            minimum: 1
            description: Items per page (max 1000)
            default: 100
            title: Page Size
          description: Items per page (max 1000)
        - name: gpu_model
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 'Filter by GPU model (comma-separated). Example: H100,H200'
            title: Gpu Model
          description: 'Filter by GPU model (comma-separated). Example: H100,H200'
        - name: gpu_canonical_name
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Filter by GPU canonical name (comma-separated). Example:
              nvidia-h100-sxm5-80gb
            title: Gpu Canonical Name
          description: >-
            Filter by GPU canonical name (comma-separated). Example:
            nvidia-h100-sxm5-80gb
        - name: region_group
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Filter by region group (comma-separated). Options: us, eu, apac,
              other
            title: Region Group
          description: >-
            Filter by region group (comma-separated). Options: us, eu, apac,
            other
        - name: contract_type
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Filter by contract type (comma-separated). Options: ondemand,
              spot, reserved
            title: Contract Type
          description: >-
            Filter by contract type (comma-separated). Options: ondemand, spot,
            reserved
        - name: start_date
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: 'null'
            description: Include transactions on/after this date (YYYY-MM-DD)
            title: Start Date
          description: Include transactions on/after this date (YYYY-MM-DD)
        - name: end_date
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: 'null'
            description: Include transactions on/before this date (YYYY-MM-DD)
            title: End Date
          description: Include transactions on/before this date (YYYY-MM-DD)
        - name: gpu_count_min
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: 'null'
            description: Filter txn rows by GPU quantity (pre-aggregation)
            title: Gpu Count Min
          description: Filter txn rows by GPU quantity (pre-aggregation)
        - name: gpu_count_max
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: 'null'
            description: Filter txn rows by GPU quantity (pre-aggregation)
            title: Gpu Count Max
          description: Filter txn rows by GPU quantity (pre-aggregation)
        - name: commitment_days_min
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
              - type: 'null'
            description: Filter txn rows by commitment days (pre-aggregation)
            title: Commitment Days Min
          description: Filter txn rows by commitment days (pre-aggregation)
        - name: commitment_days_max
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
              - type: 'null'
            description: Filter txn rows by commitment days (pre-aggregation)
            title: Commitment Days Max
          description: Filter txn rows by commitment days (pre-aggregation)
        - name: discount_percentage_min
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: 'null'
            description: >-
              Filter aggregate rows by volume-weighted discount percentage
              (post-aggregation)
            title: Discount Percentage Min
          description: >-
            Filter aggregate rows by volume-weighted discount percentage
            (post-aggregation)
        - name: discount_percentage_max
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: 'null'
            description: >-
              Filter aggregate rows by volume-weighted discount percentage
              (post-aggregation)
            title: Discount Percentage Max
          description: >-
            Filter aggregate rows by volume-weighted discount percentage
            (post-aggregation)
        - name: price_difference_min
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: 'null'
            description: >-
              Filter aggregate rows by reference_price - price
              (post-aggregation)
            title: Price Difference Min
          description: Filter aggregate rows by reference_price - price (post-aggregation)
        - name: price_difference_max
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: 'null'
            description: >-
              Filter aggregate rows by reference_price - price
              (post-aggregation)
            title: Price Difference Max
          description: Filter aggregate rows by reference_price - price (post-aggregation)
        - name: sort_by
          in: query
          required: false
          schema:
            type: string
            description: >-
              Sort field: transaction_date, price, gpu_count, tenor, gpu_model,
              contract_type, region
            default: transaction_date
            title: Sort By
          description: >-
            Sort field: transaction_date, price, gpu_count, tenor, gpu_model,
            contract_type, region
        - name: sort_order
          in: query
          required: false
          schema:
            type: string
            description: Sort order (asc or desc)
            default: desc
            title: Sort Order
          description: Sort order (asc or desc)
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionAggregateListResponse'
              example:
                data:
                  - blend_axis: null
                    blend_region_group: null
                    blend_tenor_days: null
                    contract_type: ondemand
                    discount_percentage: -17.7
                    gpu_canonical_name: nvidia-geforce-rtx-40-4090
                    gpu_model: '4090'
                    is_rolling: false
                    price: 0.45
                    region_group: us
                    tenor_days: null
                    total_gpu_count: 16
                    total_gpu_hours: 1344
                    transaction_date: '2026-07-20'
                  - blend_axis: null
                    blend_region_group: null
                    blend_tenor_days: null
                    contract_type: ondemand
                    discount_percentage: -13.8
                    gpu_canonical_name: nvidia-geforce-rtx-50-5090
                    gpu_model: '5090'
                    is_rolling: false
                    price: 0.55
                    region_group: us
                    tenor_days: null
                    total_gpu_count: 16
                    total_gpu_hours: 2688
                    transaction_date: '2026-07-20'
                filters:
                  commitment_days_max: null
                  commitment_days_min: null
                  contract_type: null
                  discount_percentage_max: null
                  discount_percentage_min: null
                  end_date: null
                  gpu_canonical_name: null
                  gpu_count_max: null
                  gpu_count_min: null
                  gpu_model: null
                  price_difference_max: null
                  price_difference_min: null
                  region_group: null
                  sort_by: transaction_date
                  sort_order: desc
                  start_date: null
                pagination:
                  has_next: true
                  has_previous: false
                  page: 1
                  page_size: 2
                  total_count: 973
                  total_pages: 487
        '401':
          description: Unauthorized — missing or invalid credentials
          content:
            application/json:
              schema:
                title: ErrorResponse
                type: object
                properties:
                  detail:
                    type: string
                required:
                  - detail
              examples:
                missing_credentials:
                  summary: No credentials supplied
                  value:
                    detail: >-
                      Authentication required. Provide an X-API-Key header or an
                      Authorization: Bearer token.
                invalid_token:
                  summary: Invalid or expired token
                  value:
                    detail: Invalid or expired token
        '403':
          description: Forbidden — key lacks the required scope
          content:
            application/json:
              schema:
                title: ErrorResponse
                type: object
                properties:
                  detail:
                    type: string
                required:
                  - detail
              examples:
                missing_scope:
                  summary: Key lacks the required scope
                  value:
                    detail: >-
                      Access denied. Your API key does not have permission to
                      access this resource.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: >-
            Too Many Requests — limit and reset are returned in X-RateLimit-*
            headers; the limit reflects your key's tier
          content:
            application/json:
              schema:
                title: ErrorResponse
                type: object
                properties:
                  detail:
                    type: string
                required:
                  - detail
              examples:
                minute_limit:
                  summary: Per-minute limit exceeded (figure reflects your key's tier)
                  value:
                    detail: 'Rate limit exceeded: 100 requests per minute'
      security:
        - HTTPBearer: []
components:
  schemas:
    TransactionAggregateListResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/TransactionAggregateResponse'
          type: array
          title: Data
        pagination:
          additionalProperties: true
          type: object
          title: Pagination
        filters:
          additionalProperties: true
          type: object
          title: Filters
      type: object
      required:
        - data
        - pagination
        - filters
      title: TransactionAggregateListResponse
      description: Paginated transaction-aggregate list
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    TransactionAggregateResponse:
      properties:
        gpu_model:
          type: string
          title: Gpu Model
          description: GPU model as displayed (e.g. H100, H200)
        gpu_canonical_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Gpu Canonical Name
          description: GPU canonical name
        region_group:
          type: string
          title: Region Group
          description: 'Region group: us, eu, apac, or other'
        contract_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Contract Type
          description: Contract type (ondemand, spot, reserved)
        tenor_days:
          anyOf:
            - type: integer
            - type: 'null'
          title: Tenor Days
          description: Reserved contract length in days; null for ondemand/spot
        price:
          type: number
          title: Price
          description: Volume-weighted mean $/GPU-hr across the underlying transactions
        total_gpu_count:
          type: number
          title: Total Gpu Count
          description: >-
            Combined GPU count of the underlying transactions; NOT additive
            across rows
        total_gpu_hours:
          anyOf:
            - type: number
            - type: 'null'
          title: Total Gpu Hours
          description: Combined GPU-hours; NOT additive across rows
        transaction_date:
          type: string
          format: date
          title: Transaction Date
          description: Date of the most recent underlying transaction (YYYY-MM-DD)
        discount_percentage:
          anyOf:
            - type: number
            - type: 'null'
          title: Discount Percentage
          description: Volume-weighted discount vs public reference price
        is_rolling:
          type: boolean
          title: Is Rolling
          description: >-
            True when this row shares an underlying transaction with the
            previous row
        blend_axis:
          anyOf:
            - type: string
            - type: 'null'
          title: Blend Axis
          description: >-
            Null when the row is blended entirely within its own bucket. For
            sparse buckets blended with the nearest neighbour bucket of the same
            GPU + contract: 'tenor' (blended with a different reserved term,
            region exact) or 'region' (blended with a different region, term
            exact)
        blend_tenor_days:
          anyOf:
            - type: integer
            - type: 'null'
          title: Blend Tenor Days
          description: Neighbour's tenor in days when blend_axis is 'tenor'
        blend_region_group:
          anyOf:
            - type: string
            - type: 'null'
          title: Blend Region Group
          description: Neighbour's region group when blend_axis is 'region'
      type: object
      required:
        - gpu_model
        - region_group
        - price
        - total_gpu_count
        - transaction_date
        - is_rolling
      title: TransactionAggregateResponse
      description: >-
        One transaction-aggregate row: a volume-weighted blend of settled txns

        from the same (gpu, region, contract_type, reserved-tenor) bucket,
        adjacent by date.


        Only the volume-weighted `price` is published. Rows are NOT additive —

        neighbouring rows can share underlying transactions — so callers must
        never

        SUM total_gpu_count / total_gpu_hours.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````