---
title: "Timeseries Endpoint"
method: GET
path: "/v1/timeseries"
---

# Timeseries Endpoint

`GET /v1/timeseries`

## Request

- Base URL: `https://api.exchangerate.dev` (the document declares no server; this is the origin it was published from)
- URL: `https://api.exchangerate.dev/v1/timeseries`
- Auth: none declared

## Query parameters

- `symbols` string, nullable
- `interval` string, nullable
- `from` string, nullable
- `to` string, nullable
- `base` string, nullable
- `cursor` string, nullable
- `format` 'json' | 'csv' | 'parquet'

## Response `200`

Successful Response

- TimeseriesResponse
  - `result` string
  - `base` string, required
  - `symbols` string[], required
  - `interval` '1m' | '5m' | '15m' | '1h' | '4h' | '1d', required
  - `from` string, required
  - `to` string, required
  - `data` TimeseriesRow[], required
    - `timestamp` string, required
    - `effective_at` object, required
    - `rates` object, required
    - `source` 'live' | 'ecb_daily' | 'market_daily', required: Public `source` enum — wire contract (D2). NO `cached` value (cache lives in X-Cache). `ecb_daily` is the only reference source (October 2026). `market_daily` labels the stored daily close of the live market feed, for the currencies with no reference fix, in date history and 1d time series; it is never a live rate.
    - `source_type` 'market' | 'reference', required
    - `market_session` 'open' | 'weekend' | 'interbank_closed', required: Computed from a clock, no feed (D9). `interbank_closed` = a known non-weekend closure (e.g. an ECB/TARGET2 holiday detected via an empty Tier-C response — INGESTION §4).
    - `derived_symbols` string[], required
  - `next_cursor` string, nullable
  - `has_more` boolean
  - `notice` string, required

## Other responses

- `400`: Bad request. Codes include invalid_pair, unsupported_base, bad_date, invalid_amount, invalid_request, missing_parameter, unsupported_interval, unsupported_pair_interval and unsupported_index_interval.
- `401`: Authentication failed: invalid_api_key (or invalid_session_token on dashboard routes).
- `403`: plan_gated: the caller's plan does not include this interval or history depth; forbidden: the request did not pass through the public origin.
- `404`: Not found, e.g. unknown_index or no_data_for_date.
- `422`: Request validation failed.
- `429`: Rate limit or quota exceeded: rate_limited (per-minute limit, X-RateLimit-Scope tier-rate-minute), ip_rate_limited (keyless per-IP hourly cap, anon-ip-hour) or quota_exceeded (monthly quota, tier-quota-month). Wait Retry-After seconds; do not retry a monthly quota error automatically. quota_unavailable means the quota store could not be read; retry after Retry-After.
- `500`: The operation failed internally.
- `503`: A required data source or feature is temporarily unavailable, e.g. data_unavailable, live_unavailable, source_unavailable or service_unavailable.

## Changes

- **2026-10-09** `db0de0a0d416`: 1 warning, 4 info
  - added the new `market_daily` enum value to the `data/items/source` response property for the response status `200`
  - removed the `banxico_daily` enum value from the `data/items/source` response property for the response status `200`
  - removed the `dof_daily` enum value from the `data/items/source` response property for the response status `200`
  - removed the `fred_daily` enum value from the `data/items/source` response property for the response status `200`
  - …1 more
- **2026-09-14** `c6051bf62c95`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/exchangerate/apis/exchangerate-dev/changes/v1/timeseries/get.md)

---

[API](https://skmtc.dev/exchangerate/apis/exchangerate-dev.md) - [All operations](https://skmtc.dev/exchangerate/apis/exchangerate-dev/llms.txt) - [OpenAPI document](https://skmtc.dev/exchangerate/apis/exchangerate-dev/revisions/87db12560e4a?raw)
