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.
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
Each row includes source, is_forward_filled, and derived_symbols. Store those fields with the rates. They explain where an observation came from and whether a cross was calculated from other pairs.
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 full daily history to 1999. See pricing for current quotas and plan limits.