Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.
/api/v1/rates/{id}/pricesGET
Get historical rate values with OHLC
Authorization
bearerAuth *Bearer <token>
Clerk session JWT, or an API key (the ak_ prefix), sent as a Bearer token or an ?api_key= query parameter. Each endpoint requires the read scope for its resource (e.g. org:rates:read for rates). Token in: header
Query Parameters
per_page?integer
Points per page (1-1000). Combine with page to walk the series.
Default: 100Min: 1Max: 1000
start?string (date-time)
Start time
end?string (date-time)
End time
interval?"1min" | "5min" | "1hour" | "1d"
Time bucket interval (daily, 1day also accepted as aliases for 1d)
Default: "5min"
order?"asc" | "desc"
Sort direction by timestamp
Default: "desc"
page?integer
1-based page number. The window is taken from the most recent points, so page 2 is the next-older block.
Default: 1Min: 1
sources?boolean
Include source components in each price point
Default: true
Response
200 · Paginated price history
data?object[]
Show item properties
timestamp?string (date-time)
Start of the aggregation bucket this point covers, in UTC. Daily buckets are anchored to midnight US Eastern, so a 1d point's timestamp is 04:00 or 05:00 UTC depending on daylight saving.
price?number
Value of the series for this bucket: the last price recorded within it. Equals ohlc.close on the same point where OHLC is returned, and is the same statistic the previous_close_* baselines are measured against. The scale is 0-100 for market and rate series, and the index level (roughly 50-150) for index series.
price_raw?numbernull
Not currently reachable on any tier, and always absent. The unsmoothed value exists only on the un-bucketed series, but every accepted interval (and the default) maps to a bucketed one, so no request can return it.
volume?numbernull
Not currently populated on any price series, on any tier, and always absent. Reserved: use the market volume fields for traded volume.
ohlc?object | null
Open, high, low and close for the bucket, on the same 0-100 scale as price. Returned on the market and rate price series only (index series omit it), and on a daily series a gap-filled day repeats the previous day's values rather than reporting new trading.
spread?numbernull
Dispersion across the source markets behind a reference-rate value: the highest source price minus the lowest, in the same 0-100 points as price. Meaningful only on rate series, and currently not populated on any price-series response, so it is always absent.
sources?objectnull
Provenance for a reference-rate value: the blending method used, plus the per-source prices and weights behind it. Currently not populated on any price-series response, so it is always absent; use constituents for the per-source breakdown.
constituents?arraynull
The source markets behind a reference-rate value at this timestamp, each with its probability (0-100) and its weight renormalized to sum to 1 across the markets listed. Returned on the authenticated rate price series only, covering markets that were active at the timestamp and traded in that bucket; pass sources=false to omit it.
meta?object
Show properties
total?integer
Total number of records matching the request across every page, not just the number returned in this one.
page?integer
The 1-based page number this response covers.
per_page?integer
Maximum number of items on a page. The last page may hold fewer.
total_pages?integer
Number of pages available at this per_page. It is at least 1, even when nothing matched.
has_next?boolean
True when a page exists after this one.
has_prev?boolean
True when this is not the first page.
403 · The organization has no paid plan, so the realtime read scopes are refused. Distinct from a 429, which means a plan's budget ran out: nothing here resets on a timer, and the request succeeds only once the organization holds a plan.
error *string
Human-readable reason the request was refused.
status *integer
HTTP status code, repeated in the body.
upgrade_url?string (uri)
Page listing the plans and their request allowances, for buying access. Absent when no plan is available for purchase.
429 · The paid organization's minute or UTC-day request budget is exhausted.
error *"rate_limited"
Always rate_limited. Branch on this to detect a throttled request.
limit *"rpm" | "daily"
Which limit was hit: rpm for the per-minute cap or daily for the daily one.
message *string
Human-readable explanation naming the limit that was exceeded.
upgrade_url?string (uri)
Page listing the plans and their request allowances, for buying a larger budget. Absent when no plan is available for purchase.
Request example
curl -X GET "https://api.dev.adjacent.markets/api/v1/rates/<id>/prices" \ -H "Authorization: Bearer <token>"
Response example
{ "data": [ { "timestamp": "2026-06-20T19:00:00Z", "price": 77.5 }, { "timestamp": "2026-06-20T18:00:00Z", "price": 77.2 } ], "meta": { "total": 420, "page": 1, "per_page": 100, "total_pages": 5, "has_next": true, "has_prev": false } }