apyhub
Back

ECB Exchange Rates API

What it does

ECB Exchange Rates API gives you foreign exchange reference data from the European Central Bank (ECB): the official daily rates it publishes, plus fixed-parity rates for currencies that don't have an ECB rate. It covers the latest rates, any specific day back to 4 January 1999, and a day-by-day series across a date range of up to 366 days, along with a reference list of every currency it tracks.

You choose a base currency (the default is EUR) and, optionally, which currencies you want rates for. For a single day's rate, if that exact day had no publication (a weekend or TARGET holiday), the response automatically falls back to the last published day before it and tells you the date you originally asked for. For a date range, days without a publication are simply left out of the results, along with a count of how many publication days actually fall in that range. Every rate response also tells you which of the returned currencies are pegged, meaning their rate comes from a fixed official parity instead of an ECB rate, plus a source note and a usage notice. Retired currencies still return rates for the years they were in use. You can also look up the full list of tracked currencies to check which ones are currently active, which have been retired, and which are pegged, before requesting them.

The ECB publishes its rates around 16:00 CET on TARGET business days. ECB Exchange Rates API is a good fit for finance systems, currency converters, market data dashboards, and reporting jobs that need a lightweight FX reference feed (latest, historical, or ranged) without trading-grade execution data.

▣ ENDPOINT 01 / 04
GET
List currencies
https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/currencies

QUICKSTART

GUIDE

Quickstart

Fetch the latest list of currencies supported by the API.

curl -X GET "https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/currencies" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with count as an integer, latest as a date string, and currencies as an array of currency objects.

Each currency object includes code, name, kind, first_date, last_date, and current, with optional parity when applicable.

{
  "count": 66,
  "latest": "2026-10-06",
  "currencies": [
    {
      "code": "AED",
      "name": "UAE dirham",
      "kind": "peg",
      "first_date": "1999-01-04",
      "last_date": "2026-10-06",
      "current": true,
      "parity": "3.6725 per USD (fixed)"
    }
  ]
}
TRY ITLIVE · 3 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Returns the list of currencies available from the currency conversion service, along with publication metadata and per-currency details.

Response

Returns a JSON object with count as an integer, latest as a date string, and currencies as an array of currency objects. Each currency object includes the currency code, name, kind, parity, current flag, first available date, and last available date.

ParameterTypeDescription
countIntegerTotal number of currencies in the list.
latestStringLatest publication date in date format. Latest publication.
currenciesObject ArrayArray of currency records. Each item includes: code, name, kind, parity, current, first_date, last_date.
currencies[].codeStringCurrency code.
currencies[].kindStringCurrency kind. Allowed values: ecb (ECB reference rate), peg (fixed parity), euro.
currencies[].nameStringCurrency name.
currencies[].parityStringOfficial parity for pegged currencies.
currencies[].currentBooleantrue when the currency has a rate on the latest publication, otherwise false.
currencies[].last_dateStringLast day with a rate in date format. A retired currency stops here.
currencies[].first_dateStringFirst day with a rate in date format.
▣ ENDPOINT 02 / 04
GET
Get latest reference rates
https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/latest

QUICKSTART

GUIDE

Quickstart

Get the latest reference rates for the default base currency, or pass a different base in the query string.

curl -X GET "https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/latest?base=EUR" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with source, notice, pegged, base, date, and rates fields. source and notice are strings, pegged is an array of currency codes, base and date describe the reference date used, and rates is an object whose keys are currency codes and whose values are numbers.

{
  "base": "USD",
  "date": "2026-10-06",
  "rates": {
    "AED": 3.6725,
    "EUR": 0.88738131,
    "GBP": 0.75321678
  },
  "notice": "Reference rates for information, published around 16:00 CET on TARGET business days; not for trading.",
  "pegged": ["AED"],
  "source": "European Central Bank euro foreign exchange reference rates; fixed-parity currencies derived from their official pegs"
}
TRY ITLIVE · 3 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
Base currency (ISO 4217). Default `EUR`.
Comma-separated currencies to return, e.g. `USD,GBP,JPY`. Default: all available.

About this endpoint

What it does

Retrieves the latest reference exchange rates for a base currency, optionally limited to specific symbols. The response returns the publication date, source notice, the base currency, the rates object, and any pegged currencies included in the result.

Query Parameter(s)

AttributeTypeMandatoryDescription
baseStringNoBase currency (ISO 4217).
Default EUR.
Must be exactly 3 characters.
symbolsStringNoComma-separated currencies to return, e.g. USD,GBP,JPY.
Default: all available.

Response

Returns a JSON object with the latest reference rates for the chosen base currency, along with the publication date, source details, and any pegged currencies included in the result.

ParameterTypeDescription
sourceStringSource of the reference rates.
noticeStringInformational notice about the reference rates publication.
peggedString ArrayCurrencies in this answer whose rate comes from a fixed official parity instead of a live ECB rate — e.g. AED, SAR, XOF (33 currencies total are pegged.
baseStringBase currency for the returned rates.
dateStringPublication date of the rates used. Format: date.
ratesObjectUnits of each currency per one base, to 8 significant digits. The object contains currency codes as keys and numeric rate values as additional properties.
▣ ENDPOINT 03 / 04
GET
Get historical reference rates
https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/historical/:date

QUICKSTART

GUIDE

Quickstart

Fetch the latest reference rates for a specific date, using the base currency and optional symbols filter in the query string.

curl -X GET "https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/historical/:date" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with source, notice, pegged, base, date, and rates fields. source and notice are strings, pegged is an array of currency codes, base and date are strings, and rates is an object whose keys are currency codes and values are numbers.

{
  "source": "European Central Bank euro foreign exchange reference rates; fixed-parity currencies derived from their official pegs",
  "notice": "Reference rates for information, published around 16:00 CET on TARGET business days; not for trading.",
  "pegged": ["AED"],
  "base": "USD",
  "date": "2026-10-06",
  "rates": {
    "AED": 3.6725,
    "EUR": 0.88738131,
    "GBP": 0.75321678
  }
}
TRY ITLIVE · 3 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
ISO date from 1999-01-04
Base currency (ISO 4217). Default `EUR`.
Comma-separated currencies to return, e.g. `USD,GBP,JPY`. Default: all available.

About this endpoint

What it does

Retrieves historical reference exchange rates for a specified date, with an optional base currency and optional currency filter. The response returns the rates object together with source, notice, pegged currencies, base, and date metadata.

Path Parameter(s)

AttributeTypeMandatoryDescription
dateStringYesISO date from 1999-01-04.

Query Parameter(s)

AttributeTypeMandatoryDescription
baseStringNoBase currency (ISO 4217). Default EUR. Must be exactly 3 characters.
symbolsStringNoComma-separated currencies to return, e.g. USD,GBP,JPY. Default: all available.

Response

Returns a JSON object with the reference rates published on the requested date for the chosen base currency, along with the publication date, source details, and any pegged currencies included in the result. If the requested date had no publication, the rates come from the last publication before it and the requested date is shown separately

ParameterTypeDescription
sourceStringSource of the published reference rates.
noticeStringNotice about the reference rates publication and usage.
peggedString ArrayCurrencies in this answer derived from a fixed official parity rather than an ECB rate.
baseStringBase currency used for the returned rates.
dateStringPublication date of the rates used. ISO date.
ratesObjectUnits of each currency per one base, with numeric values for each returned currency code.
requested_dateStringThe date asked for, when it had no publication (weekend or TARGET holiday).
▣ ENDPOINT 04 / 04
GET
Get a daily time series
https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/timeseries

QUICKSTART

GUIDE

Quickstart

Fetch reference rates for a date range, with the required dates passed as query parameters.

curl -X GET "https://api.eu.apyhub.com/callable-labs/ecb-exchange-rates/v1/timeseries?start=2026-09-01&end=2026-09-30" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with source and notice strings, pegged as an array of strings, base, start, and end strings, count as an integer, and rates as an object mapping publication dates to currency-to-rate objects.

{
  "source": "European Central Bank euro foreign exchange reference rates; fixed-parity currencies derived from their official pegs",
  "notice": "Reference rates for information, published around 16:00 CET on TARGET business days; not for trading.",
  "pegged": ["AED"],
  "base": "USD",
  "start": "2026-09-01",
  "end": "2026-09-30",
  "count": 22,
  "rates": {
    "2026-09-30": {
      "EUR": 0.8912,
      "GBP": 0.7466
    }
  }
}
TRY ITLIVE · 3 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
Last day, included
First day, included
Base currency (ISO 4217). Default `EUR`.
Comma-separated currencies to return, e.g. `USD,GBP,JPY`. Default: all available.

About this endpoint

What it does

Returns a daily time series of reference FX rates for the date range you provide, using the query parameters to choose the base currency and optionally restrict the returned currencies. The response includes the date range, publication-day count, source notice, pegged currencies, and a nested rates object keyed by publication date.

Query Parameter(s)

AttributeTypeMandatoryDescription
startStringYesFirst day, included. Format: date.
endStringYesLast day, included. Format: date.
baseStringNoBase currency (ISO 4217). Default EUR. Length: 3 characters.
symbolsStringNoComma-separated currencies to return, e.g. USD,GBP,JPY. Default: all available. Max length: 400 characters.

Response

Returns a JSON object with the daily reference rates for each publication day in the range, along with the date range, the number of publication days, source details, and any pegged currencies.

ParameterTypeDescription
sourceStringReference data source used for the series.
noticeStringInformational notice about the rates.
peggedString ArrayCurrencies in this answer derived from a fixed official parity rather than an ECB rate.
baseStringBase currency used for the series.
startStringFirst day in the returned range. Format: date.
endStringLast day in the returned range. Format: date.
countIntegerPublication days in the range.
ratesObjectPublication date → currency → rate. Weekends and TARGET holidays have no entry.
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.