Data sources and method: where every number comes from
Every source we read, how often we read it, what we keep, how we catch ourselves being wrong — and an explicit list of what we do not cover.
An API that answers with a number is asking you to trust it. This page exists so you do not have to: it lists every source we read, how often we read it, what we store alongside each value, the checks that are designed to make us fail loudly rather than quietly — and, at the bottom, the things we do not have. That last section is the one worth reading first.
Sources
| Archive | Source | Read |
|---|---|---|
| Sanctions — six official lists | US OFAC (SDN.XML) · UN Security Council consolidated · EU FSD consolidated · UK OFSI ConList · Switzerland SECO · Canada SEMA | daily, 06:20 Europe/Istanbul |
| Exchange rates | TCMB (Central Bank of the Republic of Türkiye) daily bulletin | every business day, 15:45 |
| Turkish fuel prices | Distributor dealer price lists, 81 provinces × 7 products, back to 2009 | daily, 06:20 |
| LLM prices & lifecycle | OpenRouter model catalogue (400+ models, 50+ providers) | daily, 04:10 |
| MCP tool surfaces | Official Model Context Protocol registry, then each remote server's own
tools/list |
daily, 03:20 |
What is stored with every value
A number on its own is worthless in an audit three years later. Every point in the time-series archive carries three extra fields:
source_url— the exact address the value was read from.content_hash— a hash of the document as it was on that day, so you can tell whether the source changed underneath a value.fetched_at— when we read it, which is not the same as the date it applies to.
Corrections are written in place rather than appended, so a late fix to a source does not leave two contradictory answers — but the observation date is preserved either way.
How we try to catch ourselves being wrong
A scraped table must prove its shape
Fuel prices are read from an HTML table. If the publisher reorders or renames a column, the naive scraper keeps working and starts writing the wrong number into the right field — and price data has no way back once it is wrong. So the column header is verified before any row is accepted; if the header is not what we expect, the job fails and writes nothing. A broken ingest is recoverable. A silently wrong one is not.
A response that violates its own schema is refunded
Every endpoint declares an output schema and the response is validated against it before it leaves
the process. If a handler returns something that does not match, the call fails with
output_contract_violation and the credits are returned automatically. You are never
charged for an answer that did not keep its own promise.
Point-in-time answers admit their own limits
asOf screens against the lists as they stood on a past date. Our archive only goes back
as far as we have been running — so if you ask for a date before it begins, you do not get a confident
wrong answer. You get the earliest snapshot we hold plus an explicit warning saying so, and the
coverage window is reported in the response.
The MCP index never calls anything
Indexing MCP servers means connecting to other people's infrastructure. The measurement boundary is
hard-coded: only initialize and tools/list are ever sent —
tools/call is never invoked, so indexing can never trigger an action on an indexed
server. Requests are spaced per host rather than fired in parallel.
The archive is backed up because it cannot be rebuilt
Today's sanctions list can be downloaded by anyone. Last March's cannot — the sources publish the current state and overwrite it. That makes the daily snapshot the one asset here that money cannot re-create, so it is dumped nightly and copied to storage outside the server.
What we do not have
Read this before integrating. We would rather lose the sale than the trust.
- No PEP data. Politically exposed persons are a separate dataset and we do not hold it. Screening covers sanctions lists only. (The endpoint used to be named "Sanctions & PEP Screening"; that was wrong and has been corrected.)
- No Australian DFAT list. The source does not respond to our server (times out); if that changes it will be added.
- No Japanese METI list. Published as PDF only — deliberately excluded rather than parsed unreliably.
- Fuel prices are Türkiye only, and only the products a distributor publishes.
- The sanctions archive starts when we started. It is shallow today and deepens by one day per day; it can only ever accumulate forward. Any tool claiming a deep back-archive it did not collect is claiming something it cannot have.
Corrections
If a value here is wrong, that is a defect and we want it. Use the feedback endpoint or the address on the docs page; reports that include the request id are fastest to trace, because every response carries one.
Frequently asked
Where does the sanctions data come from?
Six official publishers, read directly and daily: US OFAC, the UN Security Council, the EU consolidated list, UK OFSI, Switzerland (SECO) and Canada (SEMA). The lists are free and public; what is sold is the reduction of six unlike XML schemas into one model, transliteration-aware matching, and the dated snapshot of each day.
Do you screen politically exposed persons (PEP)?
No. PEP data is a separate dataset and we do not hold it. Screening covers sanctions lists only.
How far back does the point-in-time (asOf) archive go?
Only as far back as we have been collecting, and the response tells you where that boundary is. Asking for an earlier date returns the earliest snapshot held together with an explicit warning rather than a confident wrong answer.
What happens if a source changes its format?
For scraped tables the column header is verified before rows are accepted; if it does not match, the ingest fails and writes nothing. A failed ingest is recoverable, a silently wrong one is not.
Does indexing MCP servers execute anything on them?
No. Only initialize and tools/list are sent. tools/call is never invoked, so indexing cannot trigger an action on an indexed server.
Endpoints used here
Open the reference, run it in the browser, no key required.
/v1/tr/fuel/pricesOpen the reference, run it in the browser, no key required.
/v1/series/historyOpen the reference, run it in the browser, no key required.
/v1/model/archiveOpen the reference, run it in the browser, no key required.
/v1/mcp/indexOpen the reference, run it in the browser, no key required.