Browse all documentation

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 /v1/economics/{country}/central-bank/decisions 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_get_rate_decisions 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"
United Kingdom, newest decision
{
  "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_checked are null.

Parameters

ParameterInTypeRequiredDefaultMeaning
countrypathstringYesNoneAn 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.
startquerydate, YYYY-MM-DDNoNoneThe earliest decision date to return. Decisions on this day are included.
endquerydate, YYYY-MM-DDNoNoneThe latest decision date to return. Decisions on this day are included. start must not be later than end.
limitqueryinteger, 1 to 100No10The 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.

FieldMeaning
coverage.statuscovered, follows, no_policy_rate or not_covered. See Coverage statuses.
coverage.follows_countrySet when the status is follows: the country whose decisions apply. null otherwise.
coverage.reasonOne plain sentence saying why. null when the status is covered.
coverage.sinceWhen it began, where known. For no_policy_rate it is the day the bank's policy rate ended.
coverage.last_checkedThe day we last checked this. null when the status is covered.

Each item of decisions has these fields.

FieldMeaning
decision_idStable identifier of the decision.
authority_idIdentifier of the deciding central bank, such as bank_of_england.
authorityName of the deciding central bank.
countryThe country, or the union id for a union's decision.
decided_onThe meeting day in the bank's local date. date_basis says what this date is.
date_basisWhat decided_on 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_basisWho decided: committee, governor, formula, fixing or alignment_notice. null when the source does not say.
evidence_kindWhat the quote comes from. statement: the bank's announcement. own_table: the bank's own rate table. formula_notice: 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_tierWho 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_publisherThe body that published the source, as named by the page. null when source_tier is own.
source_published_onThe day that body published the source. null when source_tier is own.
unchanged_sinceSet 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_basis is read.
actionThe 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_rate_movedtrue when any of the bank's rates moved, false when none did. null when action is null.
currencyReserved. null in every decision today.
announced_onReserved. null in every decision today.
effective_onReserved. null in every decision today.
ratesA list of the rates in the decision. See below.
quotesA 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_statusunanimous, split, consensus, not_published, not_applicable, pending_minutes or unknown. It is unknown in every decision today.
served_stateconfirmed: the decision agrees with the BIS policy rate table. provisional: not yet checked against that table.
from_unionSet 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.

FieldMeaning
rolemain, 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_labelThe rate's name in the bank's own words.
rateThe rate in percent per year, as a decimal string. null when the decision gives a range.
lower_bound, upper_boundThe limits of a range, in percent, as decimal strings. Both are set for a range and both are null for a point rate.
rate_sourcestated: the figure is in the quoted text. carried_forward 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_country names it, so ask for that country instead. The Faroe Islands use the Danish krone, so they follow Denmark.

Faroe Islands
{
  "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.

Singapore
{
  "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.

China
{
  "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_union filled in. from_union.union is the union, member_since is when the country joined as the union dates it, or unknown, and note says who decides. The status for a member is covered.

Germany, a member of the euro area
{
  "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_tier, source_publisher, source_published_on and evidence_kind. Two real examples follow.

Nepal: the rate was read from a World Bank report. date_basis is read, so decided_on is the day we read the report.

Nepal
{
  "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_basis is effective, and unchanged_since says the rate has not changed since that day.

The Bahamas
{
  "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_checked gives the day a status other than covered was 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_policy_rate, not_covered 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 country is not an uppercase ISO alpha-3 code or a union id, start or end is not a date in YYYY-MM-DD form, start is later than end, or limit is outside 1 to 100.
  • 401 invalid_api_key The Bearer key is missing or was rejected.
  • 402 insufficient_credits 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.
  • 403 account_paused The account is paused.
  • 404 series_not_found 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.
  • 429 rate_limit_exceeded A short-window limit was reached. Wait for the time in Retry-After.
  • 503 economics_unavailable A stored decision cannot be served safely.
  • 503 database_unavailable The database is temporarily unavailable. Retry.
  • 503 rights_state_changing Source rights changed while the request was prepared. Retry.

Errors and credits · Policy rates · Economics API reference

Was this page helpful?