Quick start
curl https://invoicesnap.net/api/index.jsonThat is the whole authentication story. Every endpoint below responds to a plain GET with Content-Type: application/json and Access-Control-Allow-Origin: *.
Endpoints
/api/index.json
Index of every endpoint, plus the terms of use.
{
"version": "1.1.0",
"lastUpdated": "2026-08-14",
"license": { "name": "Creative Commons Attribution 4.0 International", ... },
"source": { "name": "InvoiceSnap", "url": "https://invoicesnap.net", ... },
"endpoints": [ ... ]
}/api/currencies.json
Supported currencies with symbol, symbol spacing and decimal places.
{
"count": 10,
"currencies": [
{ "code": "USD", "name": "US Dollar", "symbol": "$", "decimals": 2 },
{ "code": "JPY", "name": "Japanese Yen", "symbol": "¥", "decimals": 0 }
]
}/api/invoice-number-formats.json
The four common numbering schemes, with pattern, examples and the three rules that matter more than the format.
{
"count": 4,
"formats": [
{
"id": "year-prefixed",
"name": "Year-prefixed",
"pattern": "{YYYY}-{n:3}",
"example": ["2026-001", "2026-002"],
"bestFor": "Anyone who wants the year visible at a glance."
}
]
}/api/invoice-requirements.json
Every jurisdiction we have researched, with the publisher, URL and retrieval date attached to each individual field.
{
"count": 10,
"jurisdictions": [
{
"slug": "united-kingdom",
"taxName": {
"value": "VAT",
"source": { "publisher": "HMRC", "title": "...", "url": "...", "retrievedAt": "..." }
}
}
]
}/api/invoice-requirements/{countryCode}.json
A single jurisdiction, by lower-case country code.
curl https://invoicesnap.net/api/invoice-requirements/gb.jsonThe four fields every payload carries
| Field | What it tells you |
|---|---|
version | Semantic version of the payload shape. A breaking change to the shape bumps the major number. |
lastUpdated | When the dataset as a whole last changed. Individual values additionally carry their own retrievedAt. |
license | CC BY 4.0, with the attribution string we would like if you reuse it. |
source | Where the data came from, plus links to the documentation and the methodology behind it. |
Those four exist because a dataset without them does not get cited. A number with no provenance and no date is something you have to verify yourself anyway, at which point you may as well have looked it up at the source.
How to read a sourced field
Fields in the jurisdiction dataset are not bare values. Each one is an object with the value and its provenance:
"retentionYears": {
"value": { "years": 7, "note": "..." },
"source": {
"publisher": "Belastingdienst",
"title": "Hoe lang moet u uw administratie bewaren voor de btw: 7 of 10 jaar?",
"url": "https://www.belastingdienst.nl/...",
"retrievedAt": "2026-08-14"
}
}If a field is absent, it means we could not confirm it against a primary source, so we did not publish a value. Absence is not a claim that no rule exists. Handle missing fields rather than assuming a default, and see the methodology for what disqualifies a value from publication.
Stability and changes
- Field names are stable within a major version. New optional fields may be added; existing ones are not renamed or repurposed.
- Values change when an authority changes a rule, which is the point. Watch
lastUpdated. - These are static files behind a CDN. Cache them; do not poll them.
Building something with this
InvoiceSnap is built and maintained by FusionStudios, a web design studio in the Netherlands. If you are putting this data into a product and want the surrounding tool, widget or content structure built properly, see what FusionStudios builds. If you just want to tell us you are using it, the contact form is fine.