afriref › Accuracy

Accuracy record

Where widely-published reference values are wrong, and where ours were. Every finding names the governing instrument and tells you how to check it without trusting us.

This exists because provenance is the product. Anyone can publish a number. The claim worth making is that a number was read from the instrument that creates it, on a date, and is re-checked — and that claim is only worth anything if we also publish what we got wrong.

Findings come from reading primary sources, not from comparing one aggregator against another. Where a discrepancy could not be reproduced from a public document, it is not listed. We name instruments, not vendors.

Where commonly-published values are wrong

2 findings.

Uganda — the 2026 PAYE reform is widely reported as in force; it is not law yet

Commonly published: That Uganda's PAYE tax-free threshold rose from UGX 235,000 to UGX 335,000 a month on 1 July 2026 under the Income Tax (Amendment) Act 2026. Big-4 previews describe the new bands as current, at least one bill tracker states the President assented, and an outside audit of this service scored our schedule stale for not serving them.

What the source actually says: As of 7 August 2026 there is no Income Tax (Amendment) Act 2026. Parliament passed the Bill, the President RETURNED it without assent on 14 July 2026 (objecting to an unrelated casino-winnings clause), Parliament re-passed it with his recommendations on 4 August 2026, and it awaits assent. The URA's own PAYE rates page still publishes the UGX 235,000 schedule. The reform is also larger than the headline: the gazetted Bill abolishes the 10% band entirely and inserts a new 25% band, so it is a restructure, not a threshold lift. Its commencement clause names 1 July 2026, so on assent it will apply retroactively — which is precisely why serving it early would still be wrong: a payroll run today must use the law in force today, and the retrospective correction is the employer's to make when assent comes.

Instrument: Income Tax (Amendment) Bill 2026 (Bill No. 6, Bills Supplement No. 2, Uganda Gazette No. 33 Vol CXIX, 27 March 2026), clauses 1 and 20; Parliament of Uganda news of 14 July 2026 (return without assent) and 4 August 2026 (re-passage)

Check it yourself: Open the URA PAYE rates page and read the threshold. Then open Parliament of Uganda's news item on the President returning the two tax Bills. A source that says the new bands are in force cannot cite an Act number and gazette for them, because none exists yet.

South Africa — the VAT registration threshold is no longer R1 million

Commonly published: That compulsory VAT registration in South Africa is triggered at R1 million of taxable supplies over 12 months, with voluntary registration from R50 000. The figure is unusually deeply embedded: it stood unchanged for roughly seventeen years, long enough to be hard-coded into onboarding checks, accounting-software defaults, guidance notes and training material.

What the source actually says: The compulsory threshold is R2.3 million and the voluntary floor is R120 000, both with effect from 1 April 2026. SARS states it directly: 'From 1 April 2026, the compulsory VAT registration threshold increased from R1 million to R2.3 million.' The registration page carries the new figure in its own words — registration is required 'where the value of taxable supplies made in any consecutive 12 month period exceeded or is likely to exceed R2.3 million'. A check still using R1 million will tell a business with R1.5 million of turnover that it must register when it need not, and will not flag that an already-registered vendor below R2.3 million may now have grounds to deregister.

Instrument: Value-Added Tax Act 89 of 1991 registration threshold as increased with effect from 1 April 2026, announced in Budget 2026 and published by SARS on its VAT registration page and in its Budget 2026 FAQ

Check it yourself: Open the SARS 'Register for VAT' page and read the threshold in the compulsory-registration paragraph. If a source says R1 million, check whether it has been updated since March 2026 — that single figure dates the document.

Where we were wrong

12 errors found in data or code we had already shipped. All are fixed; each is listed with what caused it.

Thirteen tax series wore the current code year as their effective date

What was wrong: Several francophone African countries re-enact their entire tax code or annexe fiscale every January. Thirteen of our VAT, corporate-tax and income-tax series (Côte d'Ivoire, Niger, Gabon, Congo, DR Congo, and Mali's 2011 guess) stamped effective_from with the CURRENT re-enactment — an unchanged 18% VAT dated 2026-01-01 — which reads as a rate change that never happened. An outside audit called it 'effective-date inflation' and it was our most systemic metadata fault, the same class of error as the Indonesia correction below: dating the value to the instrument rather than to the rate. The fix ran gazette-level research on every affected series, each finding adversarially re-verified. Eleven series now carry their researched origin — among them Côte d'Ivoire VAT 18% from the annexe fiscale 2003 (per the DGI's own amendment annotations), Côte d'Ivoire corporate 25% from the annexe fiscale 2008 (Journal Officiel facsimile read in full, refuting the widely-believed '2021 cut from 30%' — 30% was never the general rate), Niger VAT 19% from a mid-2000 rectification law, Niger's 30%/ITS pair from the loi de finances 2010 gazette, Gabon corporate 30% from the loi de finances 2013, Congo VAT 18% from the 1997 law that instituted the tax (signed original read on the SGG's own host), and DR Congo's 30% and IRPP barème from the 2018/2019 finance laws that actually set them. Where the origin is corroborated but the gazette text is unobtainable (Gabon VAT's 1995 institution, Mozambique's IRPS schedule, Congo corporate), the value now carries a machine-readable `effective_from_basis: "restatement"` instead — the date is a verified floor, not a change — because silently keeping the misleading stamp and silently guessing an older date are both wrong. One suspect survived scrutiny intact: Congo's 2026 income-tax date is genuine (the finance law really did rewrite the barème).

Instrument: Per-series gazette research, each cited in the series' own source and notes; the flag is documented at /docs and in the OpenAPI schema

Check it yourself: GET /v1/ci/vat — effective_from 2003-07-07 with the 2001 20% window in history. GET /v1/ga/vat — effective_from_basis 'restatement' with the researched origin stated in notes. Diff the /changes feed: restatement rows are marked so a feed consumer cannot mistake a re-enactment for a change.

Nine citations pointed at something other than the instrument

What was wrong: Provenance is what this product sells, and an outside audit found a minority of citations that did not carry their value: a URA sector page cited for Uganda's VAT rate while naming an Order whose text it is not; Mozambique's income-tax schedule pinned to Artigo 54-A — the capital-gains regime added in 2025, whose ladder is deceptively identical in shape to the general Artigo 54 schedule; Côte d'Ivoire's minimum wage cited to a private legal blog, with an agricultural SMAG figure attributed to a decree that (read article-by-article) contains no SMAG at all — that figure is now WITHDRAWN rather than re-homed, because no instrument for it could be identified; Nigeria's minimum wage cited to the State House press release rather than any legal text; Algeria's policy rate cited to the central bank's statistics table rather than the Instruction that sets it; Angola's policy rate cited to an SPA route that serves nothing to a non-browser client; DR Congo's SMIG cited to a news article. Each is now re-pointed at the best verifiable instrument — including Algeria's Instruction n°02-2026 fetched from the Bank's own host, Uganda's operative 2006 Order on ULII, and the DRC Journal Officiel scan that also disproved the audit's own claim that we cited the wrong law number (the JO shows 23/053 is the IS/IRPP reform; 23/052 is procedures). Where no official host serves the text (Nigeria's gazetted Act, Côte d'Ivoire's paywalled JO, DRC's decree), the citation now says exactly what it is and is not, in two labelled parts. One non-error worth recording: BEAC serves its CURRENT rate decision from a reused 2016-dated URL slot that is overwritten at each session — the citation was right all along, and the mechanics are now documented so a changed hash reads as a new decision, not a broken link.

Instrument: Each corrected citation names its instrument in the series' source field; access mechanics (bot-blocks, rotating slots, paywalled gazettes) are disclosed in notes

Check it yourself: GET /v1/dz/policy-rate — the source is the Banque d'Algérie Instruction PDF, not a statistics page. GET /v1/ci/minimum-wage — no SMAG is served, and the notes say why. GET /v1/ug/vat — the source URL is the Order's text.

South Africa — we applied the prescribed-rate formula on the wrong date

What was wrong: Our statutory-interest series computed the prescribed rate of interest (repo + 3.5 points) and stamped it with the repo change's own effective date. The statute says otherwise: s 1(2)(c) of the Prescribed Rate of Interest Act, as substituted in 2015, makes each change effective from the FIRST DAY OF THE SECOND MONTH following the month in which the repo rate is determined. So when the repo rose to 7.0% on 29 May 2026, we served 10.5% from that day — but the legally binding rate remained 10.25% through 30 June, becoming 10.5% only on 1 July 2026. Anyone computing mora or judgment interest for the 29 May–30 June window from our answer was a quarter-point high. Every historical transition window carried the same class of error. An outside audit caught the live window. The derivation now applies the statutory lag, keys it on the DETERMINATION month (the MPC announcement — which matters when an announcement and the repo's effect date straddle a month end, as on 31 July / 1 August 2025), rebuilds every historical window the same way, and surfaces a determined-but-not-yet-effective change as a pending note instead of serving it early. Our own note had even described the lag while the code ignored it — a description of the law is not an implementation of it.

Instrument: Prescribed Rate of Interest Act 55 of 1975, s 1(2)(a)-(c), as substituted by s 3 of the Judicial Matters Amendment Act 24 of 2015; SARB MPC statement of 28 May 2026

Check it yourself: Ask for ZA statutory-interest. effective_from should read 2026-07-01 while the underlying repo change reads 2026-05-29 — two different dates, two months apart in the way the statute prescribes. The Minister's own gazette notice for the September 2025 window (GN R.6668) shows the same arithmetic.

Cameroon — we served the agricultural SMIG as the headline minimum wage

What was wrong: Cameroon's 2023 decree splits the SMIG into three tiers: 60,000 XAF/month for the general run of private employment, 45,000 for agriculture and assimilated activities, and a State-employee tier. We documented all three correctly in the notes — and then served 45,000 as the headline value, on the reasoning that it was the lowest floor binding a private employer. An outside audit made the fair point that this understates the floor for most workers: a caller asking 'the minimum wage in Cameroon' means the general tier, and a wage-compliance check that measured a non-agricultural salary of, say, 50,000 against our headline would have passed a wage 10,000 below that worker's actual statutory floor. The headline is now 60,000 — the decree's own residual category — with the agricultural and State floors served as named schedules a caller must ask for, matching how we model every other multi-floor country. The underlying figures were never wrong; the choice of which one to lead with was.

Instrument: Décret n°2023/00338/PM du 21 mars 2023, article 1er; Décret n°2024/0168/PM du 23 février 2024 (State tier)

Check it yourself: GET /v1/cm/minimum-wage: value 60,000 XAF/month with wage_schedule entries for 'agricultural' (45,000) and 'state-employee' (43,969). The decree's article 1 lists all three.

Angola — we served a personal income tax table that had been superseded twice

What was wrong: Our IRT Group A table was the 2020 one (Lei 28/20: exemption Kz 70,000/month, thirteen escalões). It had been amended twice since: Lei 15/23 (OGE 2024) raised the exemption to Kz 100,000 from 1 January 2024, and Lei 14/25 (OGE 2026) raised it to Kz 150,000 with a reworked eleven-escalão table from 1 January 2026. For over two and a half years we under-stated the exempt threshold and over-taxed low earners in any payroll computed from our table. The current table is now read digit-for-digit from the gazette (Diário da República I Série n.º 244 of 30 December 2025, Anexo I), including a genuine statutory oddity we serve as published: the second escalão keeps a parcela fixa of Kz 12,500 although the band it compensated was abolished, so the tax jumps from zero to Kz 12,500 + 16% at Kz 150,001. The 2024–2025 interim window is recorded with its instrument and parameters but its full parcela-fixa column is REFUSED: the 2023 gazette is not machine-readable on any official host and the available mirror disagrees with the succeeding gazette by small amounts, which is exactly the situation this product refuses to paper over. The root cause was treating an amendment-free code (the CIRT) as a stable citation while Angola moves the table through annual budget laws — the series now names the OGE cycle and carries a dated re-verification deadline.

Instrument: Lei n.º 14/25, de 30 de Dezembro (OGE 2026), art. 21.º(3) e Anexo I, Diário da República I Série n.º 244; Lei n.º 15/23, de 29 de Dezembro (OGE 2024), art. 20.º(3)

Check it yourself: GET /v1/ao/income-tax: exemption to Kz 150,000, eleven escalões, top rate 25% above Kz 10,000,000, cited to the gazette PDF on ucm.minfin.gov.ao. Ask ?as_at=2025-06-01 and the answer is a refusal that names Lei 15/23 rather than a table we could not verify.

Mozambique — our cited source page went stale and took us with it

What was wrong: We served Mozambique's July-2025 sectoral minimum-wage table into August 2026. The 2026 revision (Diplomas Ministeriais 34/2026–41/2026, gazetted 20 May 2026, retroactive to 1 April 2026) had raised seventeen of the eighteen rate lines by 3–9.28%. The uncomfortable part is WHY we missed it: our citation pointed at the INSS 'salários mínimos em vigor' page, and that page still serves the July-2025 table today — so every re-verification pass truthfully confirmed that our value matched our cited source, while the law had moved underneath both. 'Last confirmed' meant 'the page still says what we recorded', not 'this is still the law', and for three months those were different things. The table is now read from the Boletim da República itself (all eighteen lines, including the one deliberately unchanged rate — pesca de kapenta — and the gazette's 17,924.17 for micro-finanças where several advisories print 17,924.57), the citation has moved off the INSS page onto the gazette, and the series carries a dated instruction to watch the gazette rather than the agency page at the next annual round.

Instrument: Diplomas Ministeriais n.º 34/2026 a 41/2026, de 20 de Maio, Boletim da República I Série n.º 94, de 20 de Maio de 2026

Check it yourself: GET /v1/mz/minimum-wage: effective_from 2026-04-01, cited to BR I Série n.º 94. Compare the INSS page, which still shows the July-2025 table — the divergence between our value and our former source is the finding.

Euro area — we served the wrong ECB rate for twelve of twenty years

What was wrong: Every euro-area policy-rate series describes itself as the ECB DEPOSIT FACILITY RATE, and its notes say so twice over: 'the ECB steers the stance through the DEPOSIT FACILITY RATE, which is the rate served here'. Twelve of each series' twenty rows carried the MAIN REFINANCING rate instead — 216 rows across 18 countries. The gap is 40 to 50 basis points and it reached callers: a point-in-time query for 1 January 2023 returned 3.0% labelled as the deposit facility rate, when the deposit facility rate was 2.0%; for June 2018 it returned 0.0% when the rate was -0.40%. Anyone pricing off 'the ECB policy rate' for a 2023 date was 100bp out. The MRO is not a defensible substitute here even though it WAS the headline policy rate before the ECB's 2024 framework review, because this service already publishes the MRO separately and correctly as `ecb-main-refinancing-rate` in all twenty of these countries — so the MRO rows inside policy-rate duplicated a series we already served while contradicting policy-rate's own definition. The history has been rebuilt from the ECB Data Portal series FM.D.U2.EUR.4F.KR.DFR.LEV rather than patched, because the two rates do not move on identical dates: the deposit facility rate changed on 18 September 2019 when the main refinancing rate did not, so the old history was missing a change point altogether. Coverage now runs from each country's euro adoption date instead of an arbitrary 2018 floor, and every row is cited to the ECB and marked primary, replacing citations to the BIS compilation.

Instrument: ECB Data Portal series FM.D.U2.EUR.4F.KR.DFR.LEV (key ECB interest rates, deposit facility)

Check it yourself: Ask any euro-area country for its policy rate as at 2023-01-01. It should answer 2.0%, not 3.0%. Ask as at 2019-11-01 and it should answer -0.5%. Ask Croatia as at 2010 and it should REFUSE — Croatia adopted the euro on 2023-01-01 and the ECB rate was not its policy rate before that.

Germany — we refused five and a half years of VAT we could have answered

What was wrong: Asked for the German standard VAT rate as at any date from 1 January 2021 onward, we refused, stating that the most recent value we held 'lapsed on 2020-12-31' and that we held 'no successor covering that date'. We held the successor: 19%, in force since 1 January 2007 and never repealed. Germany cut the standard rate to 16% for six months in 2020 (Zweites Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512) and 19% resumed automatically on 1 January 2021. Our point-in-time resolver picked the row with the latest START date rather than the row actually IN FORCE, so once the temporary cut expired it kept winning and the open-ended rate it had interrupted was never reconsidered. Two things make this worse than a gap: the refusal asserted something false with specifics attached, and it is the second false refusal we have published (after Indonesia), from a different cause — there the date was wrong, here the date was right and the resolver was wrong. The resolver now selects on the interval a value covers rather than on when it began, and a data-contract checker flags any series whose history overlaps its current value so the shape is caught rather than the symptom.

Instrument: Umsatzsteuergesetz § 12(1); Zweites Corona-Steuerhilfegesetz of 29 June 2020 (BGBl. I 2020 S. 1512)

Check it yourself: Ask for Germany's VAT rate as at any date in 2021 or later. It should answer 19%. Ask as at September 2020 and it should answer 16% and tell you it was superseded on 2021-01-01.

Ninety-nine historical values we serve without a citation

What was wrong: Point-in-time reads (?as_at=) can return a historical value that carries no source of its own. 99 of the 2,633 historical rows we hold are like this, across 32 series in 12 countries — among them GB VAT before 2011, Canadian CPI, Indian and Italian policy rates, and Korean and Philippine wage history. Until 2026-08-03 the `source` field was simply ABSENT from those responses, which meant a paid answer quietly dropped the one thing this service sells, and a caller could only notice by comparing keys against another response. They now carry `source: null` and a `provenance_gap` message naming the limitation. We chose to keep serving them rather than withhold them: each is dated and we believe each correct, and removing real coverage over a metadata gap would help nobody. But they do not carry the evidence the rest of the dataset does, and you should not treat them as if they do. Separately, historical rows generally do not carry a `confidence` level; we deliberately do NOT inherit the current value's, because that would assert a verification standard nobody applied to the older figure.

Instrument: (none — that is the finding)

Check it yourself: Request GET /v1/gb/vat?as_at=2010-06-01. The response carries source: null and a provenance_gap message. Compare against GET /v1/gb/vat, which is fully cited.

Namibia — we were missing Genocide Remembrance Day

What was wrong: 28 May was declared by Proclamation 19/2024 (Government Gazette 8373). We had not carried it. Same class of failure as Colombia: a holiday created by an instrument issued after we first built the calendar.

Instrument: Proclamation 19/2024, Government Gazette 8373

Check it yourself: Compare our /v1/na/public-holidays against the proclamation.

Angola — we modelled a repealed article

What was wrong: We were missing 23 March and were applying the pre-2018 Artigo 6.º weekend-transfer rule, which had been amended. Two errors compounding: a missing day, and a transfer rule that moved other days incorrectly.

Instrument: Lei that amended Artigo 6.º (post-2018 text)

Check it yourself: Compare our /v1/ao/public-holidays against the consolidated law currently in force.

We returned HTTP 500 on two countries for part of a day

What was wrong: A guard added to stop working-days selling wrong answers past our calendar coverage did not account for holiday entries with a deliberately null date (ungazetted placeholders). Sorting put null last and the coverage computation threw. Trinidad and Guyana returned 500 until it was fixed. The guard itself was correct and necessary; the null-handling was not.

Instrument: (internal — commit 8087e21 through d4dc14b)

Check it yourself: POST /v1/answers/working-days for tt or gy. It now refuses or answers, never 500s.

What changed so these are caught sooner

The costliest errors we have found share one cause: a value that was correct when written and was invalidated later by a new instrument. Freshness checking cannot catch that, because the value never changed — what changed was the world. Two things now run against it:

Neither is sufficient. Both are better than a last_confirmed date that only says someone looked.

Found something wrong?

Send the instrument. [email protected] — corrections with a primary source are acted on and credited here.