> ## Documentation Index
> Fetch the complete documentation index at: https://docs.financialdatasets.rip/llms.txt
> Use this file to discover all available pages before exploring further.

# Interest Rates (Historical)

> Returns each major central bank's current policy interest rate (Federal Reserve, European Central Bank, Bank of England, Bank of Japan), scraped live from each bank's own site and parsed on the fly by go/service/interestrates.go - not a historical time series database. This server has no historical rate storage, so both /macro/interest-rates (Financial Datasets' historical route) and /macro/interest-rates/snapshot (its real-time route) call the exact same tool and answer with today's scraped rate per bank; neither accepts a bank, start_date, or end_date parameter, since the underlying get_interest_rates tool takes no parameters at all (it always fetches every bank it can reach). A bank whose page cannot be scraped or parsed in a given call is left out of the response rather than failing the whole request. Query parameters: bank narrows the list; start_date and end_date select the reporting window, which defaults to the last twelve months. Each bank's page carries its full decision history, and the route reports the rate in force at the start of each month. Rates come from each bank's own page: the Fed target-range midpoint, the ECB deposit facility rate, the BOE Bank Rate, the BOJ policy rate; date is the decision date. A bank whose page cannot be read is omitted; if none can be, the call answers 502 upstream_error. The Bank of Japan publishes each decision only as a PDF statement, so its rate takes two Monid calls: the year's releases listing supplies the newest Statement on Monetary Policy and its date, and Context.dev's extractor reads the rate out of that PDF.



## OpenAPI

````yaml /api-reference/openapi.json get /macro/interest-rates
openapi: 3.1.0
info:
  title: Monid Finance API
  version: 1.0.0
  summary: A Financial Datasets-compatible finance REST API backed by Monid providers.
  description: >-
    US equities fundamentals, prices, filings, news, insider trades, and a stock
    screener, generated faithfully from this repository's Go source
    (go/httpapi/rest.go, go/service, go/fd). This server is drop-in compatible
    with the Financial Datasets REST and MCP interface: the same route shapes,
    the same query parameters, and response objects whose field names and field
    order match the Financial Datasets contract, captured 2026-09-04. It is an
    independent, Monid-backed implementation; it is not affiliated with or
    endorsed by Financial Datasets, and no Financial Datasets data or outputs
    are used.


    **Bring your own Monid API key.** Every request carries the caller's own key
    in the `X-API-KEY` header. Usage bills that caller's own Monid wallet; this
    server never stores or logs the key. Get a key at https://monid.ai.


    **Coverage.** All 54 Financial Datasets REST paths are registered. all 54
    return data; most call live Monid providers, and a handful (the static
    catalogs and the accept-universe coverage lists; see each operation's
    description) never call Monid at all. Every registered path answers from a
    live source; there are no not_implemented stubs. /kpi/metrics/sectors
    returns the screener provider's own industry taxonomy and
    /index-funds/tickers the upstream fund universe, both scraped through Monid
    on demand. See docs/compatibility.md for every deliberate deviation and
    docs/openapi-notes.md for how this document was derived.


    **Errors and soft failures.** Every failure — real HTTP error and zero-cost
    soft failure alike — uses the two-key body `{"error": <code>, "message":
    <detail>}`. Some routes answer `not_found` with HTTP 200 rather than a 4xx
    status (see each operation's description).


    **Pagination.** List routes return a wrapped envelope (e.g.
    `{"income_statements": [...], "next_page_url": "..."}`) with opaque,
    server-minted base64url `cursor` tokens. Pages hold 10 records (100 for
    /prices). `next_page_url` is an absolute URL on this deployment's own host,
    present only when more records remain.


    **Ticker coverage lists are accept-universes, not data-coverage claims.**
    The eight `*/tickers` routes (e.g. /company/facts/tickers,
    /kpi/metrics/tickers) all answer from the same ~3,227-ticker US equity
    catalog: the tickers a route will ACCEPT as input, never a promise that
    every one of them has data for that particular dataset - this server has not
    measured per-dataset coverage. Their own `limit` (default 1000, max 5000)
    and `cursor` query parameters page through that shared universe
    independently of every other route's pagination convention above.
  contact:
    url: https://docs.financialdatasets.rip
  license:
    name: MIT
    identifier: MIT
servers:
  - url: https://financialdatasets.rip
    description: Production (Fly.io).
security:
  - ApiKeyAuth: []
tags:
  - name: Financial statements
    description: Income statements, balance sheets, cash flow statements.
  - name: Financial metrics
    description: Historical financial metrics and the live snapshot.
  - name: Earnings
    description: Earnings records composed from SEC filing events.
  - name: Filings
    description: SEC filing index and extracted filing sections.
  - name: Prices
    description: Historical OHLCV prices and the live price snapshot.
  - name: News
    description: Ticker-matched news.
  - name: Insider trades
    description: SEC Form 4 insider trading transactions.
  - name: Screener
    description: Stock screener and its executable filter catalog.
  - name: Company
    description: Company facts.
  - name: KPIs
    description: >-
      KPI-taxonomy metrics, forward guidance, and non-GAAP metrics extracted
      from SEC filings.
  - name: Macroeconomics
    description: Central bank policy interest rates.
  - name: Index funds
    description: ETF / index-fund holdings.
  - name: Institutional holdings
    description: SEC Form 13F institutional-holdings rows.
  - name: Ownership
    description: Insider, beneficial (13D/13G) and activist ownership state.
  - name: Not implemented
    description: >-
      Routes registered for Financial Datasets route parity; always a zero-cost
      not_implemented stub today.
paths:
  /macro/interest-rates:
    get:
      tags:
        - Macroeconomics
      summary: Interest Rates (Historical)
      description: >-
        Returns each major central bank's current policy interest rate (Federal
        Reserve, European Central Bank, Bank of England, Bank of Japan), scraped
        live from each bank's own site and parsed on the fly by
        go/service/interestrates.go - not a historical time series database.
        This server has no historical rate storage, so both
        /macro/interest-rates (Financial Datasets' historical route) and
        /macro/interest-rates/snapshot (its real-time route) call the exact same
        tool and answer with today's scraped rate per bank; neither accepts a
        bank, start_date, or end_date parameter, since the underlying
        get_interest_rates tool takes no parameters at all (it always fetches
        every bank it can reach). A bank whose page cannot be scraped or parsed
        in a given call is left out of the response rather than failing the
        whole request. Query parameters: bank narrows the list; start_date and
        end_date select the reporting window, which defaults to the last twelve
        months. Each bank's page carries its full decision history, and the
        route reports the rate in force at the start of each month. Rates come
        from each bank's own page: the Fed target-range midpoint, the ECB
        deposit facility rate, the BOE Bank Rate, the BOJ policy rate; date is
        the decision date. A bank whose page cannot be read is omitted; if none
        can be, the call answers 502 upstream_error. The Bank of Japan publishes
        each decision only as a PDF statement, so its rate takes two Monid
        calls: the year's releases listing supplies the newest Statement on
        Monetary Policy and its date, and Context.dev's extractor reads the rate
        out of that PDF.
      operationId: get_interest_rates
      parameters:
        - name: bank
          in: query
          required: false
          schema:
            type: string
            enum:
              - FED
              - ECB
              - BOE
              - BOJ
          description: >-
            Keep only this central bank's row. Case-insensitive. Omit for every
            bank the server could read.
        - name: start_date
          in: query
          required: false
          schema:
            type: string
            format: date
          description: >-
            First day of the reporting window, YYYY-MM-DD. Defaults to twelve
            months back.
        - name: end_date
          in: query
          required: false
          schema:
            type: string
            format: date
          description: >-
            Last day of the reporting window, YYYY-MM-DD. Defaults to the most
            recent complete month.
      responses:
        '200':
          description: >-
            Illustrative shape (no captured live sample committed for this
            route); values are structural placeholders, not a claim about real
            reported figures. A bank is omitted entirely, not nulled out, when
            its page could not be scraped or parsed this call.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InterestRatesResponse'
              examples:
                example:
                  value:
                    interest_rates:
                      - bank: FED
                        name: Federal Reserve
                        rate: 3.625
                        date: '2025-12-11'
                      - bank: ECB
                        name: European Central Bank
                        rate: 2.25
                        date: '2026-06-17'
                      - bank: BOE
                        name: Bank of England
                        rate: 3.75
                        date: '2026-07-30'
                      - bank: BOJ
                        name: Bank of Japan
                        rate: 1
                        date: '2026-07-31'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '502':
          $ref: '#/components/responses/BadGateway'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
components:
  schemas:
    InterestRatesResponse:
      type: object
      title: InterestRatesResponse
      description: >-
        Unpaginated envelope: {"interest_rates": [...]}. Every bank whose page
        was scraped and parsed successfully in this call, in
        go/service/interestrates.go's bankSpecs order (FED, ECB, BOE, BOJ); a
        bank that failed to scrape or parse is left out entirely, not nulled.
      properties:
        interest_rates:
          type: array
          items:
            $ref: '#/components/schemas/InterestRate'
      required:
        - interest_rates
    InterestRate:
      type: object
      title: InterestRate
      description: >-
        One central bank's current policy interest rate, field order matching
        go/fd/types.go's InterestRate struct declaration. date is omitted when
        the bank's page was scraped but no effective date could be parsed nearby
        the rate.
      properties:
        bank:
          type: string
          description: 'Central bank code: FED, ECB, BOE, or BOJ.'
        name:
          type: string
          description: Central bank full name.
        rate:
          type: number
          description: Current policy rate, in percent.
        date:
          type: string
          format: date
          description: Effective date of the rate, when the source page states one nearby.
      required:
        - bank
        - name
        - rate
    ErrorResponse:
      type: object
      title: ErrorResponse
      description: >-
        Uniform error/soft-failure body: {"error": <code>, "message": <detail>}.
        Used both for real HTTP error statuses and for 200 OK
        "not_found"/"not_implemented" soft failures that this API never bills
        for.
      properties:
        error:
          type: string
          description: >-
            Machine-readable error code, e.g. bad_request, unauthorized,
            payment_required, rate_limited, upstream_error,
            upstream_schema_changed, upstream_timeout, unsupported,
            invalid_cursor, not_found, not_implemented.
        message:
          type: string
          description: Human-readable detail.
      required:
        - error
        - message
  responses:
    BadRequest:
      description: >-
        400 Bad Request. Validation failed before any paid Monid call was made
        (bad_request), or the request is well-formed but names a capability this
        server deliberately rejects (unsupported), e.g. as_reported=true or a
        non-USD currency.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            bad_request:
              summary: Validation failure
              value:
                error: bad_request
                message: ticker must be 1-20 letters, digits, dots, or hyphens
            unsupported:
              summary: Deliberately rejected capability
              value:
                error: unsupported
                message: >-
                  as_reported is not supported by the Monid-backed server;
                  as_reported=True cannot be answered honestly.
            invalid_cursor:
              summary: Malformed pagination cursor
              value:
                error: invalid_cursor
                message: cursor is not a valid opaque pagination token
    Unauthorized:
      description: >-
        401 Unauthorized. The X-API-KEY header was missing, empty, or contained
        control characters, or (if the operator configured an allowlist) the key
        is not on it. This check runs before any Monid call.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            unauthorized:
              value:
                error: unauthorized
                message: Missing or invalid API key.
    PaymentRequired:
      description: >-
        402 Payment Required. The caller's own Monid wallet could not cover the
        call (Monid returned a blocked/insufficient-funds result).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            payment_required:
              value:
                error: payment_required
                message: 'Monid run blocked: insufficient wallet balance.'
    TooManyRequests:
      description: >-
        429 Too Many Requests. Per-API-key token-bucket rate limit exceeded
        (default 60/min per key; 10/min for keyless demo traffic, where
        enabled).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            rate_limited:
              value:
                error: rate_limited
                message: Rate limit exceeded. Retry shortly.
    BadGateway:
      description: >-
        502 Bad Gateway. The upstream Monid provider call failed for a reason
        other than auth/funds/timeout (upstream_error), or its payload no longer
        matches the shape this server parses (upstream_schema_changed).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            upstream_error:
              summary: Generic upstream failure
              value:
                error: upstream_error
                message: provider returned HTTP 500
            upstream_schema_changed:
              summary: Upstream payload shape drifted
              value:
                error: upstream_schema_changed
                message: provider payload is not valid JSON
    GatewayTimeout:
      description: 504 Gateway Timeout. The upstream Monid provider call timed out.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            upstream_timeout:
              value:
                error: upstream_timeout
                message: provider request timed out
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: >-
        The caller's own Monid API key (get one at
        https://monid.ai?fpr=dhruv-15136b). Passed straight through to Monid on
        every call, so usage bills the caller's own wallet — this is never a
        shared server-side credential, and the server never logs or stores it.
        Missing, empty, or malformed values answer 401 unauthorized before any
        paid call is attempted.

````