Every API here is available over the APIs.io API and to AI agents over MCP.
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