History API
Historical price data, OHLC candlesticks, and TradingView integration
Base URL
https://pyth.dourolabs.app/v1All {channel} path segments refer to a price channel (e.g. real_time, fixed_rate@200ms).
The /{channel}/... endpoints conform to the TradingView UDF
specification, allowing you to
connect TradingView charting UIs directly to this API.
API key required starting July 24, 2026
Starting July 24, 2026, GET /{channel}/price and GET /{channel}/history
require API-key authentication, and unauthenticated access to them will be
disabled. API-key auth is supported today, so add the
Authorization: Bearer <PRO_API_KEY> header now to stay forward-compatible.
See Authentication for the header format and frontend-safe
guidance. See the
announcement
for details.
Endpoints
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /live | No | Health check |
| GET | /symbols | No | List available symbols |
| GET | /{channel}/price | Yes (from July 24, 2026) | Price at a specific timestamp |
| GET | /{channel}/history | Yes (from July 24, 2026) | OHLC candlestick data |
| GET | /{channel}/search | No | Search symbols |
| GET | /{channel}/symbols | No | Resolve a single symbol |
| GET | /{channel}/streaming | No | SSE price stream |
| GET | /{channel}/config | No | TradingView configuration |
| GET | /publisher_updates | Yes | Raw publisher updates |
GET /symbols
List all available price feed symbols, optionally filtered.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | No | Text filter for symbol names |
asset_type | string | No | Filter by asset type: crypto, fx, equity, metal, rates, nav, commodity, funding-rate |
GET /{channel}/price
Returns price data at a specific historical timestamp.
Query Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
ids | number[] | Yes | Price feed IDs | 1,2 |
timestamp | number | Yes | Unix timestamp in microseconds | 1704067200000000 |
GET /{channel}/history
Returns OHLC candlestick data in TradingView format.
Query Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
symbol | string | Yes | Trading pair symbol (case-insensitive) | BTC/USD |
from | number | Yes | Start timestamp (Unix seconds) | 1704067200 |
to | number | Yes | End timestamp (Unix seconds) | 1704153600 |
resolution | string | Yes | Candle resolution (see below) | 60 |
Available Resolutions
| Resolution | Description |
|---|---|
1 | 1 minute |
2 | 2 minutes |
5 | 5 minutes |
15 | 15 minutes |
30 | 30 minutes |
60 | 1 hour |
120 | 2 hours |
240 | 4 hours |
360 | 6 hours |
720 | 12 hours |
D | 1 day |
W | 1 week |
M | 1 month |
Response Schema
| Field | Type | Description |
|---|---|---|
s | string | Status: ok or error |
t | number[] | Unix timestamps (seconds) |
o | number[] | Open prices |
h | number[] | High prices |
l | number[] | Low prices |
c | number[] | Close prices |
v | number[] | Volumes (if available) |
Arrays are aligned by index — t[0], o[0], h[0], l[0], c[0] represent the same candle.
GET /{channel}/search
Search for symbols by name and type.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Search text |
type | string | Yes | Asset type filter |
exchange | string | Yes | Exchange name (default: "PYTH") |
limit | number | Yes | Max results (default: 15) |
GET /{channel}/symbols
Resolve a single symbol to its full configuration.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Symbol name (case-insensitive) |
GET /{channel}/streaming
Server-sent events (SSE) stream of live price updates.
GET /{channel}/config
Returns TradingView-compatible configuration including supported resolutions and data capabilities.
GET /publisher_updates
Returns raw publisher price updates. Requires authentication.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
price_feed_id | number[] | No | Filter by price feed IDs |
min_timestamp | string | No | ISO 8601 start time (default: 7 days ago) |
max_timestamp | string | No | ISO 8601 end time |
sort | string | Yes | "Ascending" or "Descending" |
limit | number | No | Max results, 1–10000 (default: 15) |
Authentication
Starting July 24, 2026, GET /{channel}/price and GET /{channel}/history
require API-key authentication, and unauthenticated access to them will be
disabled. Pass your Pro API key as a bearer token:
curl -H "Authorization: Bearer $PRO_API_KEY" \
"https://pyth.dourolabs.app/v1/fixed_rate@200ms/price?ids=1×tamp=1704067200000000"Do not embed your Pro API key in frontend or browser applications. The key
must stay server-side. Route requests through your own backend, which injects
the Authorization header before forwarding to this API. A client-safe JWT
authentication option is available for teams that do not want to run their own
proxy.
See Acquire an API Key to obtain a key.
JWT Authentication
While routing requests through your own backend is the preferred approach, a JWT-based solution is also available. To use this option:
- A browser client needs to ask its backend for a JWT.
- If the client backend doesn't already have a valid JWT cached, it calls
POST /auth/token, using its actual (secret) API key. - The backend returns this JWT to the frontend.
- The frontend uses this JWT as a bearer token (i.e., as an
Authorization: Bearer ...header, just like backend clients do with API keys) to perform authenticated calls to the Pyth API service.
Note that JWT tokens are short-lived. Clients should inspect the token's expiration time and periodically refresh their tokens.
Backends should protect their own token-providing endpoint against abuse, e.g. by requiring their own authentication or with rate limits. API usage via JWTs counts against the usage limit of the API key used to mint the JWT.
See /auth/token for details on how to call the mint token endpoint.
OpenAPI Schema
The full OpenAPI specification is available at:
Related
- Examples Repository
- Price Feed IDs - Symbol to ID mapping