What SaysData does at each step between your AI’s question and the number — and the lists of what its checks refuse and warn about.
What SaysData does
Claude writes the answer, and whether it gets the numbers right is up to Claude. SaysData makes the official numbers easier to get, harder to get wrong and easier to interpret correctly.
Search thousands of official tables in plain language. Each result says what the table measures, where, over what period and how it’s broken down — so Claude can pick the right one, not just the first one.
Before a dataset can be queried, SaysData measures its file (units and scale, time format, missing and suppressed cells) and checks it against the agency’s published structure, its breakdowns and their members. Totals come from that structure where it marks them, and are otherwise recognised by their labels. A dataset whose file holds a breakdown or member that structure doesn’t declare, or that couldn’t be measured, is refused with a reason. Where a check has nothing to measure, the result says so.
Queries with a defect from the Refused list below are refused before they run, with what to fix. Those with a risk from the Warned list run, and come back with a warning and the measured numbers.
Tables come straight from the publishing agency. The numbers, codes and flags stay as published; preparation only reads numbers as numbers and turns cells the agency marks as suppressed into nulls.
Dataset descriptions and query results carry what it takes to read the numbers: units and scale, how missing cells read, the members recognised as totals, data-quality flags, warnings such as a total sitting beside its own parts, reading notes, the agency’s own footnotes, and the citation its licence asks for.
Every call is recorded with its exact arguments and outcome in your History, and each successful query’s run — the result as returned — opens at a private link, so you can see how an analysis was done. Running a query again reads each table as SaysData holds it then — only the current copy is kept, so the numbers can differ. Each dataset’s profile states the period the table covers, measured from the file; results carry the file’s own date where it has one, and each citation the date SaysData downloaded the file.
Guardrails
Two messages SaysData returned on 27 October 2026, word for word.
A query for Niger’s tax revenue that held every unit of measure the table publishes — rows in CFA francs beside rows with no currency, at two different scales:
The query was refused and nothing ran:
- slice "ner", UNIT_MULT [mixed-units]: slice ner holds 2 values in UNIT_MULT ("0", "6") and UNIT_MULT is neither pinned nor set to varying Fix: put UNIT_MULT in the slice's attributes: pin one value ({"values": ["0"]}) or set it to {"varying": true} and keep each value as its own series
- slice "ner", CURRENCY [mixed-units]: slice ner holds 2 values in CURRENCY ("XOF", null) and CURRENCY is neither pinned nor set to varying Fix: put CURRENCY in the slice's attributes: pin one value ({"values": ["XOF"]}) or set it to {"varying": true} and keep each value as its own seriesA query for national currency only, with each scale and currency kept as its own series, ran.
A query for wholesale sales in Canada and every province and territory in August 2026 returned Canada beside its provinces — right for a table, wrong for a sum or a ranking:
slice ws, "GEO_ID": "Canada" (1) is held beside members it contains. Summed with them, those members count more than once; ranked with them, it ranks among its own parts.
Traceable
Your history keeps each call Claude made — the search, the dataset, the exact query — with its outcome, including anything refused or warned. For each successful query it also keeps the run — the result as Claude received it — at a link that opens only for you. Each result’s citation gives the date SaysData downloaded the table, so you can tell whether the agency has published since.
| Tool | Dataset | Outcome | Details |
|---|---|---|---|
| execute_sql | Revenue Statistics in Africa - Comparative tax and non-tax revenues | Answered | |
| execute_sql | Revenue Statistics in Africa - Comparative tax and non-tax revenues | Refused — failed a query check | Refusal: mixed-units |
The calls behind the refusal example above.
The numbers, codes and flags are the agency’s own. Preparation does only two things:
Codes stay as the agency wrote them; their labels come with the dataset’s profile.
When a query reads a table, rows with no date and no value — placeholders some agencies publish for series without observations — are left out. If such a row ever carried a value, the result warns.
Sign up, add the connector, and ask your first question.
Connect SaysData to Claude