# afriref — Pan-African statutory reference (jobs, not series dumps) No account. No API key. No signup. Pay per call with x402 (USDC on Base). This is gazette-cited government reference for 34 African jurisdictions — and computed verdicts over that reference. It is not a holiday list, not an ECB FX convert, and not a macro series dump. Every paid value carries the official source URL, `effective_from`, `last_confirmed`, and a `stale` flag. HTML for every current value is free. Human? https://afriref.dev/docs · https://afriref.dev/countries · https://afriref.dev/status · https://afriref.dev/accuracy (where reference data, including ours, has been wrong). ## Looking up one value? Read the free answer page Every series for all 34 countries has a free HTML page (no payment, no key) that opens with the answer: the value and unit, the date it took effect, the official source (linked), and the date we last checked it. Non-primary values say so in that same sentence. Cite the page; it is the public answer. - One country, one figure: https://afriref.dev/{country}/{series} — e.g. https://afriref.dev/ao/income-tax - One country, every figure: https://afriref.dev/{country} — e.g. https://afriref.dev/ao - Every page listed with its official source and last-checked date: https://afriref.dev/llms-full.txt - One instrument compared across every country: - Corporate tax rate (34 countries): https://afriref.dev/corporate-tax - Inflation rate (CPI) (34 countries): https://afriref.dev/cpi - Income tax rates (34 countries): https://afriref.dev/income-tax - Minimum wage (34 countries): https://afriref.dev/minimum-wage - Policy interest rate (34 countries): https://afriref.dev/policy-rate - Public holidays (34 countries): https://afriref.dev/public-holidays - Social contributions (34 countries): https://afriref.dev/social-contributions - Statutory interest rate (34 countries): https://afriref.dev/statutory-interest - VAT rate (34 countries): https://afriref.dev/vat - VAT registration threshold (34 countries): https://afriref.dev/vat-registration-threshold - Withholding tax rates (34 countries): https://afriref.dev/withholding-tax - Tax filing deadlines (11 countries): https://afriref.dev/filing-deadlines - Official exchange rates (4 countries): https://afriref.dev/fx-reference Series slugs: corporate-tax, cpi, income-tax, minimum-wage, policy-rate, public-holidays, social-contributions, statutory-interest, vat, vat-registration-threshold, withholding-tax, filing-deadlines, fx-reference. Country = ISO 3166-1 alpha-2, lower case. ## Jobs this service answers Ask the question. Then hit the matching op. Do not scrape 378 series and derive it yourself. | Agent question | Call | Price | | --- | --- | --- | | What is the SARB repo / CBK CBR / CBN MPR right now, with the MPC source? | `GET /v1/{za\|ke\|ng}/policy-rate` | $0.003 | | Gross-up this invoice for Ghana VAT + NHIL + GETFund levies | `POST /v1/answers/vat` `{country:"gh", amount, mode:"add"\|"extract", band?}` | $0.01 | | What is South Africa’s standard VAT, last confirmed when, is it stale? | `GET /v1/za/vat` | $0.003 | | What is the full snapshot of every series across this region? | `GET /v1/all` | $0.02 | | Is this salary legal in Kenya? (or ZA, NG, GH…) | `POST /v1/answers/wage-check` `{country, amount, period, schedule?}` | $0.02 | | Simple statutory interest on a principal at the cited statutory-interest rate (Actual/365) | `POST /v1/answers/statutory-interest` `{country, principal, days \| from+to, receipt?}` | $0.02 | | What is the minimum wage in Kenya — the lowest general-order rate, cited? | `GET /v1/ke/minimum-wage` | $0.003 | | Next working day in Nairobi after this date (weekends + gazetted holidays) | `POST /v1/answers/working-days` `{country:"ke", from, to}` | $0.002 | | Gross-to-net take-home, Nigeria or Kenya (PAYE + statutory deductions) | `POST /v1/answers/payroll` `{country:"ng"\|"ke", gross, period?}` | $0.05 | | Who accounts for VAT on this digital sale? (EU / UK / ZA ruleset) | `POST /v1/vat/determine` `{seller_country, buyer_country, buyer_type?}` | $0.05 | | File this value: Ed25519-signed extract + SHA-256 of the archived gazette | `GET /v1/certified/{country}/{series}` | $0.10 | | Did ZA VAT-registration-threshold move? Watch it. | `POST /alerts` or poll `GET /v1/changes` (free) | Register: $0 · Delivery after trial: $0.05 | `POST /v1/answers/employment-cost` is **not** on this brand’s OpenAPI. Sister brands (euroref, usaref, …) price statutory employer+employee contributions. Afriref’s computed employment answer today is `payroll` for NG and KE only. Do not call a path that 404s. ## Bind this region Eval-free: every **GH** series. `GET https://afriref.dev/v1/gh/policy-rate?sample=1` (scripts and agents need ?sample=1 or X-Free-Sample: 1; without it they get the normal 402). Computed answers (`/v1/answers/*`, `/v1/vat/determine`) charge for GH too — country is in the body, not the path. 34 countries: ao bf bj bw cd cf cg ci cm dz eg et ga gh gq ke ls ma ml mu mz na ne ng rw sn sz td tg tn tz ug za zm. Series: `policy-rate`, `vat`, `vat-registration-threshold`, `minimum-wage`, `public-holidays` (free), `cpi`, `corporate-tax`, `withholding-tax`, `statutory-interest`, `income-tax`, `social-contributions`, `fx-reference` (eg, ke, ng, za). Full index: `GET /catalog` (free). `filing-deadlines` (countries with verified rules): VAT, payroll-withholding and corporate-tax deadline rules with official citations, plus computed due dates rolled for weekends and public holidays (`?from=&to=&tax=&year_end=`). Countries without a verified rule return a free 404 `coverage_gap` naming what is missing. Same ISO may 200 on another *ref.dev brand. This host is the Africa book. Fleet: afriref · euroref · asiaref · latamref · usaref · mearef · ausref. ## How to call a paid endpoint (x402) 1. Call with no payment → HTTP 402. Challenge is in the `payment-required` header and JSON body. 2. Sign with any x402 client (`@x402/fetch` does this). 3. Retry with `PAYMENT-SIGNATURE` (x402 v2) or `X-PAYMENT` (v1). Receipt comes back in `PAYMENT-RESPONSE`. Or send prepaid `X-API-Key` from https://afriref.dev/pricing (packs from $10). Bad input is rejected **free** (4xx before the gate). You never pay to fail. Free, no payment: `/catalog` · `/llms.txt` · `/openapi.json` · public holidays · `/v1/changes` · `/v1/calendar` · `/provenance` · `/certified/public-key` · country HTML. ## Finished jobs (one paid call, one cited dossier) - $0.50 cost this hire: `POST https://afriref.dev/v1/jobs/cost-hire` {country, gross, period?, hours_per_week?, taxable_income?, start_date?}. Wage-floor verdict, employer and employee contributions (or PAYE net pay for NG/KE), employer cost, optional income tax and first working day, every figure cited. Countries here: KE, NG. - $0.50 charge this sale: `POST https://afriref.dev/v1/jobs/charge-sale` {seller_country, buyer_country?, buyer_type?, amount, amount_is?, band?}. Whether to charge VAT, which country's and how much (EU, UK and South Africa place-of-supply rules), net/VAT/gross, registration threshold. Omit buyer_country for single-country rate maths. - $0.75 the same with a signed certified extract of the governing VAT rate: `POST https://afriref.dev/v1/jobs/charge-sale/certified`. - $0.40 invoice due date and late interest: `POST https://afriref.dev/v1/jobs/invoice-payable` {country, principal, due_date | invoice_date + terms_days, as_of?, debtor?}. Overdue or not, days overdue, statutory interest owed (Actual/365 simple) with rate and workings; both results shown when the rate changed in the window. Countries here: statutory interest only BF, BJ, BW, CI, CM, DZ, EG, ET, MA, ML, MU, MZ, NA, NE, SN, TG, TN, ZA. - $0.25 country evidence pack: `POST https://afriref.dev/v1/jobs/evidence-pack` {country, series?}. The full cited country brief plus up to 3 Ed25519-signed certified extracts. Refused free if nothing can be certified. - $0.75 hire compare, 2 countries: `POST https://afriref.dev/v1/jobs/hire-compare` {hires: [{country, gross}], period?}; $1.00 for 3 to 5 countries: `POST https://afriref.dev/v1/jobs/hire-compare/multi`. Employer cost, contributions, on-cost % and wage verdict side by side, ranked. Countries (any brand): AE, AU, CA, DE, ES, GB, IT, MX, PL, US. - $0.35 next filings: `POST https://afriref.dev/v1/jobs/next-filings` {country, from?, to?, tax?, year_end?}. VAT, PAYE and corporate-tax due dates in a window (default 90 days), rolled for weekends and public holidays, rules cited. Countries here: EG, GH, KE, MU, NG, RW, SN, TN, TZ, UG, ZA. - MCP: the same jobs are tools on `https://afriref.dev/mcp` (cost_hire, charge_sale, charge_sale_certified, invoice_payable, evidence_pack, hire_compare, next_filings, where this brand has coverage). - Anything we cannot answer in full is refused free (`coverage_gap`, no charge). The 3 free calls per IP per day are shared by answers and jobs. - One catalog for all seven brands: `GET https://afriref.dev/fleet/catalog.json` (free). ## Domain and email security check - $0.01 domain check: `GET https://afriref.dev/v1/domain/check?domain=example.com`. Use when you need a quick graded audit of a domain's email security (SPF, DKIM, DMARC, MX), its TLS certificate on 443, and Microsoft 365 tenant detection, with exact fix records. $0.01 per domain. Score 0-100 plus, per check (spf, dkim, dmarc, mx, tls, m365), a pass/warn/fail grade, the finding and the exact record or step that fixes it. Invalid or nonexistent domains are refused free. MCP tool: `domain_check` on `https://afriref.dev/mcp`. - $0.005 domain age: `GET https://afriref.dev/v1/domain/age?domain=example.com`. Which registrar holds it (name and IANA ID), created, expires, last changed and status flags from the registry's RDAP, graded for newly registered or expiring domains. Registries without RDAP (e.g. .za/.co.za, .me, .de, .io, .eu) are refused free (422). MCP tool: `domain_age`. Also on `https://domainref.dev`. ## Paying with MPP (Machine Payments Protocol) instead of x402 Every paid endpoint also accepts MPP on identical terms: the same price, USDC on Base (eip155:8453), the same pay-to address 0x1F0409ccD20A2fb497d4DeCeF4E17e9d0688FeA6. 1. The unpaid HTTP 402 also carries a WWW-Authenticate: Payment challenge (method evm, intent charge). 2. Pay it with an MPP client that supports the evm charge method (for example the mppx SDK, mppx/client with mppx/evm/client). 3. Retry with Authorization: Payment . You get HTTP 200 + the data, with a Payment-Receipt header. Send one rail per request: an x402 payment header takes precedence. Bad input is still refused FREE before any challenge. MPP settles when the credential is accepted, just before the endpoint runs (x402 settles after). ## Pricing ladder - 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://afriref.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. - $0.003 — one series value or its `/history` (GH free) - $0.002 — public holidays (`GET /v1/holidays/{country}`, paid copy for x402 clients; `GET /v1/{country}/public-holidays` stays free) · working-days - $0.01 — VAT breakdown - $0.01 — domain and email security check (`GET /v1/domain/check?domain=...`) - $0.005 — domain age and which registrar holds it (`GET /v1/domain/age?domain=...`) - $0.01 — country brief: every series for one country in one call (`GET /v1/brief/{country}`) - $0.02 — compare one series across up to 10 countries (`GET /v1/compare?series=vat&countries=a,b,c`) - $0.003 — validate a tax-ID / VAT number: format + official check digit, normalised form, why it failed; offline, no registry lookup (`GET /v1/taxid/validate?country=cc&id=...`; free coverage list at `GET /v1/taxid/coverage`; countries without a sourced rule answer free with status `unknown`) - Monthly card plans: $19/month = 30,000 credits · $49/month = 90,000 · $149/month = 300,000 (same $0.001 credits, no rollover; /pricing#plans) · Data licence for the full dataset: api@3l-groupconsulting.co.za - $0.02 — `/v1/all` snapshot - $0.02 — wage-check · income-tax · settlement-date · statutory-interest - $0.05 — payroll (NG, KE) · cross-border VAT determine - Alerts: Register: $0 · Delivery after trial: $0.05 - Change feed: `GET /v1/changes` — free, unmetered. Poll this after you have paid once; do not re-buy a series to see whether it moved. - Re-verification calendar: `GET /v1/calendar` — free, unmetered. `reverify_by` is derived from `last_confirmed` + `update_cycle_days`. `status: unknown` omits any next date. We do not parse notes. Not an MPC or budget date. - $0.10 — certified extract - Optional signed answer receipt (`receipt:true`) on statutory-interest and the other paid answers this brand lists — included at the existing answer price; no separate charge; distinct from the $0.10 series certified extract Licensed / keys: api@3l-groupconsulting.co.za ## Business days (FREE, unmetered, every country on every brand) National public-holiday calendar plus the country's statutory weekend rule (Gulf Friday+Saturday, Israel Saturday-only, India 2nd/4th Saturdays, China's make-up working days). A date in a year we do not hold holidays for is refused 422 `year_not_held` with the years we do hold; it is never computed from weekends alone. MCP: is_business_day, add_business_days, business_days_between. - GET /v1/business-days/is-business-day?country=gh&date=YYYY-MM-DD — business day or not, why, and the next/previous business day - GET /v1/business-days/add?country=gh&date=YYYY-MM-DD&n=5 — date plus n business days; negative n walks backward; the start date is day 0 - GET /v1/business-days/between?country=gh&from=YYYY-MM-DD&to=YYYY-MM-DD — business days in (from, to] (signed, the inverse of add) and inclusive of both ends ## Answers (computed verdicts) - `POST /v1/answers/wage-check` `{country, amount, period, schedule?}` — is this salary at / above / below the statutory floor? Period must match the floor (we never guess a monthly↔hourly conversion). Pass `schedule` for a sectoral / zonal / grade floor (Kenya general-order has many; South Africa has sectoral determinations). Omit it and we say so: “above the national floor” is not “compliant”. Honest statuses where no enforceable floor exists (e.g. Ethiopia, Rwanda). $0.02 - `POST /v1/answers/vat` `{country, amount, mode?, band?}` — net / tax / gross, including stacked levies (Ghana VAT + NHIL + GETFund). `mode=add` (amount is net) or `extract` (amount is gross). `band` selects a published reduced / zero rate; we do not classify your supply into a band. Refuses free where no single statutory rate exists. $0.01 - `POST /v1/answers/working-days` `{country, from, to, subdivision?}` — working days, holidays hit, **next working day**, weekend convention (Egypt Fri–Sat). Not a generic “business days in 110 countries” count: uncovered years refuse (`calendar_coverage_exhausted`); moon-sighted calendars refuse permanently rather than invent Eid. $0.002 - `POST /v1/answers/income-tax` `{country, taxable_income}` — statutory tax + per-bracket workings. This is not net take-home. $0.02 - `POST /v1/answers/payroll` `{country: "ng"|"ke", gross, period?}` — gross-to-net: PAYE + statutory deductions for Nigeria and Kenya only. Other countries 422 free. $0.05 - `POST /v1/answers/statutory-interest` `{country, principal, days? | from?+to?, receipt?}` — simple interest at the cited `statutory-interest` series rate: principal × (rate percent / 100) × (days / 365). Day-count basis is Actual/365 simple (`from` inclusive, `to` exclusive). Interest is rounded to 2 decimal places and the rounding is in `workings`. Not legal advice. Computes over the cited series as of `last_confirmed` — the same materialized value as `GET /v1/{country}/statutory-interest`, including derived series. No compounding and no jurisdiction-specific day-count. No numeric rate after materialization (mechanism-only, for example GH) → 422 free, with the series notes; nothing is sold. `days` and `from`/`to` that disagree → 400 free. Unknown country or missing series → 404 free. $0.02 - `POST /v1/answers/settlement-date` `{trade_date, calendars[], business_days | market + instrument_class}` — T+n on intersected **national statutory** calendars, with a per-day trail and the cited market cycle. Not a CSD calendar. Cycles we refuse: `GET /settlement-conventions` (free). $0.02 - `POST /v1/vat/determine` `{seller_country, buyer_country, buyer_type?}` — place of supply, who accounts, rate basis, registration trigger, cited to the statute. Verified ruleset: EU, UK, South Africa. Wallet-only buyer → B2C-default, flagged. Out-of-scope pairs refused free (422), never guessed. $0.05 ## Series lookup (not a dump) `GET /v1/{country}/{series}` — current value, citation, `last_confirmed`, `stale`. `?as_at=YYYY-MM-DD` — the value **in force** that day (payroll restatements). Refuses rather than falling back to today. `GET /v1/{country}/{series}/history?from=&to=` — $0.003. Changes + freshness (FREE, unmetered): GET /v1/changes?since=YYYY-MM-DD — what changed, plus how many of our 378 series were re-verified against their official source in the last 1/7/30/90 days, and which one has gone longest without a check. `since` is optional (defaults to 30 days). After a first paid call, poll this or POST /alerts instead of re-buying the series to see whether it moved. Next window, still free: `GET /v1/calendar`. `reverify_by` is derived; `status: unknown` means no `effective_to` and no invented date. We do not parse notes. Push remains `POST /alerts`. `GET /v1/all` — regional snapshot, $0.02. Do not enumerate 34 × 12 paths here. `GET /catalog` (free) lists every series with source, freshness and `confidence`. Filter: `GET /catalog?confidence=primary`. Point-in-time example: `GET /v1/za/vat?as_at=2023-06-15` → `point_in_time: true`, `superseded_on`. A 2023 question that returned today’s 15% would be the wrong number in the right shape. ## Provenance and certified extracts - `GET /provenance` (free) — fleet snapshot coverage - `GET /provenance/{country}/{series}` (free) — SHA-256, first-verified, last-changed, reachability - `GET /v1/certified/{country}/{series}` ($0.10) — value + evidence chain + Ed25519 signature. Refuses 422 uncharged when the source is blocked, broken, or not fingerprinted. Certifies that the cited document supported the value on the stated date — **not** that no newer instrument exists elsewhere. ## Answer receipts (included in the answer price) When a caller pays for a one-shot answer and sets `receipt:true`, the paid HTTP 200 includes an Ed25519-signed receipt they can file and verify later. Default is false — omit the field, or send false, and the answer JSON is unchanged. - Request: `receipt:true` on paid `POST /v1/answers/*` bodies (wage-check, vat, working-days, settlement-date, income-tax, statutory-interest, payroll, employment-cost where this brand lists them). Not on `POST /v1/vat/determine`. Not on series GETs. - Response: the receipt object embeds only on a paid HTTP 200. `kind` is `answer_receipt`. Unpaid HTTP 402 and free 4xx refusals do not include a receipt. Charge behaviour is unchanged. - Verify: `GET https://afriref.dev/certified/public-key` (free). Answer receipts use that same key, the same `key_id`, and the same canonical JSON rule (keys sorted recursively, no whitespace) as series certified extracts. - **NOT** the same thing as a series certified extract. `GET https://afriref.dev/v1/certified/{country}/{series}` ($0.10) is a separate artifact: one series value plus its citation, archived-source fingerprint and verification chain. An answer receipt only covers the computation over the cited series as of each series' `last_confirmed`. It is not a series certified extract and it is not legal advice. No extra charge beyond the answer's existing price. ## After you pay once — subscribe to the next gazette Reference values fail silently. A threshold that stood for 17 years moves in one budget speech and every hard-coded copy of the old number becomes wrong overnight (South Africa's VAT registration threshold, 1 April 2026 — R1 million became R2.3 million; https://afriref.dev/accuracy). We fetch and hash every cited source daily, so we know WHEN a value changes, not just what it is. If you have already paid for a series, bind one of these before you cache it. - GET https://afriref.dev/v1/changes?since=YYYY-MM-DD — FREE, unmetered change + freshness feed. What changed, plus how many of our 378 series were re-verified against their official source in the last 1/7/30/90 days, and which one has gone longest without a check. `since` is optional (defaults to 30 days). Poll this; do not re-buy the series to find out whether it moved. - POST https://afriref.dev/alerts {url, series: ["za/vat-registration-threshold", ...]} — HMAC-signed webhook the moment a series you watch changes. REGISTERING IS FREE and the first 3 deliveries are free — after that each delivery is $0.05 (refunded when a webhook fails to send). Patterns: "za/vat-registration-threshold", "ke/*", "ng/policy-rate", "*". Max 20. - The same POST also watches DOCUMENTS: sources: ["", ...] (exact URLs from any series' source.url — we fingerprint 1,500+ cited official documents with SHA-256 daily). You get a source.changed event when the bytes change, carrying old/new sha256 and which series cite it. The event asserts only that the DOCUMENT changed; value changes are decided by re-verification and arrive as series.changed. URLs we do not fingerprint are refused free (error source_not_fingerprinted) and logged as requests. - Try: series ["za/vat-registration-threshold","ke/minimum-wage","ng/policy-rate"] - After a wage-check or a ZA VAT read, bind the series on POST /alerts so the next gazette does not silently invalidate the answer you already paid for. Certified extracts ($0.10) freeze one moment for filing. Alerts + /v1/changes (past) + /v1/calendar (reverify window) are how you find out that moment is over. Use all three. OpenAPI: https://afriref.dev/openapi.json — operations `changes`, `calendar`, and `registerAlert`, tags `Discovery` and `Alerts`. Pricing: https://afriref.dev/pricing (change feed free; re-verification calendar free; alert registration free). ## Re-verification calendar (free) `GET /v1/calendar` is free and unmetered. A 402 here is a gate bug — do not pay. Optional `country` (ISO 3166-1 alpha-2) and `series`. A country outside this brand is 404 free. A country that is not two letters is 400 free. A valid country with no matching series is 200 with an empty `entries` list. `GET /v1/changes` is past moves and freshness. `POST /alerts` is push when a served value moves. This route is not the holiday calendar and not a promised future gazette. - `reverify_by` is the UTC calendar date of `last_confirmed` + `update_cycle_days`, the same window that sets `stale`. It is this service's re-verification cadence, not a government announcement date. - `status: "known"` includes `next_effective_known` only when current `effective_to` is a non-empty string, and `next_effective_basis` is `effective_to`. That date is the recorded end of the value we currently serve (coverage or vintage), not an MPC, budget, or wage-review date. - `status: "unknown"` when `effective_to` is absent. The series is still listed, with `last_confirmed`, `stale`, `update_cycle_days`, and `reverify_by`. `next_effective_known` is omitted. Unknown stays free. We do not parse notes for next dates. We do not read history rows for a next change. Sort is `country` ascending, then `series` ascending. ## Calendar coverage (Africa-specific) Holiday calendars currently span 2026–2027 and are not uniform. - Range outside coverage → free 422 `calendar_coverage_exhausted` with the exact window. We do not extrapolate moving feasts or ad-hoc proclamations. - **23 calendars** in this region have a **permanent** horizon (`calendar_not_publishable_in_advance`, `permanent: true`): Islamic dates wait on moon sighting; Hebrew / lunisolar festivals are gazetted annually. Do not retry expecting the year to appear. The refusal names the blocking holidays. - `date: null` + `pending_window` = statutory holiday, date not yet gazetted. We publish the placeholder rather than invent a Friday. - `name` is stable across years; `year-specific` commentary lives in `note`. This is why a bare “holidays for country= + year=” feed is the wrong substitute when the job is “is Monday a working day under the Kenya Public Holidays Act?” ## What we refuse (free, before payment) - Out-of-coverage calendar ranges; permanent unpublished religious dates. - No single statutory rate (we will not collapse a mid-transition VAT to one number). - Out-of-scope `/v1/vat/determine` pairs. - Settlement dates with no verified convention, or a convention not in force on the trade date (`no_verified_convention` / `convention_not_in_force_on_trade_date`). - Series we could not verify against their own statute — omitted, 404, not estimated. ## Confidence and `effective_from` Every series has `confidence`: `primary` (no recorded limitation — absence of a known problem, not a fresh re-read), `secondary` (primary instrument unread, often bot-blocked portals), `attested` (no public primary; today: some BW / CF instruments), `derived`. Non-primary rows carry `confidence_note`. `effective_from_basis: "restatement"` means the date is the current legal basis (annual finance law), not a change. Do not diff it as a rate move. `?as_at=` before that floor refuses. ## Discovery - x402 map: https://afriref.dev/.well-known/x402.json - Agent card: https://afriref.dev/.well-known/agent.json - OpenAPI: https://afriref.dev/openapi.json - MCP (streamable HTTP): https://afriref.dev/mcp — free tools `list_series`, `get_public_holidays`, `get_changes`, `get_calendar`; `register_alert` (Register: $0 · Delivery after trial: $0.05); paid `get_series`, `get_series_history`, `get_snapshot` Retention: GET https://afriref.dev/v1/changes (free, past moves) · GET https://afriref.dev/v1/calendar (free; reverify_by derived; status unknown omits any next date; notes are not parsed) · POST https://afriref.dev/alerts (register free; delivery after trial $0.05). OpenAPI tag `Alerts`: https://afriref.dev/openapi.json Independent service, not affiliated with any government. Verify against the cited official source before legal or financial use. ## Free trial (answers and jobs) 3 free calls per day per IP, shared across POST /v1/answers/* and POST /v1/jobs/*. No header needed (`X-Free-Trial: 1` or `?free_trial=1` is accepted but not required). Only successful calls count; a refused call gives its trial call back. A POST with an empty body gets the normal 402 and does not use the trial; a request with an API key or a payment header skips the trial. Not for /v1/all, series or certified extracts. Response headers `X-Free-Trial-Remaining` / `X-Free-Trial-Limit` / `X-Free-Trial-Reset`.