apyhub
Back
▣ VERIFICATION KIT

ECB Exchange Rates API

What it does

The Exchange Rates API returns the official daily reference rates published by the European Central Bank (ECB). Get the latest rates, the rates for any day back to 4 January 1999, or a day-by-day series over up to 366 days. Currencies without an ECB rate use their fixed official parity.

Set base to choose the base currency (default EUR). Set symbols to a comma-separated list such as USD,GBP,JPY to limit the result, or leave it out for all currencies. For a series, pass start and end. Both days are included.

The ECB publishes around 16:00 CET on TARGET business days. If a single day you ask for had no publication, the API falls back to the last published day and tells you the date you asked for. A series skips days without a publication and reports how many publication days fall in the range. Every response flags pegged currencies and includes a source note. Retired currencies return rates for the years they were in use.

Teams use the Exchange Rates API to feed finance systems and reports, chart historical exchange rates on dashboards, and revalue past transactions at ECB reference rates. It is a reference feed, not trading-grade market data.

To convert a single amount, use the Currency Converter API. To check which days are TARGET business days, use the Business Days API.

▣ 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.