Euroref Discovery API

Machine-readable descriptions of what is served and what it costs.

GitHub OpenAPI

Operations 4

1 of 4 operations are conformant: apis.io called them with no credentials and the responses matched this contract; 3 more answered but could not be checked against a schema. Checked 2026-11-12. how this works · status file

GET /v1/changes FREE change + freshness feed — poll this after a paid call instead of re-buying… observed #
GET /v1/calendar FREE re-verification calendar — derived window plus an optional recorded… conformant #
GET /settlement-conventions Free: every settlement cycle we hold, with its primary-source citation — and… observed #
GET /label-rules Free: the rules every confidence_label and coverage_label is derived by observed #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/euroref-dev:euroref-dev-discovery-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

euroref-dev-discovery-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: euroref — European government reference data Discovery API
  version: 1.0.0
  description: 'European government reference data for 35 countries as cited JSON: central-bank policy rates, VAT/GST and VAT registration thresholds, CPI, corporate, personal and withholding tax, social contributions, minimum wages, statutory interest, official FX rates, filing deadlines and public holidays (coverage varies by country). Every value carries its official source URL and last-confirmed date. Single facts $0.003; country brief (every series for one country) $0.01; cross-country compare (one series, up to 10 countries) $0.02; tax-ID and VAT-number checks $0.003; computed answers (VAT, income tax, working days, minimum-wage check) $0.01-$0.02. Pay per call in USDC on Base via x402 or MPP, no signup, or by card with credit packs or monthly plans on one key valid across all 7 regional services. Free tier: GET /catalog, plus a free email key with 50 answer calls a day, commercial use allowed. Finished answers, one cited dossier per call (supported countries vary per job; others are refused free): cost this hire (wage-floor verdict, contributions, employer cost) $0.50; charge this sale (which VAT applies, net/VAT/gross) $0.50; charge this sale certified (plus a signed VAT-rate extract) $0.75; invoice due date and statutory late interest $0.40; country evidence pack (brief plus signed extracts) $0.25; hire compare $0.75 for 2 countries, $1.00 for 3-5; next filings (VAT, PAYE, corporate-tax due dates rolled for holidays) $0.35; invoice check (VAT right or wrong, overdue interest, tax-ID format) $0.60.


    Free trial: 3 successful calls per day per IP, shared across POST /v1/answers/* and POST /v1/jobs/*. No header needed (X-Free-Trial: 1 is accepted but not required); an empty-body POST gets the normal x402 402 and does not use the trial; once used up, the 402 carries free_trial_resets_at. MCP answer tools use the trial automatically when no api_key is passed. Every series of the evaluation country is free. Card credit (same per-call price as x402): /pricing.'
  x-guidance: 'GET /v1/{country}/{series} returns the current value of a reference series — e.g. GET /v1/at/policy-rate. Countries: at, be, bg, ch, cy, cz, de, dk, ee, es, eu, fi, fr, gb, gr, hr, hu, ie, is, it, lt, lu, lv, mt, nl, no, pl, pt, ro, rs, se, si, sk, tr, ua. Series: policy-rate, vat, vat-registration-threshold, minimum-wage, public-holidays, cpi, corporate-tax, withholding-tax, income-tax, social-contributions, ecb-main-refinancing-rate, late-payment-interest, statutory-interest, filing-deadlines, fx-reference. Append /history for past values. GET /v1/all returns every series for every country in one call. GET /catalog (free) lists all available series with freshness metadata, each with the official source it is cited to. If you are an x402/API seller making a cross-border digital sale, POST /v1/vat/determine tells you which jurisdiction''s VAT applies, who accounts for it, and the registration trigger — cited to the statute (EU, UK, South Africa), and it handles the wallet-only unidentified-buyer case. Payment is x402 (USDC on Base) per call; no signup or API keys needed. Retention: GET /v1/changes (free; past moves and freshness), GET /v1/calendar (free; reverify_by is derived from last_confirmed + update_cycle_days; next_effective_known only when current.effective_to is set; status unknown omits any next date; notes are never parsed; not an MPC, budget, or wage-review date), and POST /alerts (register free) are how a paying agent watches a value after the first paid call. Do not re-buy a series to find out whether it moved. GET /v1/calendar is not a promised future gazette.'
  contact:
    name: afriref API support
    email: api@3l-groupconsulting.co.za
    url: https://euroref.dev/pricing
    x-agentcash-owner: fou53506
  termsOfService: https://euroref.dev/terms
servers:
- url: https://euroref.dev
security:
- x402Payment: []
- apiKey: []
tags:
- name: Discovery
  description: Machine-readable descriptions of what is served and what it costs.
paths:
  /v1/changes:
    get:
      operationId: changes
      summary: FREE change + freshness feed — poll this after a paid call instead of re-buying…
      description: 'Free. Poll instead of re-buying: every series whose value took effect on or after `since` (default 30 days), newest first, with last re-confirmation, stale flag and a freshness summary. Push alternative: POST /alerts.'
      tags:
      - Discovery
      security: []
      parameters:
      - name: since
        in: query
        required: false
        schema:
          type: string
          format: date
        description: Only return series whose current value took effect on or after this date. Defaults to 30 days ago.
      responses:
        '200':
          description: Changed series (newest first) plus a dataset-wide freshness summary
        '400':
          description: since was not a real calendar date
      x-description-full: 'Unmetered and unpriced. Retention surface: after the first paid get_series / answers call, poll this to learn whether the gazette moved, rather than paying $0.003 again to see the same number. Returns every series whose current value took effect on or after `since` (optional; defaults to the last 30 days), newest first, each with the date we last re-confirmed it and whether it is past its verification window. Also returns a freshness summary for the whole served dataset: how many series were re-verified within 1, 7, 30 and 90 days, how many are past their window, and which single series has gone longest without a check. Published free deliberately — freshness is checkable or it is marketing. For push instead of poll, POST /alerts (register free). For a signed freeze of the current value, GET /v1/certified/{country}/{series} ($0.10).'
  /v1/calendar:
    get:
      operationId: calendar
      summary: FREE re-verification calendar — derived window plus an optional recorded…
      description: 'Free. Forward-looking companion to /v1/changes from stored fields only: reverify_by (our re-check cadence, not a government date) and next_effective_known when the served value has an end date; otherwise "unknown". A 402 here is a bug: do not pay.'
      tags:
      - Discovery
      security: []
      parameters:
      - name: country
        in: query
        required: false
        schema:
          type: string
        description: Optional ISO 3166-1 alpha-2, case-insensitive. Must be in this brand's continent catalog. Not two letters → HTTP 400, free. Not in this brand → HTTP 404, free.
      - name: series
        in: query
        required: false
        schema:
          type: string
        description: Optional series id (for example policy-rate). A valid country (or no country) with no match returns HTTP 200 and an empty entries list. A malformed series query is HTTP 400, free.
      responses:
        '200':
          description: Free and unmetered. price_note says so. Entries may mix status known and status unknown. Known copies current.effective_to into next_effective_known. Unknown omits next_effective_known and next_effective_basis. No payment headers.
          content:
            application/json:
              schema:
                type: object
                required:
                - as_of
                - brand
                - filters
                - count
                - entries
                - note
                - price_note
                - disclaimer
                properties:
                  as_of:
                    type: string
                    format: date
                  brand:
                    type: string
                  filters:
                    type: object
                    properties:
                      country:
                        type:
                        - string
                        - 'null'
                      series:
                        type:
                        - string
                        - 'null'
                  count:
                    type: integer
                    minimum: 0
                  entries:
                    type: array
                    description: Sorted by country ascending, then series ascending.
                    items:
                      type: object
                      required:
                      - country
                      - series
                      - name
                      - last_confirmed
                      - stale
                      - update_cycle_days
                      - reverify_by
                      - status
                      properties:
                        country:
                          type: string
                          description: ISO 3166-1 alpha-2
                        series:
                          type: string
                        name:
                          type: string
                        last_confirmed:
                          type: string
                          format: date
                        stale:
                          type: boolean
                          description: 'Same rule as elsewhere: age in days since last_confirmed is greater than update_cycle_days.'
                        update_cycle_days:
                          type: integer
                        reverify_by:
                          type: string
                          format: date
                          description: UTC calendar date of last_confirmed plus update_cycle_days. Service re-verification cadence, not a government announcement date.
                        status:
                          type: string
                          enum:
                          - known
                          - unknown
                        next_effective_known:
                          type: string
                          description: Present only when status is known. Equals current.effective_to. Recorded end of the served value, not an invented MPC, budget, or wage-review date.
                        next_effective_basis:
                          type: string
                          enum:
                          - effective_to
                          description: Present only when status is known.
                  note:
                    type: string
                    description: States that reverify_by is derived, that next_effective_known comes only from current.effective_to, and that notes prose is never parsed.
                  price_note:
                    type: string
                    description: States that this feed is free and unmetered, and points at GET /v1/changes for past moves. Series values remain paid at GET /v1/{country}/{series}.
                  disclaimer:
                    type: string
        '400':
          description: Free. Malformed country (not two letters) or malformed series query. No payment.
        '404':
          description: Free. Country is not in this brand's continent catalog. No payment.
      x-description-full: 'Unmetered and unpriced. security is empty: no x402 challenge and no API key. GET /v1/changes is the past (what moved, plus freshness). GET /v1/calendar is a forward-looking derive from fields already stored on the current value, continent-scoped like /v1/changes. reverify_by is the UTC calendar date of last_confirmed plus update_cycle_days — the same window that sets stale — and it is this service''s re-verification cadence, not a government announcement date. next_effective_known is present only when current.effective_to is a non-empty string; next_effective_basis is then "effective_to". That date is the recorded end of the currently served value (a coverage or vintage end, such as a public-holidays year window or a CPI month). It is not a promised future gazette and not an MPC, budget, or wage-review date. When effective_to is absent, status is "unknown" and next_effective_known and next_effective_basis are omitted; the series is still listed with last_confirmed, stale, update_cycle_days, and reverify_by. Unknown is still free. Notes, determined, and history rows are never parsed for a next date. Sort is country ascending, then series ascending. A 402 on this route is a gate bug — do not pay. For push when a served value actually moves, POST /alerts.'
  /settlement-conventions:
    get:
      operationId: settlementConventions
      summary: 'Free: every settlement cycle we hold, with its primary-source citation — and…'
      tags:
      - Discovery
      security: []
      responses:
        '200':
          description: Cited cycles per market and instrument class, each with authority tier, in-force dates and citations, plus an explicit deliberately-absent list
  /label-rules:
    get:
      operationId: labelRules
      summary: 'Free: the rules every confidence_label and coverage_label is derived by'
      tags:
      - Discovery
      security: []
      responses:
        '200':
          description: Rule ids (C1-C5, G1-G5, A1-A4), the inputs each reads, and where labels appear. label_basis on any response names the rules that fired.
components:
  securitySchemes:
    x402Payment:
      type: apiKey
      in: header
      name: X-PAYMENT
      description: x402 (USDC on Base). Call without this header, receive HTTP 402 carrying the price and payment details, then retry with the signed payment payload in X-PAYMENT. No signup, no account, no key. Per-operation prices are in the x-payment-info extension and at https://euroref.dev/pricing.
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: 'Prepaid credit bought by card (from $10) at https://euroref.dev/pricing, or a free key by email at https://euroref.dev/free-key (50 calls a day on answer endpoints, commercial use allowed). Send the key on every call. How the two payment rails charge: both rails charge the same US-dollar price per call. By card, prepaid credit is worth $0.001 per credit on the $10, $25 and $100 packs and each successful call debits its endpoint price in credits (a $0.003 value is 3 credits, a $0.002 holidays call is 2, an alert delivery after the free trial is 50, a $0.10 certified extract is 100); over x402, every call pays the price quoted in its own 402 challenge, $0.002 to $1.00 depending on the endpoint (listed at https://euroref.dev/pricing). Failed or refused calls are not charged on either rail. Keys bought before 12 October 2026 keep their original one-credit-per-call terms, and keys bought from 12 to 16 October keep $0.005 credits. Use this instead of x402 if you want an invoice.'
    x402:
      type: apiKey
      in: header
      name: PAYMENT-SIGNATURE
      description: 'x402 v2 (USDC on Base, network eip155:8453): call without payment, receive HTTP 402 with the v2 PAYMENT-REQUIRED challenge, retry with the signed payload in PAYMENT-SIGNATURE. The challenge is v2 only, so a client must read v2; X-PAYMENT is also accepted as the payment header. No signup, no key.'
x-example-urls:
- https://euroref.dev/catalog
- https://euroref.dev/v1/calendar
- https://euroref.dev/public/at/holidays
- https://euroref.dev/v1/at/policy-rate
- https://euroref.dev/v1/at/policy-rate/history
- https://euroref.dev/v1/all