ETFs REST endpoints
Indicative ETF reference instruments under /etfs: discovery, quotes, last trade, snapshots, and aggregates.
/etfs and /v1/etfs are equivalent mounts, and responses follow the same core REST schema as other asset classes. For coverage and behavior at a product level, see ETFs product docs (same contract).Symbol coverage
Examples include US500ETF, US100ETF, USBOND, USGOLD, and WORLDETF. Use GET /etfs/symbols for the full set enabled for your key (see Symbols → ETFs).
/etfs/symbolsETFs symbol list
Curated ETF-style symbols available on the REST API.
Request
curl -sS "https://api.tickerlayer.com/etfs/symbols" \
-H "x-api-key: <YOUR_API_KEY>"Response 200 OK
{
"symbols": [
{ "symbol": "US100ETF", "name": "US growth 100" },
{ "symbol": "US500ETF", "name": "US 500" }
]
}/etfs/quote/:symbolLatest quote
Consolidated bid/ask and timestamp from the REST quote path.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| symbolreq | string | Enabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols. |
Request
curl -sS "https://api.tickerlayer.com/etfs/quote/US500ETF" \
-H "x-api-key: <YOUR_API_KEY>"Send runs against the live API with your account key (never exposed in the browser).
Response 200 OK
{
"symbol": "US500ETF",
"bid": 718.65997,
"ask": 718.65997,
"bid_size": 90,
"ask_size": 40,
"timestamp": 1777555800000
}404 unknown symbol if the code is not enabled. 404 no quote available when no consolidated quote can be resolved. Outside the US regular session (09:30 to 16:00 ET) a quote is published only while its spread stays within 0.5% of the mid; wider pre-market and after-hours books are held back and the last regular-session quote remains the served value. Build candles from trades rather than from quotes./etfs/trade/last/:symbolLast trade
Latest trade-style print for the ETF. size may be null. Also available under /v1/etfs/trade/last/:symbol.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| symbolreq | string | Enabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols. |
Request
curl -sS "https://api.tickerlayer.com/etfs/trade/last/US500ETF" \
-H "x-api-key: <YOUR_API_KEY>"Send runs against the live API with your account key (never exposed in the browser).
Response 200 OK
{
"symbol": "US500ETF",
"price": 718.66,
"size": 90,
"timestamp": 1777555800000
}404 unknown symbol if not enabled. 404 symbol not available or 503 market data temporarily unavailable when no trade-style value can be resolved yet./etfs/snapshot/:symbolMarket snapshot
Combined bid/ask, last reference level, previous daily close, and change metrics.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| symbolreq | string | Enabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols. |
Request
curl -sS "https://api.tickerlayer.com/etfs/snapshot/US100ETF" \
-H "x-api-key: <YOUR_API_KEY>"Send runs against the live API with your account key (never exposed in the browser).
Response 200 OK
{
"symbol": "US100ETF",
"bid": 528.90,
"ask": 528.90,
"bid_size": 39,
"ask_size": 85,
"last_price": 528.90,
"last_timestamp": 1743512400000,
"prev_close": 525.00,
"change": 3.90,
"change_percent": 0.7429
}change_percent is null when prev_close is zero or unavailable. Responses do not include last_size./etfs/agg/:symbol/prevPrevious completed daily bar
Most recent fully completed daily OHLCV bar in UTC (previous session close).
Path parameters
| Parameter | Type | Description |
|---|---|---|
| symbolreq | string | Enabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols. |
Query parameters
| Parameter | Type | Description |
|---|---|---|
| interval | string | Optional. 1m · 5m · 15m · 1h · 4h · 1d. Returns the most recently settled bar at that interval instead of the previous daily bar, and adds interval, bar_start, bar_end and as_of to the response. Omit for the daily bar. |
Request
curl -sS "https://api.tickerlayer.com/etfs/agg/US500ETF/prev" \
-H "x-api-key: <YOUR_API_KEY>"Response 200 OK
{
"symbol": "US500ETF",
"result": {
"o": 610.0,
"h": 614.0,
"l": 608.0,
"c": 612.0,
"v": 82000000,
"t": 1732924800000
}
}404 no bar available when no completed daily bar can be resolved. With ?interval= the response is the most recently settled bar at that interval. The bar is held for a short settle lag after it closes, so the boundary sits away from the round minute and small clock differences between callers do not change which bar comes back. It is the same bar the historical range endpoint returns for that window, so an audit can re-fetch that exact window and compare against the same source. The response then also carries interval, bar_start, bar_end and as_of, and Cache-Control plus ETag mark exactly when the value can next change. While the market is closed the last real bar is returned, still labelled with its own bar_start./etfs/agg/:symbol/:multiplier/:timespan/:from/:toAggregates — OHLCV range
Historical bars between two UTC calendar dates. Same interval rules and pagination as other asset classes.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| symbolreq | string | Enabled public symbol for the asset: crypto pairs like BTCUSD; stocks use CC:SYMBOL (e.g. US:AAPL). Trimmed before lookup. |
| multiplierreq | number | Interval multiplier. Valid pairs: 1, 5, 15 with minute; 1, 4 with hour; 1 with day. |
| timespanreq | string | minute · hour · day — case-insensitive. Other values return 400. |
| fromreq | string | UTC date start, inclusive. Format: YYYY-MM-DD. |
| toreq | string | UTC date end, inclusive. Format: YYYY-MM-DD. Must be ≥ from. |
Query parameters
| Parameter | Type | Description |
|---|---|---|
| limit | number | Page size. Default 500, max 5000. |
| offset | number | Zero-based row offset applied after sort. Default 0. |
| sort | string | Sort bars by timestamp t before pagination. asc or desc (default desc). |
Request
curl -sS "https://api.tickerlayer.com/etfs/agg/US100ETF/1/day/2025-11-01/2025-11-30?sort=desc&limit=2" \
-H "x-api-key: <YOUR_API_KEY>"Response 200 OK
{
"symbol": "US100ETF",
"results_count": 2,
"results": [
{ "o": 520.0, "h": 525.0, "l": 518.0, "c": 523.0, "v": 1200000, "t": 1733011200000 },
{ "o": 518.0, "h": 522.0, "l": 516.0, "c": 520.0, "v": 980000, "t": 1732924800000 }
],
"next_offset": 2
}vmay be null when no consolidated volume exists for that interval.- Same supported intervals and max calendar windows as stocks aggregates.
WebSocket Streaming
Stream live quotes and trades for this asset class over the public WebSocket.
wss://stream.tickerlayer.com/?apiKey=<YOUR_API_KEY>Available channels
Subscribe example
After the connection is ready, send a JSON text frame:
{
"action": "subscribe",
"channels": [
"etfs.quotes",
"etfs.trades"
],
"symbols": [
"US500ETF",
"US100ETF"
]
}Example message
{
"type": "quote",
"channel": "etfs.quotes",
"asset": "etfs",
"symbol": "US500ETF",
"bid": 718.6,
"ask": 718.72,
"bid_size": 40,
"ask_size": 55,
"ts": 1743512400000,
"timestamp": 1743512400000
}General WebSocket documentation
For authentication, subscribe/unsubscribe lifecycle, errors, limits, and heartbeats, see the WebSocket overview and Subscriptions.