Fx Get Timeseries
fx_get_timeseriesGet historical daily exchange rates for a currency pair over a date range. ECB publishes on business days only — weekends and holidays produce no entry, and no date outside the requested range is ever returned, so a range covering only non-publication days comes back with an empty rates map and a notice explaining why. A same-currency pair returns a rate of 1 on each publication day in the range. Short ranges (≤90 days by default) are returned inline as a date→rate map. When DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) long ranges spill to it: the response carries spilled=true, a canvas_id, and a table_name — call fx_dataframe_describe to inspect the staged table, then fx_dataframe_query to run SQL against it. Without DataCanvas long ranges stay inline (spilled=false) and the notice says so.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | ISO 8601 end date (YYYY-MM-DD). Must be >= start_date. Future dates are not supported. | |
| canvas_id | No | Optional canvas ID from a prior call. Omit on the first call to start a fresh canvas; pass the returned canvas_id to append tables to an existing canvas. | |
| start_date | Yes | ISO 8601 start date (YYYY-MM-DD). ECB data starts 1999-01-04. The actual first data point may be later if start_date falls on a weekend/holiday. | |
| base_currency | Yes | ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes. | |
| quote_currency | Yes | ISO 4217 quote currency code (e.g. EUR). Call fx_list_currencies to get valid codes. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| error | No | Present when the call failed. Absent on success. | |
| rates | No | Date → rate map for the inline result. Publication days inside the requested range only. Truncated to a preview when the result was spilled to canvas; empty when the range contains no publication day at all. | |
| notice | No | Explains a result that would otherwise look broken — an empty series, or a long range that stayed inline because DataCanvas is not configured. | |
| source | No | Always "ECB via Frankfurter" — the upstream data provider. | |
| spilled | No | True when the full result was staged on the DataCanvas (range exceeded threshold). | |
| end_date | No | Last date in the returned series. Always inside the requested range — earlier than the requested end when that day had no ECB fix, and equal to it when the series is empty. | |
| canvas_id | No | Canvas ID — present when spilled is true. Pass to fx_dataframe_query. | |
| rate_type | No | Always "ECB reference (mid-market)" — these are reference rates, not tradeable bid/ask. | |
| rate_count | No | Total number of data points (publication days) inside the requested range. | |
| start_date | No | First date in the returned series. Always inside the requested range — later than the requested start when that day had no ECB fix, and equal to it when the series is empty. | |
| table_name | No | Canvas table name — present when spilled is true. Use in fx_dataframe_query SQL. | |
| base_currency | No | Base currency code. | |
| quote_currency | No | Quote currency code. |