ECB Series
European Central Bank Data Portal series, retrieved by series key.
ecb_series — the dataset name to pass to the Obscura API.
What one row means
One ECB Data Portal SDMX observation for one configured series on one date: the fixed value of a named macro/FX series (e.g. the eur_usd daily reference rate) as of a single observation period, pulled from the keyless SDMX-JSON API at data-api.ecb.europa.eu/service/data/{flow}/{key}. Long format — one row per (series, date), not one row per series with wide date columns.
One row per (series, available_date).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For ecb_series: published: available_date = the SDMX TIME_PERIOD normalized to a date. This is sound ONLY for the EXR dataflow (the daily euro FX reference rates), where the period IS the same-day publication date, so the collector REFUSES any other flow (`tasks::ecb::ensure_supported_flow`). Every other ECB flow reports a reference PERIOD released weeks later — a monthly one would land the reference month here, 5-7 weeks before publication — and must get its own dataset with a declared ReleaseCalendar lag rather than a line in this one's series list.
Refresh cadence
Obscura refreshes ecb_series weekly — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 7 columns
The full public column list for ecb_series, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/ecb_series.
| Column | Type | Description |
|---|---|---|
| series | text · not null | Configured series label from EcbSeriesSpec.name, e.g. "eur_usd", "eur_gbp", "eur_jpy" (schedules/prod/macro_global.yaml). Primary-key part 1; the stable handle consumers query on — not an SDMX identifier itself, just the operator-chosen name for one flow+key pair. |
| available_date | date · not null | The SDMX TIME_PERIOD for this observation, normalized to a date (a month-only period like "2026-06" becomes the first of the month). Primary-key part 2. For the currently configured all-daily EXR series this equals both the FX fixing date and its public-availability date. |
| value | double precision | The observation's numeric value. For the configured EXR series this is the ECB reference exchange rate (foreign-currency-per-EUR). Nullable — an SDMX observation with an absent/non-numeric value still upserts. |
| flow_key | text | SDMX flow/key pair the row was pulled from, formatted "{flow}/{key}", e.g. "EXR/D.USD.EUR.SP00.A" — the source reference for re-deriving the exact ECB API endpoint queried. |
| obs_status | text | Per-observation SDMX OBS_STATUS code — the data-quality flag on this single observation: "A" Normal, "E" Estimated, "P" Provisional, "M" Missing, etc. Resolved from element [1] of the observation array (raw `attributes.observation[].OBS_STATUS`); NULL when the source omits the status attribute. Distinguishes a real vs. estimated `value`. |
| unit | text | Series-level SDMX UNIT — the unit of measure of `value` (e.g. "USD" for the configured EXR series; an index base, percent, or "EUR" for other macro flows). Raw `attributes.series[].UNIT`. Constant per series and carried onto every observation so a non-EXR value stays interpretable. |
| unit_mult | bigint | Series-level SDMX UNIT_MULT — the base-10 scale exponent applied to `value` (0 = units, 3 = thousands, 6 = millions). Raw `attributes.series[].UNIT_MULT`. Constant per series. NULL if absent. |
Access ecb_series
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="ecb_series",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the ecb_series dataset?
European Central Bank Data Portal series, retrieved by series key. One ECB Data Portal SDMX observation for one configured series on one date: the fixed value of a named macro/FX series (e.g. the eur_usd daily reference rate) as of a single observation period, pulled from the keyless SDMX-JSON API at data-api.ecb.europa.eu/service/data/{flow}/{key}. Long format — one row per (series, date), not one row per series with wide date columns.
How do I avoid look-ahead bias with ecb_series?
Filter on ecb_series.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = the SDMX TIME_PERIOD normalized to a date. This is sound ONLY for the EXR dataflow (the daily euro FX reference rates), where the period IS the same-day publication date, so the collector REFUSES any other flow (`tasks::ecb::ensure_supported_flow`). Every other ECB flow reports a reference PERIOD released weeks later — a monthly one would land the reference month here, 5-7 weeks before publication — and must get its own dataset with a declared ReleaseCalendar lag rather than a line in this one's series list. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get ecb_series?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="ecb_series". The column schema is public at https://api.obscura.trade/v1/catalog/ecb_series.
Can I filter ecb_series by company or symbol?
Yes. ecb_series carries series, the column the API's symbols filter resolves against.
How often is ecb_series updated?
Obscura refreshes ecb_series on a weekly schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.