---
title: "Full daily history for one instance type, all eras stitched."
method: GET
path: "/v1/spot/daily"
tags: ["spot"]
---

# Full daily history for one instance type, all eras stitched.

`GET /v1/spot/daily`

## Request

- Base URL: `https://cloud.trycorpus.ai`
- URL: `https://cloud.trycorpus.ai/v1/spot/daily`
- Auth: one of:
  - API key in header `PAYMENT-SIGNATURE`
  - API key in header `Authorization`
  - API key in header `X-Api-Key`

One row per UTC day from the earliest data for the type to now. Rows dated before the type's first raw event come from the legacy history (`source` = `pauley`: measured 2022-05 to 2024-01 AWS, open/high/low/close present on days the price moved; `titans`: daily average only, 2024 to 2026). Rows from `direct_from` on are time-weighted, zone-collapsed bars from the raw event store (`source` = `direct`, same method as /spot/hourly; `avg` equals the public dashboard value). open/high/low/close are null where the source only has an average.

## Query parameters

- `provider` 'aws' | 'gcp' | 'azure', required
- `region` string, required
- `instance` string, required
- `from` string, date-time
- `to` string, date-time

## Response `200`

Daily bars.

- DailyBars
  - `provider` string
  - `region` string
  - `instance` string
  - `zones` integer: Zone series collapsed in the `direct` rows.
  - `direct_from` string, date, nullable: First day served from the raw event store; earlier rows are legacy history. Null for a type with legacy history only.
  - `from` string, date-time
  - `to` string, date-time
  - `count` integer
  - `bars` object[]
    - `date` string, date, required: UTC day.
    - `open` number, nullable: Price at the start of the day (median across zones for `direct`); null when the source only has an average.
    - `high` number, nullable: Highest price of the day, any zone; null when unavailable.
    - `low` number, nullable: Lowest price of the day, any zone; null when unavailable.
    - `close` number, nullable: Price at the end of the day; null when unavailable.
    - `avg` number, required: Time-weighted (or, for titans, sampled) daily average, USD per hour. Equals the public dashboard value.
    - `dur` integer, nullable: Seconds of the day covered by known prices (`direct` rows only).
    - `source` 'direct' | 'titans' | 'pauley' | 'uscisi-adjusted' | 'archive', required: Where a row comes from; see `sources` in /catalog for the legend and standing of each.

## Other responses

- `400`: Invalid or missing parameter.
- `402`: Payment required. The x402 v2 payment requirements are in the PAYMENT-REQUIRED header (base64 JSON) and repeated as the JSON body: `accepts[]` lists every offer (USDC on 13 networks: eip155:8453, eip155:143, eip155:1, eip155:43114, eip155:42161, eip155:10, eip155:137, eip155:130, eip155:146, eip155:480, eip155:1329, eip155:999, eip155:5042) with amount and payTo address. Circle Gateway offers cover every listed network; a Coinbase-facilitated offer covers Base. The same response carries an MPP challenge (WWW-Authenticate: Payment, USDC on Tempo). Retry with a PAYMENT-SIGNATURE header or an MPP credential, or let an x402 or MPP client (for example `circle services pay` or `mppx`) handle it; a prepaid key in X-Api-Key is charged instead of a 402.
- `404`: Unknown provider, region or instance type.
- `503`: The store is still warming up after a restart; retry in a minute. No payment is taken.

---

[API](https://skmtc.dev/trycorpus/apis/corpusai-cloud-pricing-api.md) · [All operations](https://skmtc.dev/trycorpus/apis/corpusai-cloud-pricing-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trycorpus/apis/corpusai-cloud-pricing-api/revisions/cb0754f4d151?raw)
