Rate decisions API reference
Read what a country's central bank decided on its policy rate at each meeting, newest first, with the rate, the move, a quote from the source and the source address.
Overview
GET / returns what a country's central bank decided at each meeting, newest first. Holds are included. Each decision has the rate, the move, a quote from the bank's own words and the address of the page the quote was read on.
Use it to see what was decided and when. To read the rate that is in force on a given day, use the policy rate route instead. That route returns one rate for a date. This route returns the decisions, including meetings that left the rate unchanged.
It covers 115 central banks and currency unions. History starts in January 2025. A bank whose rate has not moved since then shows its latest decision, which can be older. The MCP tool is economics_ and takes the same parameters.
Request
A request for the newest decision of the Bank of England, and its real response:
curl --request GET \
--url "https://api.narwhalapi.com/v1/economics/GBR/central-bank/decisions?limit=1" \
--header "Authorization: Bearer $NARWHAL_API_KEY"{
"country": "GBR",
"coverage": {
"status": "covered",
"follows_country": null,
"reason": null,
"since": null,
"last_checked": null
},
"decisions": [
{
"decision_id": "d258f7b2bdf2ee4e2be91d9956b4f4de",
"authority_id": "bank_of_england",
"authority": "Bank of England",
"country": "GBR",
"decided_on": "2026-11-05",
"date_basis": "decision",
"decision_basis": "committee",
"evidence_kind": "statement",
"source_tier": "own",
"source_publisher": null,
"source_published_on": null,
"unchanged_since": null,
"action": "hike",
"any_rate_moved": true,
"currency": null,
"announced_on": null,
"effective_on": null,
"rates": [
{
"role": "main",
"instrument_label": "Bank Rate",
"rate": "4",
"lower_bound": null,
"upper_bound": null,
"rate_source": "stated"
}
],
"quotes": [
{
"text": "voted by a majority of 8–1 to increase Bank Rate by 0.25 percentage points, to 4%.",
"url": "https://www.bankofengland.co.uk/monetary-policy-summary-and-minutes/2026/november-2026"
}
],
"votes_status": "unknown",
"served_state": "provisional",
"from_union": null
}
]
}The newest decision is first. coverage.status is covered, so reason, since and last_ are null.
Parameters
| Parameter | In | Type | Required | Default | Meaning |
|---|---|---|---|---|---|
country | path | string | Yes | None | An uppercase ISO 3166-1 alpha-3 country code, or the id of a union: EMU, WAEMU, CEMAC, ECCU, CBCS or IEOM. EA20 is another name for EMU, and the response then shows EMU. A member of a union gets the union's decisions, see Union members. |
start | query | date, YYYY-MM-DD | No | None | The earliest decision date to return. Decisions on this day are included. |
end | query | date, YYYY-MM-DD | No | None | The latest decision date to return. Decisions on this day are included. start must not be later than end. |
limit | query | integer, 1 to 100 | No | 10 | The most decisions to return. The newest come first. The route has no cursor, so use start and end to read further back. |
Response
The response has three fields. country is the code you asked for (EMU when you sent EA20). coverage says why the decisions are what they are. decisions is a list, newest first, and is empty when nothing matches or the bank has none.
coverage is always present.
| Field | Meaning |
|---|---|
coverage.status | covered, follows, no_ or not_. See Coverage statuses. |
coverage.follows_ | Set when the status is follows: the country whose decisions apply. null otherwise. |
coverage.reason | One plain sentence saying why. null when the status is covered. |
coverage.since | When it began, where known. For no_ it is the day the bank's policy rate ended. |
coverage.last_ | The day we last checked this. null when the status is covered. |
Each item of decisions has these fields.
| Field | Meaning |
|---|---|
decision_ | Stable identifier of the decision. |
authority_ | Identifier of the deciding central bank, such as bank_. |
authority | Name of the deciding central bank. |
country | The country, or the union id for a union's decision. |
decided_ | The meeting day in the bank's local date. date_ says what this date is. |
date_ | What decided_ is. decision: the day the decision was made or announced. effective: the day the rate took effect, and the decision day is not known. read: the day we read the bank's page, and neither the decision day nor the effective day is known. |
decision_ | Who decided: committee, governor, formula, fixing or alignment_. null when the source does not say. |
evidence_ | What the quote comes from. statement: the bank's announcement. own_: the bank's own rate table. formula_: the bank's notice of a rate set by formula. report: a page by another official or international body that states the decision. table: a BIS table, used only when the bank's site cannot be read. |
source_ | Who published the source. own: the bank's own site. official: another official body of the country. international: an international body such as the IMF, the BIS or the World Bank. Another body is used only when the bank's site cannot be read. |
source_ | The body that published the source, as named by the page. null when source_ is own. |
source_ | The day that body published the source. null when source_ is own. |
unchanged_ | Set on a bank's newest decision when it was read from a page that shows the rate in force now. The rate has not changed since this date, and a rate that has not moved for years is still current. null on every other decision, and always null when date_ is read. |
action | The move on the main rate as the bank stated it: cut, hold or hike. null means the move was not stated. It does not mean hold. |
any_ | true when any of the bank's rates moved, false when none did. null when action is null. |
currency | Reserved. null in every decision today. |
announced_ | Reserved. null in every decision today. |
effective_ | Reserved. null in every decision today. |
rates | A list of the rates in the decision. See below. |
quotes | A list of quotes, each with text (the words from the bank's page, kept as read) and url (the page the words were read on). |
votes_ | unanimous, split, consensus, not_, not_, pending_ or unknown. It is unknown in every decision today. |
served_ | confirmed: the decision agrees with the BIS policy rate table. provisional: not yet checked against that table. |
from_ | Set when the country is a member of the union that made the decision. null otherwise. See Union members. |
Each item of rates is one rate of the decision.
| Field | Meaning |
|---|---|
role | main, deposit, lending, ceiling, floor or other. main is the bank's own named policy rate, which can differ from the rate the policy rate route returns. |
instrument_ | The rate's name in the bank's own words. |
rate | The rate in percent per year, as a decimal string. null when the decision gives a range. |
lower_ | The limits of a range, in percent, as decimal strings. Both are set for a range and both are null for a point rate. |
rate_ | stated: the figure is in the quoted text. carried_ or table: the figure is not in the quoted text. |
Coverage statuses
A country that is tracked always gets a 200. When there are no decisions to show, decisions is empty and coverage says why. The four statuses, each with a real response:
covered
We hold decisions for this country, its own or its union's. The example above is a covered bank.
follows
The country has no rate of its own and follows another country's bank. follows_ names it, so ask for that country instead. The Faroe Islands use the Danish krone, so they follow Denmark.
{
"country": "FRO",
"coverage": {
"status": "follows",
"follows_country": "DNK",
"reason": "Uses the Danish krone and has no central bank of its own, so Danmarks Nationalbank sets its rates.",
"since": null,
"last_checked": "2026-11-11"
},
"decisions": []
}no_ policy_ rate
The bank sets no policy rate, or its rate ended on the day in since.
{
"country": "SGP",
"coverage": {
"status": "no_policy_rate",
"follows_country": null,
"reason": "The Monetary Authority of Singapore steers the exchange rate and sets no policy rate.",
"since": null,
"last_checked": "2026-11-11"
},
"decisions": []
}not_ covered
The bank has a rate and we have no trusted source for its decisions yet.
{
"country": "CHN",
"coverage": {
"status": "not_covered",
"follows_country": null,
"reason": "We found no trusted source for this bank's rate decisions.",
"since": null,
"last_checked": "2026-11-11"
},
"decisions": []
}Union members
Some central banks decide for several countries: the European Central Bank for the euro area (EMU), and the banks of WAEMU, CEMAC, ECCU, CBCS and IEOM. A request for a member country returns the union's decisions with country set to the union id and from_ filled in. from_ is the union, member_ is when the country joined as the union dates it, or unknown, and note says who decides. The status for a member is covered.
{
"country": "DEU",
"coverage": {
"status": "covered",
"follows_country": null,
"reason": null,
"since": null,
"last_checked": null
},
"decisions": [
{
"decision_id": "b18daffcb48a45a8f446a3ef462b6c66",
"authority_id": "european_central_bank",
"authority": "European Central Bank",
"country": "EMU",
"decided_on": "2026-10-29",
"date_basis": "decision",
"decision_basis": "committee",
"evidence_kind": "statement",
"source_tier": "own",
"source_publisher": null,
"source_published_on": null,
"unchanged_since": null,
"action": "hold",
"any_rate_moved": false,
"currency": null,
"announced_on": null,
"effective_on": null,
"rates": [
{
"role": "main",
"instrument_label": "Deposit facility rate",
"rate": "2.50",
"lower_bound": null,
"upper_bound": null,
"rate_source": "stated"
}
],
"quotes": [
{
"text": "The interest rates on the deposit facility, the main refinancing operations and the marginal lending facility will remain unchanged at 2.50%, 2.65% and 2.90% respectively.",
"url": "https://www.ecb.europa.eu/press/pr/date/2026/html/ecb.mp261029~9a493adf17.en.html"
}
],
"votes_status": "unknown",
"served_state": "confirmed",
"from_union": {
"union": "EMU",
"member_since": "1999",
"note": "European Central Bank decides for every member of EMU."
}
}
]
}Sources and dates
The bank's own site is the first source. When the bank's page cannot be read, a second official publisher or the BIS policy rate table is used, and the decision says so in source_, source_, source_ and evidence_. Two real examples follow.
Nepal: the rate was read from a World Bank report. date_ is read, so decided_ is the day we read the report.
{
"country": "NPL",
"coverage": {
"status": "covered",
"follows_country": null,
"reason": null,
"since": null,
"last_checked": null
},
"decisions": [
{
"decision_id": "3bf36441f082316b609fbcb07347d2b7",
"authority_id": "nepal_rastra_bank",
"authority": "Nepal Rastra Bank",
"country": "NPL",
"decided_on": "2026-11-10",
"date_basis": "read",
"decision_basis": "committee",
"evidence_kind": "report",
"source_tier": "international",
"source_publisher": "World Bank, Nepal Development Update (October 2026)",
"source_published_on": "2026-10-01",
"unchanged_since": null,
"action": null,
"any_rate_moved": null,
"currency": null,
"announced_on": null,
"effective_on": null,
"rates": [
{
"role": "main",
"instrument_label": "Policy Rate",
"rate": "4.25",
"lower_bound": null,
"upper_bound": null,
"rate_source": "stated"
}
],
"quotes": [
{
"text": "The NRB reduced the policy rate to 4.25 percent and narrowed the interest rate corridor amid persistent excess liquidity in FY26.",
"url": "https://www.worldbank.org/en/country/nepal/publication/nepaldevelopmentupdate"
}
],
"votes_status": "unknown",
"served_state": "provisional",
"from_union": null
}
]
}The Bahamas: the page shows the rate in force and the date it took effect. date_ is effective, and unchanged_ says the rate has not changed since that day.
{
"country": "BHS",
"coverage": {
"status": "covered",
"follows_country": null,
"reason": null,
"since": null,
"last_checked": null
},
"decisions": [
{
"decision_id": "4f5e90cc63d4cba6cc93b650542a4212",
"authority_id": "central_bank_of_the_bahamas",
"authority": "Central Bank of The Bahamas",
"country": "BHS",
"decided_on": "2016-12-22",
"date_basis": "effective",
"decision_basis": "committee",
"evidence_kind": "statement",
"source_tier": "own",
"source_publisher": null,
"source_published_on": null,
"unchanged_since": "2016-12-22",
"action": null,
"any_rate_moved": null,
"currency": null,
"announced_on": null,
"effective_on": null,
"rates": [
{
"role": "main",
"instrument_label": "Discount Rate",
"rate": "4.00",
"lower_bound": null,
"upper_bound": null,
"rate_source": "stated"
}
],
"quotes": [
{
"text": "the Central Bank reduced the Discount Rate by 50 basis points to 4.00 percent, effective December 22nd, 2016.",
"url": "https://www.centralbankbahamas.com/chronology"
}
],
"votes_status": "unknown",
"served_state": "provisional",
"from_union": null
}
]
}Freshness
- A bank with a published meeting calendar is checked every 5 minutes on its decision day.
- A bank with no published calendar is checked once a week.
- Each decision is checked against the BIS policy rate table where the BIS carries that bank. Until then it is
provisional. coverage.last_gives the day a status other thanchecked coveredwas last confirmed.
Price
A call costs $2 per 1,000 calls, taken from your prepaid credit, and counts as one call. A call that returns no decisions is free, unless coverage.status is follows: that answer names the country to ask instead and is charged like any other. So no_, not_ and a date window with no decisions are free. Your balance must still cover one call, or the request returns 402.
Errors
Errors use the shared problem format.
400 invalid_query countryis not an uppercase ISO alpha-3 code or a union id,startorendis not a date inYYYY-MM-DDform,startis later thanend, orlimitis outside 1 to 100.401 invalid_The Bearer key is missing or was rejected.api_ key 402 insufficient_Your balance is less than the price of one call. The check happens before the lookup, so a call that would have been free is also refused.credits 403 account_The account is paused.paused 404 series_The code is not on the list of economies we track. Today every ISO country code and union id is tracked, so a valid code does not return this.not_ found 429 rate_A short-window limit was reached. Wait for the time inlimit_ exceeded Retry-After.503 economics_A stored decision cannot be served safely.unavailable 503 database_The database is temporarily unavailable. Retry.unavailable 503 rights_Source rights changed while the request was prepared. Retry.state_ changing
Was this page helpful?