Official Central Bank Exchange Rates

On this page, we’ll dive into the official exchange rates endpoints you can use to retrieve the exchange rates central banks like the ECB, the Federal Reserve or the Bank of England officially publish, including their full history.

Official rates are what accounting, invoicing, tax and customs rules usually refer to. Unlike /latest and /historical, which aggregate market data, these endpoints return each central bank’s own publication: one set of rates per business day, never blended, smoothed or filled in.


Sources

35 central banks and official fixing authorities on six continents. Each bank links to its public rate page with today’s rates, charts and yearly averages. More banks are added as they publish machine-readable rates.

Europe

sourceCentral bankAgainstRateSince
ecbEuropean Central BankEURReference rates1999
boeBank of EnglandGBPSpot rates at 16:00 London time1975
cnbCzech National BankCZKExchange rate fixing1991
nbpNational Bank of PolandPLNAverage rates (table A)2002
norgesNorges BankNOKDaily exchange rates1980
riksbankSveriges RiksbankSEKDaily middle rates1993
nationalbankenDanmarks NationalbankDKKDaily exchange rates1977
mnbMagyar Nemzeti BankHUFOfficial exchange rates1949
bnrNational Bank of RomaniaRONReference rates2005
nbuNational Bank of UkraineUAHOfficial rates, incl. precious metals1996
tcmbCentral Bank of the Republic of TürkiyeTRYIndicative forex buying rates2005
nbmNational Bank of MoldovaMDLOfficial exchange rates1995
nbrmNational Bank of the Republic of North MacedoniaMKDMiddle rates1997
cbbhCentral Bank of Bosnia and HerzegovinaBAMMiddle rates2003
cbrBank of RussiaRUBOfficial exchange rates1998

Asia and the Middle East

sourceCentral bankAgainstRateSince
nbgNational Bank of GeorgiaGELOfficial exchange rates1995
cbaCentral Bank of ArmeniaAMDOfficial exchange rates2000
cbarCentral Bank of the Republic of AzerbaijanAZNOfficial rates, incl. precious metals2006
nbkNational Bank of KazakhstanKZTOfficial market rates1999
cbuCentral Bank of the Republic of UzbekistanUZSOfficial exchange rates2000
nbtNational Bank of TajikistanTJSOfficial exchange rates2000
boiBank of IsraelILSRepresentative rates1985
pbocPeople's Bank of ChinaCNYRMB central parity (CFETS)2006
bnmBank Negara MalaysiaMYR12:00 middle rates2005
biBank IndonesiaIDRTransaction rates (buying)2001
nrbNepal Rastra BankNPRBuying rates2000

Oceania

sourceCentral bankAgainstRateSince
rbaReserve Bank of AustraliaAUDIndicative rates at 16:00 Sydney time2023

Americas

sourceCentral bankAgainstRateSince
fedFederal ReserveUSDH.10 noon buying rates, released weekly1971
bocBank of CanadaCADDaily average rates2017
bcbBanco Central do BrasilBRLPTAX closing rates (selling)1994
bcraBanco Central de la República ArgentinaARSOfficial rates (A 3500 for USD)2002
bcrpBanco Central de Reserva del PerúPENInterbank rate, USD only1997
sfcSuperintendencia Financiera de ColombiaCOPTRM, USD only1991

Africa

sourceCentral bankAgainstRateSince
cbnCentral Bank of NigeriaNGNCentral rates2001
sarbSouth African Reserve BankZARRand rates for USD, GBP, EUR, JPY2000

The currencies each bank publishes, its publication schedule and the exact first and last date of its history are available from /v3/official/sources. Rates are imported within the hour after a bank publishes them.

How the values work

  • Normalised quotation. Banks quote in different directions and units (the CNB publishes CZK per 100 JPY, the Fed publishes USD per EUR but JPY per USD). Every value is normalised to units of currency per 1 unit of base_currency, like the rest of the API. Apart from that the values are exactly as published.
  • Official against the bank’s currency. By default base_currency is the bank’s own currency (EUR for ecb, PLN for nbp, ...) and every value is official. With any other base_currency the values are cross rates calculated from the official ones, and meta.cross_rates is true. The bank’s own currency is included in that case, so source=nbp&base_currency=USD&currencies=PLN returns the official PLN rate for 1 USD.
  • Business days only. Banks do not publish on weekends and holidays. When you request such a date, you get the bank’s newest publication from up to 14 days before it; meta.date tells you which day the rates are for. The NBU sets a rate for every calendar day, a day in advance.
  • Publication references. Where a bank numbers its publications, meta.reference carries the number, e.g. the NBP table number (188/A/NBP/2026) or the TCMB bulletin number, so you can cite it on invoices and filings.
  • Buying rates. A few banks (TCMB, Bank Indonesia, Nepal Rastra Bank) publish buying and selling rates but no middle rate. Their buying rate is served, as the rate type says; nothing is averaged.
  • Precision. Some banks publish weak currencies with few significant digits (the Riksbank publishes 1 IDR as 0.00055 SEK). Those values are served as published, so cross rates derived from them are only as precise as the bank’s figure. Quotations with a single significant digit are too coarse to convert with and are left out.

GET/v3/official

Official Exchange Rates

This endpoint returns the official exchange rates a central bank published for a date, or its newest publication when no date is given.

Required attributes

  • Name
    source
    Type
    string
    Description

    The central bank to get the official rates from: ecb, fed, boe, boc, cnb, nbp, norges, riksbank, nbu, boi or tcmb

Optional attributes

  • Name
    date
    Type
    string
    Description

    Date to get the official rates for (format: 2026-09-28) By default the bank’s newest publication is returned

  • Name
    base_currency
    Type
    string
    Description

    The currency all values are relative to By default the bank’s own currency, which gives the official values as published

  • Name
    currencies
    Type
    string
    Description

    A list of comma-separated currency codes which you want to get (USD,GBP) By default all currencies of the publication will be shown

  • Name
    format
    Type
    string
    Description

    json (default) or csv

Response Structure

The meta key describes the publication: the source, the date the rates are for, the requested_date you asked for (null without one), the base_currency of the values, the bank’s own source_base_currency, whether the values are cross_rates, the bank’s reference for the publication and last_updated_at, when currencyapi last imported it. The data key holds the rates like the /latest endpoint.

Request

GET
/v3/official
curl -G https://api.currencyapi.com/v3/official \
    -d source=nbp \
    -d date=2026-09-28 \
    -d base_currency=USD \
    -d currencies=PLN \
    -H "apikey: YOUR-API-KEY"

Response

{
    "meta": {
        "source": "nbp",
        "source_name": "National Bank of Poland",
        "date": "2026-09-28",
        "requested_date": "2026-09-28",
        "base_currency": "USD",
        "source_base_currency": "PLN",
        "cross_rates": true,
        "reference": "188/A/NBP/2026",
        "last_updated_at": "2026-09-28T10:07:12Z"
    },
    "data": {
        "PLN": {
            "code": "PLN",
            "value": 3.8478
        }
    }
}

Available in plans >= medium
GET/v3/official/range

Official Exchange Rates for a Date Range

This endpoint returns every publication of a central bank between two dates, oldest first, for example to build a monthly average or to fill a ledger. Only the bank’s publication days are included.

Like /range it requires a plan that includes the range endpoint, and plans limited to one currency per range request need exactly one code in currencies.

Required attributes

  • Name
    source
    Type
    string
    Description

    The central bank to get the official rates from

  • Name
    date_from
    Type
    string
    Description

    First date of the range (format: 2026-09-01)

  • Name
    date_to
    Type
    string
    Description

    Last date of the range (format: 2026-09-30), at most 366 days after date_from

Optional attributes

  • Name
    base_currency
    Type
    string
    Description

    The currency all values are relative to By default the bank’s own currency

  • Name
    currencies
    Type
    string
    Description

    A list of comma-separated currency codes which you want to get (USD,GBP) By default all currencies of each publication will be shown

  • Name
    format
    Type
    string
    Description

    json (default) or csv

Response Structure

The data key holds one entry per publication with its date, the bank’s reference and the currencies.

Request

GET
/v3/official/range
curl -G https://api.currencyapi.com/v3/official/range \
    -d source=ecb \
    -d date_from=2026-09-01 \
    -d date_to=2026-09-30 \
    -d currencies=USD \
    -H "apikey: YOUR-API-KEY"

Response

{
    "meta": {
        "source": "ecb",
        "base_currency": "EUR",
        "source_base_currency": "EUR",
        "cross_rates": false
    },
    "data": [
        {
            "date": "2026-09-25",
            "reference": null,
            "currencies": {
                "USD": {
                    "code": "USD",
                    "value": 1.1403
                }
            }
        },
        {
            "date": "2026-09-28",
            "reference": null,
            "currencies": {
                "USD": {
                    "code": "USD",
                    "value": 1.1378
                }
            }
        }
    ]
}

GET/v3/official/sources

List Central Bank Sources

This endpoint lists every central bank you can use as source, with the currency it publishes against, the kind of rate, when it publishes, a link to the bank’s own page, the first and last date of the stored history and the currencies of its newest publication.

Request

GET
/v3/official/sources
curl -G https://api.currencyapi.com/v3/official/sources \
    -H "apikey: YOUR-API-KEY"

Response

{
    "data": {
        "ecb": {
            "code": "ecb",
            "name": "European Central Bank",
            "country": "EU",
            "region": "europe",
            "base_currency": "EUR",
            "rate_type": "Euro foreign exchange reference rates",
            "schedule": "Every TARGET2 business day at around 16:00 CET",
            "website": "https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html",
            "history": {
                "from": "1999-01-04",
                "to": "2026-09-28"
            },
            "currencies": ["AUD", "BRL", "CAD", "..."]
        },
        "...": "34 more central banks"
    }
}

Finding a source for a currency

/v3/official/sources?currency=KZT lists every bank that publishes a rate for the tenge (and the National Bank of Kazakhstan, which publishes against it). Add region=asia (or europe, africa, north-america, south-america, oceania) to narrow it down. The endpoint is free: it never counts against your quota.

CSV and caching

  • CSV. Add format=csv to /v3/official or /v3/official/range for one row per currency and publication: date,source,base_currency,currency,value,reference. Values never use exponent notation, so Excel and Google Sheets read them as numbers.
  • Conditional requests. Every response carries an ETag. Send it back as If-None-Match and an unchanged response comes back as 304 Not Modified without a body. Cache-Control tells you how long a response stays current: 5 minutes for recent publications, a day for settled ones.

Errors

Errors carry a stable, machine-readable error.code next to the human-readable message, and actions with links to the next step.

Statuserror.codeWhen
403plan_upgrade_required/v3/official/range on a plan without the range endpoint, or with more than one currency on a plan limited to one
404no_rates_publishedThe bank published nothing on the requested date or in the 14 days before it (e.g. a date before its history starts), or nothing in the requested range
422currency_not_publishedbase_currency is not a currency the bank published on that date
422invalid_parametersA parameter is invalid; errors lists the messages per parameter

404 response

{
    "message": "European Central Bank published no official rates on 1998-06-01 or in the 14 days before it.",
    "error": {
        "code": "no_rates_published",
        "message": "European Central Bank published no official rates on 1998-06-01 or in the 14 days before it."
    },
    "actions": {
        "sources": "https://api.currencyapi.com/v3/official/sources",
        "docs": "https://currencyapi.com/docs/openapi.yaml"
    },
    "info": "For more information, see documentation: https://currencyapi.com/docs/official"
}

See Request Status Codes for the errors every endpoint shares.