DocsETFs

ETFs REST endpoints

Indicative ETF reference instruments under /etfs: discovery, quotes, last trade, snapshots, and aggregates.

Authx-api-key headerBase path/etfsWebSocketetfs.quotes, etfs.tradesSymbol formatProduct codes (e.g. US500ETF, US100ETF, USBOND)
ETF endpoints provide indicative reference pricing for analytics, display, and operational tooling. /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).

GET/etfs/symbols

ETFs symbol list

Curated ETF-style symbols available on the REST API.

curl -sS "https://api.tickerlayer.com/etfs/symbols" \
  -H "x-api-key: <YOUR_API_KEY>"

Response 200 OK

JSON
{
  "symbols": [
    { "symbol": "US100ETF", "name": "US growth 100" },
    { "symbol": "US500ETF", "name": "US 500" }
  ]
}
GET/etfs/quote/:symbol

Latest quote

Consolidated bid/ask and timestamp from the REST quote path.

ParameterTypeDescription
symbolreqstringEnabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols.
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

JSON
{
  "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.
GET/etfs/trade/last/:symbol

Last trade

Latest trade-style print for the ETF. size may be null. Also available under /v1/etfs/trade/last/:symbol.

ParameterTypeDescription
symbolreqstringEnabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols.
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

JSON
{
  "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.
GET/etfs/snapshot/:symbol

Market snapshot

Combined bid/ask, last reference level, previous daily close, and change metrics.

ParameterTypeDescription
symbolreqstringEnabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols.
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

JSON
{
  "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.
GET/etfs/agg/:symbol/prev

Previous completed daily bar

Most recent fully completed daily OHLCV bar in UTC (previous session close).

ParameterTypeDescription
symbolreqstringEnabled ETF-style symbol (e.g. US500ETF, US100ETF). Generic product codes only—trimmed and uppercased before lookup. Full list: GET /etfs/symbols.
ParameterTypeDescription
intervalstringOptional. 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.
curl -sS "https://api.tickerlayer.com/etfs/agg/US500ETF/prev" \
  -H "x-api-key: <YOUR_API_KEY>"

Response 200 OK

JSON
{
  "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.
GET/etfs/agg/:symbol/:multiplier/:timespan/:from/:to

Aggregates — OHLCV range

Historical bars between two UTC calendar dates. Same interval rules and pagination as other asset classes.

ParameterTypeDescription
symbolreqstringEnabled public symbol for the asset: crypto pairs like BTCUSD; stocks use CC:SYMBOL (e.g. US:AAPL). Trimmed before lookup.
multiplierreqnumberInterval multiplier. Valid pairs: 1, 5, 15 with minute; 1, 4 with hour; 1 with day.
timespanreqstringminute · hour · day — case-insensitive. Other values return 400.
fromreqstringUTC date start, inclusive. Format: YYYY-MM-DD.
toreqstringUTC date end, inclusive. Format: YYYY-MM-DD. Must be ≥ from.
ParameterTypeDescription
limitnumberPage size. Default 500, max 5000.
offsetnumberZero-based row offset applied after sort. Default 0.
sortstringSort bars by timestamp t before pagination. asc or desc (default desc).
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

JSON
{
  "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
}
  • v may 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.

Connect
wss://stream.tickerlayer.com/?apiKey=<YOUR_API_KEY>

Available channels

Quotesetfs.quotesTradesetfs.trades

Subscribe example

After the connection is ready, send a JSON text frame:

Subscribe
{
  "action": "subscribe",
  "channels": [
    "etfs.quotes",
    "etfs.trades"
  ],
  "symbols": [
    "US500ETF",
    "US100ETF"
  ]
}

Example message

etfs.quotes
{
  "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.