One historical date
Put the date and base currency in the path. The symbols filter is optional; without it, the response includes every supported quote currency.
If the requested date is a weekend or market holiday, the endpoint carries forward the most recent published fix and sets is_forward_filled to true. It never invents a rate.
Pull a date range
The range endpoint needs symbols, start_date, and end_date. The base defaults to USD.
- JSON returns up to 366 business-day rows at a time.
- When
has_moreis true, passnext_cursorback as the next request'scursor. - A single request can span up to 1,830 days, roughly five years.
- Range rows are published business-day observations; weekends and other non-publication dates are not inserted.
Pull intraday observations
For a recorded response and plan overview, start with the intraday exchange rate API guide.
Use /v1/timeseries for 1-minute through 4-hour market observations. Use its 1d interval when you want the same daily reference history served by the existing daily endpoints.
Market collection began on 2026-09-14; this example uses a populated window from that day. The retention periods below describe how long collected rows are kept, not how far back every pair is already populated. The current open bucket can change.
1mobservations are retained for 30 days.5m,15m,1h, and4hare retained without a scheduled expiry.1dremains the existing daily reference series.- Intraday gaps remain gaps; weekends and market closures do not create synthetic rows.
- Derived crosses require real closing ticks on both USD legs within the same interval bucket and no more than five seconds apart. These are approximate rate observations, not simultaneous quotes or cross OHLC.
effective_atgives the older contributing source timestamp, preserving fractional seconds. Candle backfills have null observation times and cannot establish cross observations.- Supported windows with no observations return HTTP 200 with
data: [],has_more: falseandnext_cursor: null. An unknown interval returns HTTP 400unsupported_interval. - Coverage depends on the pair and interval. Requests containing unsupported pairs are rejected in full with
unsupported_pair_intervaland a rejected pair list. See the pair and interval coverage table.
For ongoing live updates after a historical query, see the WebSocket integration guide. WebSocket coverage is narrower than the daily reference catalog and requires an API key.
Download CSV or Parquet
Add format=csv or format=parquet. Exports return the full requested window as one file, so they do not use the JSON cursor.
Weekends and missing observations
A one-date request for a weekend or market holiday returns the most recently published fix with is_forward_filled set to true. A range does not manufacture rows for those dates; it contains published business-day observations only. Treat a forward-filled value as the prior observation, not a new market event.
Provenance and derived rates
Daily range rows include source, is_forward_filled, and derived_symbols. Time-series rows include timestamp, source_type, market_session, and derived_symbols. Store those fields with the rates.
Avoid look-ahead bias in backtests
For a worked Python example, read Historical FX time series in Python.
Limits and pricing
The date and range endpoints use the same request quota as the rest of the API. A CSV or Parquet range export counts as one call, and all plans include the range endpoint and pair-specific daily reference history, beginning in 1999 where observations exist. See pricing for current quotas and plan limits.