Indirect tax
VAT, GST and sales-tax rates, thresholds, net tax rates, pending law, return forms, and the determination of tax for a transaction.
| Operation | Summary |
|---|---|
POST /v1/tax/indirect/determine |
Determine the VAT treatment of a supply |
GET /v1/tax/indirect/net-tax-rates |
List net and flat tax rates by activity |
GET /v1/tax/indirect/net-tax-rates/thresholds |
List the eligibility limits of the net tax rate method |
GET /v1/tax/indirect/pending |
List pending VAT legislation |
GET /v1/tax/indirect/rates |
List the VAT rates in force |
GET /v1/tax/indirect/rates/history/{series} |
Get the history of a rate series |
GET /v1/tax/indirect/return-forms |
List the official VAT return forms in force |
GET /v1/tax/indirect/return-forms/{form_id} |
Get a VAT return form |
GET /v1/tax/indirect/thresholds |
List the VAT thresholds in force |
GET /v1/tax/indirect/thresholds/history/{series} |
Get the history of a threshold series |
POST /v1/tax/indirect/determine
Determine the VAT treatment of a supply
Where is the supply taxed, who is liable, and at what rate?
The request describes one supply (supplier and customer jurisdictions, B2B or B2C, type
of supply, date). The service picks the place-of-supply decision table for the pair of
countries, evaluates it, and looks up the rate in force in the taxing jurisdiction.
data.liable_party says who accounts for the tax, invoice_rate is the percent the
supplier charges on the invoice (0 under reverse charge or for an exempt supply),
accounted_rate the percent due, components the rates used, and trace the rule that
matched with its legal reference. meta.as_of is the tax point used.
Refuses with 404 for an unknown jurisdiction, a supply type that is not modelled for
that pair of countries, or no rate of the requested type on that date; with 422 when
several rates match and a category is needed, or when place_of_performance is
missing for a place-of-performance supply type. Not tax advice.
| Authentication | an API key, where the server requires one |
| Operation id | determine_v1_tax_indirect_determine_post |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Request body
application/json (required): DetermineRequest
| Field | Type | Required | Description |
|---|---|---|---|
seller_jurisdiction |
string | yes | ISO 3166 code of the supplier, e.g. 'DE'. |
buyer_jurisdiction |
string | yes | ISO 3166 code of the customer, e.g. 'US-CA'. |
customer_type |
"B2B" | "B2C" |
yes | B2B: the customer is a taxable person (a business with a VAT number); B2C: a private person or a customer without taxable status. |
supply_type |
"electronic_services" | "event_admission" | "goods" | "immovable_property_services" | "long_term_transport_hire" | "passenger_transport" | "restaurant_catering" | "services" | "short_term_transport_hire" |
yes | goods, services and electronic_services follow the general rules. immovable_property_services (incl. hotel accommodation), passenger_transport, event_admission, restaurant_catering and short_term_transport_hire are taxed where they are performed (pass place_of_performance); long_term_transport_hire follows the customer. |
rate_type |
"exempt" | "parking" | "reduced" | "special" | "standard" | "super_reduced" | "zero" |
Which rate of the taxing jurisdiction to apply: standard, reduced, super_reduced, parking, zero, special or exempt. Ignored when category is given. (default "standard") |
|
category |
string or null | Match a rate by category label instead of rate type: a rate with exactly that label wins (of those, one of rate_type), else one whose label contains it. |
|
date |
string (date) or null | Tax point: the date whose law applies (ISO 8601, e.g. 2026-03-01). Defaults to today (server date). | |
annual_acquisitions_chf |
decimal string or null | CH only: a non-registered Swiss recipient's purchases of services from foreign suppliers in the calendar year, in CHF. Above CHF 10,000 the recipient accounts for acquisition tax (MWSTG Art. 45 Abs. 2 Bst. b). (min 0) | |
place_of_performance |
string or null | ISO 3166 code where the property is located, the event or transport takes place, the meal is served or the means of transport is put at the customer's disposal. Required for the place-of-performance supply types. | |
seller_eu_cross_border_turnover_eur |
decimal string or null | EU only: the supplier's B2C distance sales of goods and electronic services to other member states (EUR, excl. VAT) in the current calendar year, or the preceding one if higher. Up to the EUR 10,000 threshold (Art. 59c) such supplies stay taxed at origin. Leave empty to assume destination taxation. (min 0) | |
opted_for_destination |
boolean | EU only: the supplier opted for destination taxation below the threshold. (default false) |
Example request
curl -X POST "$DATAVNEXT_URL/v1/tax/indirect/determine" \
-H "X-API-Key: $DATAVNEXT_KEY" \
-H "Content-Type: application/json" \
-d '{
"seller_jurisdiction": "DE",
"buyer_jurisdiction": "FR",
"customer_type": "B2B",
"supply_type": "services",
"date": "2026-03-01"
}'
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_Determination_ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": {
"taxing_jurisdiction": "FR",
"treatment": "reverse_charge",
"liable_party": "customer",
"invoice_rate": "0",
"accounted_rate": "20",
"components": [
{
"series": "fr.vat.standard",
"jurisdiction": "FR",
"tax_type": "vat",
"rate_type": "standard",
"rate": "20",
"categories": [
"general"
],
"supersedes": [],
"valid_from": "2019-01-01",
"id": "fr.vat.standard@2019-01-01",
"sources": [
{
"authority": "Ministère de l'Économie",
"url": "https://www.economie.gouv.fr/particuliers/impots-et-fiscalite/gerer-mes-autres-impots-et-taxes/tva-quels-sont-les-taux-de-votre-quotidien",
"reference": "CGI art. 278 à 281 nonies",
"verified_at": "2026-09-29",
"kind": "official"
}
]
}
],
"trace": {
"table_id": "eu.vat.place_of_supply",
"rule_id": "b2b_services_general_rule",
"reference": "Directive 2006/112/EC Art. 44 (place of supply), Art. 196 (reverse charge)",
"note": "Invoice must state \"Reverse charge\" (Art. 226(11a))."
},
"thresholds": [],
"notes": [
"Reverse charge: the customer self-assesses tax in FR.",
"Invoice must state \"Reverse charge\" (Art. 226(11a))."
],
"limitations": [
"Other specific place-of-supply rules are not modelled: intermediaries (Art. 46), transport of goods (Art. 49-52), ancillary transport, valuations and work on movable property for private customers (Art. 54(2)), and services to private customers outside the EU (Art. 59)."
]
},
"meta": {
"dataset_version": "3f2a9c1b7d4e",
"as_of": "2026-03-01",
"sources": [
{
"authority": "Ministère de l'Économie",
"url": "https://www.economie.gouv.fr/particuliers/impots-et-fiscalite/gerer-mes-autres-impots-et-taxes/tva-quels-sont-les-taux-de-votre-quotidien",
"reference": "CGI art. 278 à 281 nonies",
"verified_at": "2026-09-29",
"kind": "official"
}
],
"notes": []
}
}
GET /v1/tax/indirect/net-tax-rates
List net and flat tax rates by activity
Net and flat tax rates by activity in force on a date (CH: MWSTG Art. 37).
A taxable person on the net tax rate method pays turnover incl. VAT x rate and deducts
no input tax. These rates never replace the statutory rate on the invoice. data is
sorted by scheme and activity; rate is a percent of gross turnover as a decimal string.
Only Switzerland has data; other jurisdictions return an empty list, an unknown one 404.
| Authentication | an API key, where the server requires one |
| Operation id | net_tax_rates_v1_tax_indirect_net_tax_rates_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | jurisdiction |
string | yes | ISO 3166 code of a country or subdivision, case-insensitive, e.g. 'DE', 'CH', 'CA-ON', 'US-CA' (see GET /v1/jurisdictions). Unknown codes give 404. |
| query | as_of |
string (date) or null | Legal effective date: return the records in force on this date (valid_from on or before it, valid_to on or after it or empty). ISO 8601, e.g. 2020-08-01. Defaults to today (server date). | |
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | q |
string or null | Case-insensitive text to find in the activity name, e.g. 'Anwalt'. Default: all activities. | |
| query | scheme |
"flat_tax_rate" | "net_tax_rate" | "quick_method" or null |
'net_tax_rate' (Saldosteuersatz) or 'flat_tax_rate' (Pauschalsteuersatz). Default: both. | |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/net-tax-rates?jurisdiction=DE" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_NetTaxRate__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"series": "string",
"jurisdiction": "string",
"scheme": "flat_tax_rate",
"activity": "string",
"rate": "string",
"secondary_activities": "string",
"successors": [
"string"
],
"remark": "string",
"id": "string"
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/net-tax-rates/thresholds
List the eligibility limits of the net tax rate method
Eligibility limits of the net tax rate method (CH: MWSTG Art. 37 Abs. 1; CA: RC4058).
data lists the maximum annual turnover and tax payable (decimal strings, with the
currency) up to which a taxable person may use a simplified scheme, valid on the date.
Switzerland and Canada have data; other jurisdictions return an empty list, an unknown
one 404.
| Authentication | an API key, where the server requires one |
| Operation id | net_tax_thresholds_v1_tax_indirect_net_tax_rates_thresholds_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | jurisdiction |
string | yes | ISO 3166 code of a country or subdivision, case-insensitive, e.g. 'DE', 'CH', 'CA-ON', 'US-CA' (see GET /v1/jurisdictions). Unknown codes give 404. |
| query | as_of |
string (date) or null | Legal effective date: return the records in force on this date (valid_from on or before it, valid_to on or after it or empty). ISO 8601, e.g. 2020-08-01. Defaults to today (server date). | |
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/net-tax-rates/thresholds?jurisdiction=DE" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_NetTaxThreshold__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"id": "string",
"jurisdiction": "string",
"scheme": "flat_tax_rate",
"kind": "tax",
"amount": "string",
"currency": "string",
"description": "string"
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/pending
List pending VAT legislation
Pending legislation: proposals, adopted bills awaiting a vote, scheduled referendums.
Informational only. Pending changes are never applied to /rates or /determine;
when one is enacted, the new rate versions are added to the curated rates. data is
sorted by the date of the next decision (decision_date), each with its status, the
next step, when it would apply if adopted, and the series it would change. A
jurisdiction filter also matches its subdivisions; an unknown one gives 404.
| Authentication | an API key, where the server requires one |
| Operation id | pending_v1_tax_indirect_pending_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | jurisdiction |
string or null | ISO 3166 code of a country or subdivision, case-insensitive, e.g. 'CH'. Empty means all jurisdictions. Unknown codes give 404. | |
| query | include_closed |
boolean | Also return enacted, rejected and withdrawn proposals. Default false (only open ones). (default false) |
|
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/pending" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_PendingChange__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"id": "string",
"jurisdiction": "string",
"domain": "accounting_standards",
"title": "string",
"summary": "string",
"status": "adopted_by_parliament",
"status_date": "2026-09-21",
"next_step": "string",
"decision_date": "2026-09-21",
"expected_effective_from": "2026-09-21",
"effective_date_note": "string",
"business_number": "string",
"changes": [
null
],
"published_at": "2026-09-21"
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/rates
List the VAT rates in force
VAT, GST and sales-tax rates in force in a jurisdiction on a date.
data lists one rate per series (standard, reduced, zero, exempt and special rates),
standard rate first, each with rate in percent as a decimal string, its validity
period, categories and sources. Pass as_of for the law on a date and known_at for
what the dataset knew on a date. meta.as_of is the date used and meta.notes carries
jurisdiction-specific caveats. An unknown jurisdiction gives 404; an empty list means no
rate was in force on that date (history starts 2019-01-01).
| Authentication | an API key, where the server requires one |
| Operation id | rates_v1_tax_indirect_rates_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | jurisdiction |
string | yes | ISO 3166 code of a country or subdivision, case-insensitive, e.g. 'DE', 'CH', 'CA-ON', 'US-CA' (see GET /v1/jurisdictions). Unknown codes give 404. |
| query | as_of |
string (date) or null | Legal effective date: return the records in force on this date (valid_from on or before it, valid_to on or after it or empty). ISO 8601, e.g. 2020-08-01. Defaults to today (server date). | |
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | include_parents |
boolean | Include the national rates a subdivision inherits (US-CA also returns the rates of US). A subdivision rate that supersedes a national one replaces it. Default true. (default true) |
|
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/rates?jurisdiction=DE" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_TaxRate__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"series": "de.vat.standard",
"jurisdiction": "DE",
"tax_type": "vat",
"rate_type": "standard",
"rate": "16",
"categories": [
"general"
],
"description": "Temporary COVID-19 reduction",
"supersedes": [],
"valid_from": "2020-07-01",
"valid_to": "2020-12-31",
"id": "de.vat.standard@2020-07-01",
"sources": [
{
"authority": "Bundesministerium der Finanzen",
"url": "https://www.bundesfinanzministerium.de/Content/DE/Downloads/BMF_Schreiben/Steuerarten/Umsatzsteuer/2020-06-12-befristete-Senkung-umsatzsteuer-juli-2020.html",
"reference": "Befristete Absenkung des allgemeinen und ermäßigten Umsatzsteuersatzes zum 1. Juli 2020; UStG §28 Abs. 1 and 2 (2020)",
"verified_at": "2026-10-01",
"kind": "official"
}
]
}
],
"meta": {
"dataset_version": "3f2a9c1b7d4e",
"as_of": "2020-08-01",
"sources": [
{
"authority": "Bundesministerium der Finanzen",
"url": "https://www.bundesfinanzministerium.de/Content/DE/Downloads/BMF_Schreiben/Steuerarten/Umsatzsteuer/2020-06-12-befristete-Senkung-umsatzsteuer-juli-2020.html",
"reference": "Befristete Absenkung des allgemeinen und ermäßigten Umsatzsteuersatzes zum 1. Juli 2020; UStG §28 Abs. 1 and 2 (2020)",
"verified_at": "2026-10-01",
"kind": "official"
}
],
"notes": [
"History in this dataset starts 2019-01-01; a valid_from of 2019-01-01 means the rate was already in force."
]
}
}
GET /v1/tax/indirect/rates/history/{series}
Get the history of a rate series
Every version of a rate series, oldest first, e.g. de.vat.standard.
Use it to see when a rate changed (each version has valid_from and valid_to, the
last day it applied). The series id is the series field of a rate from /rates.
404 if no rate has that series id.
| Authentication | an API key, where the server requires one |
| Operation id | history_v1_tax_indirect_rates_history__series__get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | series |
string | yes | Rate series id, e.g. 'de.vat.standard' (the series of a rate). |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/rates/history/de.vat.standard" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_TaxRate__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"series": "string",
"jurisdiction": "string",
"tax_type": "consumption_tax",
"rate_type": "exempt",
"rate": "string",
"categories": [
"string"
],
"description": "string",
"supersedes": [
"string"
],
"option_to_tax": true,
"id": "string"
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/return-forms
List the official VAT return forms in force
Official VAT return forms in force on a date: their boxes, as numbered by the authority, and the rules that map tax-tagged ledger lines to the boxes.
The rules are DMN-lite (hit policy first) over the line facts described in the form model; a client evaluates them per ledger line and sums the boxes. A subdivision resolves to its country's forms. An empty list means no form is modelled for the jurisdiction on that date; an unknown jurisdiction gives 404.
| Authentication | an API key, where the server requires one |
| Operation id | return_forms_v1_tax_indirect_return_forms_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | jurisdiction |
string | yes | ISO 3166 code of a country or subdivision, case-insensitive, e.g. 'DE', 'CH', 'CA-ON', 'US-CA' (see GET /v1/jurisdictions). Unknown codes give 404. |
| query | as_of |
string (date) or null | Legal effective date: return the records in force on this date (valid_from on or before it, valid_to on or after it or empty). ISO 8601, e.g. 2020-08-01. Defaults to today (server date). | |
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | kind |
"annual_summary" | "oss_return" | "pst_return_bc" | "pst_return_sk" | "qst_return" | "recapitulative_statement" | "rst_return_mb" | "vat_return" or null |
'vat_return', 'recapitulative_statement' (EC sales list), 'annual_summary' (annual VAT return) or a Canadian provincial return ('qst_return', 'pst_return_bc', 'pst_return_sk', 'rst_return_mb'). Default: all. | |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/return-forms?jurisdiction=DE" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_ReturnForm__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"id": "string",
"jurisdiction": "string",
"kind": "annual_summary",
"subdivision": "string",
"tax_types": [
null
],
"name": "string",
"method": "string",
"version": "string",
"periods": [
"half_year"
],
"currency": "string",
"base_precision": 2,
"tax_precision": 2,
"whole_units": "truncate",
"interest": null,
"group_by": "counterparty_vat_number",
"boxes": [
null
],
"rules": [
null
],
"payable": [
null
],
"agree": [
null
],
"notes": [
"string"
],
"limitations": [
"string"
],
"carry_forward": null,
"periodic": null
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/return-forms/{form_id}
Get a VAT return form
One return form version by id, e.g. de.bmf.ustva.2026.
data has the form's boxes (with the official field number in code), the rules that
route ledger lines to boxes, and how the amount payable is computed from the boxes.
404 for an unknown id.
| Authentication | an API key, where the server requires one |
| Operation id | return_form_v1_tax_indirect_return_forms__form_id__get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | form_id |
string | yes | Return form id, e.g. 'de.bmf.ustva.2026' (the id from /return-forms). |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/return-forms/de.bmf.ustva.2026" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_ReturnForm_ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": {
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"id": "string",
"jurisdiction": "string",
"kind": "annual_summary",
"subdivision": "string",
"tax_types": [
"consumption_tax"
],
"name": "string",
"method": "string",
"version": "string",
"periods": [
"half_year"
],
"currency": "string",
"base_precision": 2,
"tax_precision": 2,
"whole_units": "truncate",
"interest": {
"rate": null,
"periods": null,
"reference": null
},
"group_by": "counterparty_vat_number",
"boxes": [
{
"id": null,
"code": null,
"line": null,
"label": null,
"section": null,
"unit": null,
"tax": null,
"rate": null,
"terms": null,
"floor_zero": null,
"xml": null,
"fill": null,
"final_period_blank": null,
"fill_from": null
}
],
"rules": [
{
"id": null,
"when": null,
"then": null,
"reference": null,
"note": null
}
],
"payable": [
{
"box": null,
"sign": null,
"part": null
}
],
"agree": [
{
"boxes": null,
"equal_to": null,
"reference": null
}
],
"notes": [
"string"
],
"limitations": [
"string"
],
"carry_forward": {
"pending": null,
"applied": null,
"remaining": null,
"cap": null,
"result": null
},
"periodic": {
"source": null,
"sums": null,
"ties": null,
"paid": null,
"carried": null,
"refunded": null,
"previous_year": null
}
},
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/thresholds
List the VAT thresholds in force
VAT thresholds in force on a date: the EU-wide EUR 10,000 distance-sales threshold, the EUR 150 import one-stop-shop consignment limit, and small-business exemption limits.
data lists the thresholds (amount as a decimal string, currency, what it is compared
with, which supplies it covers) sorted by jurisdiction and kind. meta.as_of is the date
used. Combine with known_at for a point-in-time view. An unknown jurisdiction gives 404.
| Authentication | an API key, where the server requires one |
| Operation id | thresholds_v1_tax_indirect_thresholds_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| query | jurisdiction |
string or null | A jurisdiction (its own, its parents' and its groups' thresholds, e.g. AT also returns the EU ones), a group such as 'EU', or empty for all. Unknown codes give 404. | |
| query | kind |
"distance_sales" | "low_value_consignment" | "small_business_exemption" | "sme_union_turnover" or null |
Only this kind: 'distance_sales', 'low_value_consignment', 'small_business_exemption' or 'sme_union_turnover'. Default: all kinds. | |
| query | as_of |
string (date) or null | Legal effective date: return the records in force on this date (valid_from on or before it, valid_to on or after it or empty). ISO 8601, e.g. 2020-08-01. Defaults to today (server date). | |
| query | known_at |
string (date) or null | Point-in-time view of the dataset: only records published on or before this date (records without a publication date always count). Combine with as_of to reproduce what the API answered on that day. ISO 8601, e.g. 2026-01-15. Defaults to no limit. | |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/thresholds" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_TaxThreshold__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"series": "string",
"jurisdiction": "string",
"tax_type": "vat",
"kind": "distance_sales",
"amount": "string",
"currency": "string",
"basis": "string",
"applies_to": [
"string"
],
"description": "string",
"id": "string"
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
GET /v1/tax/indirect/thresholds/history/{series}
Get the history of a threshold series
Every version of a threshold series, oldest first, e.g.
eu.vat.distance_sales_threshold.
Each version has its valid_from and valid_to (the last day it applied). The series id
is the series field of a threshold from /thresholds. 404 if no threshold has that
series id.
| Authentication | an API key, where the server requires one |
| Operation id | threshold_history_v1_tax_indirect_thresholds_history__series__get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | series |
string | yes | Threshold series id, e.g. 'eu.vat.distance_sales_threshold' (the series of a threshold). |
| query | dataset_version |
string or null | Pin the response to an archived dataset version (git SHA). Defaults to the current version. Also accepted as the X-Dataset-Version header. The version that answered is in meta.dataset_version; an archived version that does not exist gives 404. |
Example request
curl "$DATAVNEXT_URL/v1/tax/indirect/thresholds/history/eu.vat.distance_sales_threshold" \
-H "X-API-Key: $DATAVNEXT_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | Envelope_list_TaxThreshold__ |
| 401 | Missing or invalid API key. | Error |
| 404 | Nothing found for the identifier, or the pinned dataset_version is not archived. |
Error |
| 422 | The request is invalid: {"detail": "…"} for a rule the service checks, or FastAPI's {"detail": [{"loc", "msg", "type"}]} for a malformed parameter or body. |
HTTPValidationError |
Example response (shape)
{
"data": [
{
"sources": [
null
],
"valid_from": "2026-09-21",
"valid_to": "2026-09-21",
"published_at": "2026-09-21",
"series": "string",
"jurisdiction": "string",
"tax_type": "vat",
"kind": "distance_sales",
"amount": "string",
"currency": "string",
"basis": "string",
"applies_to": [
"string"
],
"description": "string",
"id": "string"
}
],
"meta": {
"dataset_version": "string",
"as_of": "2026-09-21",
"known_at": "2026-09-21",
"sources": [
{
"authority": null,
"url": null,
"reference": null,
"verified_at": null,
"kind": null
}
],
"notes": [
"string"
]
}
}
Schemas
Agreement
Two groups of boxes whose amounts the authority requires to be equal (FR: the taxed
operations of the CA3 and the bases of its rate lines). Rounding each box to whole units
can part them by a few units: the largest box of boxes takes the difference.
| Field | Type | Required | Description |
|---|---|---|---|
boxes |
array of string | yes | The boxes that take a difference. (min items 1) |
equal_to |
array of string | yes | The boxes they equal. (min items 1) |
reference |
string or null |
CarryForward
A periodic return whose negative result is carried to the next return of the year rather than refunded, and refunded only in the year's last period (Spain: LIVA art. 99.Cinco, 115): the boxes holding the carried amounts.
| Field | Type | Required | Description |
|---|---|---|---|
pending |
string | yes | Carried from earlier periods (Modelo 303: 110). |
applied |
string | yes | Of it, applied in this period (78). |
remaining |
string | yes | Left for later periods (87 = pending - applied). |
cap |
string | yes | The result the applied amount may not exceed (66). |
result |
string | yes | The period's result, negative when carried (71). |
Determination
| Field | Type | Required | Description |
|---|---|---|---|
taxing_jurisdiction |
string | yes | |
treatment |
string | yes | |
liable_party |
"customer" | "none" | "supplier" |
yes | |
invoice_rate |
string | yes | Percent the supplier charges on the invoice. (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
accounted_rate |
string | yes | Total percent due in the taxing jurisdiction, by whoever is liable. (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
components |
array of TaxRate |
yes | |
trace |
RuleTrace |
yes | |
thresholds |
array of TaxThreshold |
Thresholds the determination relied on. | |
notes |
array of string | yes | |
limitations |
array of string | yes |
DetermineRequest
| Field | Type | Required | Description |
|---|---|---|---|
seller_jurisdiction |
string | yes | ISO 3166 code of the supplier, e.g. 'DE'. |
buyer_jurisdiction |
string | yes | ISO 3166 code of the customer, e.g. 'US-CA'. |
customer_type |
"B2B" | "B2C" |
yes | B2B: the customer is a taxable person (a business with a VAT number); B2C: a private person or a customer without taxable status. |
supply_type |
"electronic_services" | "event_admission" | "goods" | "immovable_property_services" | "long_term_transport_hire" | "passenger_transport" | "restaurant_catering" | "services" | "short_term_transport_hire" |
yes | goods, services and electronic_services follow the general rules. immovable_property_services (incl. hotel accommodation), passenger_transport, event_admission, restaurant_catering and short_term_transport_hire are taxed where they are performed (pass place_of_performance); long_term_transport_hire follows the customer. |
rate_type |
"exempt" | "parking" | "reduced" | "special" | "standard" | "super_reduced" | "zero" |
Which rate of the taxing jurisdiction to apply: standard, reduced, super_reduced, parking, zero, special or exempt. Ignored when category is given. (default "standard") |
|
category |
string or null | Match a rate by category label instead of rate type: a rate with exactly that label wins (of those, one of rate_type), else one whose label contains it. |
|
date |
string (date) or null | Tax point: the date whose law applies (ISO 8601, e.g. 2026-03-01). Defaults to today (server date). | |
annual_acquisitions_chf |
decimal string or null | CH only: a non-registered Swiss recipient's purchases of services from foreign suppliers in the calendar year, in CHF. Above CHF 10,000 the recipient accounts for acquisition tax (MWSTG Art. 45 Abs. 2 Bst. b). (min 0) | |
place_of_performance |
string or null | ISO 3166 code where the property is located, the event or transport takes place, the meal is served or the means of transport is put at the customer's disposal. Required for the place-of-performance supply types. | |
seller_eu_cross_border_turnover_eur |
decimal string or null | EU only: the supplier's B2C distance sales of goods and electronic services to other member states (EUR, excl. VAT) in the current calendar year, or the preceding one if higher. Up to the EUR 10,000 threshold (Art. 59c) such supplies stay taxed at origin. Leave empty to assume destination taxation. (min 0) | |
opted_for_destination |
boolean | EU only: the supplier opted for destination taxation below the threshold. (default false) |
Envelope_Determination_
| Field | Type | Required | Description |
|---|---|---|---|
data |
Determination |
yes | |
meta |
Meta |
yes |
Envelope_ReturnForm_
| Field | Type | Required | Description |
|---|---|---|---|
data |
ReturnForm |
yes | |
meta |
Meta |
yes |
Envelope_list_NetTaxRate__
| Field | Type | Required | Description |
|---|---|---|---|
data |
array of NetTaxRate |
yes | |
meta |
Meta |
yes |
Envelope_list_NetTaxThreshold__
| Field | Type | Required | Description |
|---|---|---|---|
data |
array of NetTaxThreshold |
yes | |
meta |
Meta |
yes |
Envelope_list_PendingChange__
| Field | Type | Required | Description |
|---|---|---|---|
data |
array of PendingChange |
yes | |
meta |
Meta |
yes |
Envelope_list_ReturnForm__
| Field | Type | Required | Description |
|---|---|---|---|
data |
array of ReturnForm |
yes | |
meta |
Meta |
yes |
Envelope_list_TaxRate__
| Field | Type | Required | Description |
|---|---|---|---|
data |
array of TaxRate |
yes | |
meta |
Meta |
yes |
Envelope_list_TaxThreshold__
| Field | Type | Required | Description |
|---|---|---|---|
data |
array of TaxThreshold |
yes | |
meta |
Meta |
yes |
Interest
Interest a filer adds to some periodic payments (Italy: DPR 542/1999 art. 7).
| Field | Type | Required | Description |
|---|---|---|---|
rate |
number | yes | Percent of the amount payable before interest. (greater than 0) |
periods |
array of "half_year" | "month" | "quarter" | "two_months" | "year" |
yes | Period kinds it applies to. (min items 1) |
reference |
string | yes | Legal basis. |
NetTaxRate
A simplified-method rate for one activity: the tax due is the gross taxable turnover (including VAT) times the rate, with no input tax deduction.
Switzerland: net tax rates (Saldosteuersätze) and flat tax rates (Pauschalsteuersätze), MWSTG Art. 37. Never used for invoice rates; the supplier still invoices at the statutory rate.
| Field | Type | Required | Description |
|---|---|---|---|
sources |
array of Source |
yes | Where the rules come from (at least one), e.g. the authority's page. (min items 1) |
valid_from |
string (date) | yes | |
valid_to |
string (date) or null | ||
published_at |
string (date) or null | ||
series |
string | yes | Stable id of the activity's rate across versions, e.g. 'ch.vat.net_rate.anwaltsbuero'. (pattern ^[a-z0-9_.-]+$) |
jurisdiction |
string | yes | Country code, e.g. 'CH'. |
scheme |
"flat_tax_rate" | "net_tax_rate" | "quick_method" |
yes | net_tax_rate (Saldosteuersatz), flat_tax_rate (Pauschalsteuersatz) or quick_method (Canada, GST/HST Quick Method remittance rate). |
activity |
string | yes | Industry or activity as officially designated. |
rate |
string | yes | Percent of gross turnover incl. VAT. (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
secondary_activities |
string or null | Mixed industries: secondary activities that could be declared at this rate (CH until 2024, 50% rule). | |
successors |
array of string | Series that replace this activity when it is discontinued. | |
remark |
string or null | Publisher's remark on the change. | |
id |
string | yes | Unique id of this version: the series and valid_from. |
NetTaxThreshold
Eligibility limit of a simplified method, e.g. the turnover and tax limits of MWSTG Art. 37 Abs. 1.
| Field | Type | Required | Description |
|---|---|---|---|
sources |
array of Source |
yes | Where the rules come from (at least one), e.g. the authority's page. (min items 1) |
valid_from |
string (date) | yes | |
valid_to |
string (date) or null | ||
published_at |
string (date) or null | ||
id |
string | yes | Stable id of the threshold. (pattern ^[a-z0-9_.-]+$) |
jurisdiction |
string | yes | Country code, e.g. 'CH'. |
scheme |
"flat_tax_rate" | "net_tax_rate" | "quick_method" |
yes | The simplified method the limit belongs to. |
kind |
"tax" | "turnover" |
yes | 'turnover': annual taxable turnover; 'tax': annual tax payable. |
amount |
string | yes | Maximum amount (inclusive). (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
currency |
string | yes | ISO 4217 code of the amount. (pattern ^[A-Z]{3}$) |
description |
string | yes | What the limit is, in words. |
PendingChange
| Field | Type | Required | Description |
|---|---|---|---|
sources |
array of Source |
yes | Where the rules come from (at least one), e.g. the authority's page. (min items 1) |
id |
string | yes | e.g. 'ch.vat.pending.ahv13'. (pattern ^[a-z0-9_.-]+$) |
jurisdiction |
string | yes | Country or subdivision code the bill concerns. |
domain |
"accounting_standards" | "benchmark_rates" | "calendars" | "e_invoicing" | "fixed_assets" | "fx_reference" | "indirect_tax" | "legislation" | "recapitulative_statements" | "tax_fx" | "tax_returns" |
yes | Kind of data it would change, e.g. 'indirect_tax'. |
title |
string | yes | Official title of the bill or decree. |
summary |
string | yes | Own-words summary of what the proposal does and where it stands. |
status |
"adopted_by_parliament" | "enacted" | "in_parliament" | "proposed" | "referendum_scheduled" | "rejected" | "withdrawn" |
yes | proposed, in_parliament, adopted_by_parliament, referendum_scheduled (open), or enacted, rejected, withdrawn (closed). |
status_date |
string (date) | yes | Date the current status was reached. |
next_step |
string or null | The next decision, in words. | |
decision_date |
string (date) or null | Date of the next scheduled decision (vote, referendum). | |
expected_effective_from |
string (date) or null | When the change would apply if adopted; not a legal fact. | |
effective_date_note |
string or null | Caveats on when the change would apply. | |
business_number |
string or null | Parliamentary business number, e.g. Curia Vista '24.073'. | |
changes |
array of ProposedChange |
The series it would change and how. | |
published_at |
string (date) or null | When this record entered the dataset. |
PeriodicSummary
An annual summary built from the year's final periodic returns (Modelo 390 from the 303s): which of its boxes add up which boxes of the periodic returns, and which must tie.
| Field | Type | Required | Description |
|---|---|---|---|
source |
CarryForward |
yes | The boxes of the periodic return that carry its result (Modelo 303). |
sums |
map of string | Annual box: the periodic box summed over the year (amounts entered by hand on the periodic returns, e.g. import VAT). | |
ties |
map of string | Annual box: the periodic box whose sum over the year it must equal. | |
paid |
string or null | The sum of the positive results. | |
carried |
string or null | What the last return of the year left to carry forward. | |
refunded |
string or null | The last return's negative result, refunded. | |
previous_year |
string or null | The previous year's carried amount applied in this year. |
ProposedChange
What one curated series would look like if the proposal became law.
| Field | Type | Required | Description |
|---|---|---|---|
series |
string | yes | The affected series, e.g. 'ch.vat.standard'. |
rate |
string or null | Proposed percent. (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
|
valid_to |
string (date) or null | Proposed last day of validity (e.g. an extended expiry). | |
description |
string | yes | What would change, in words. |
ReturnBox
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | Unique within the form, e.g. '303', 'kz81', 'line37'. |
code |
string or null | The field number printed on the official form (Ziffer, Kennzahl, code); null for unnumbered lines. | |
line |
string or null | Official line number (Zeile), if any. | |
label |
string | yes | Official wording, abridged. |
section |
string or null | Section of the form the box is in. | |
unit |
"amount" | "base" | "tax" |
'base': turnover or taxable amount; 'tax': a tax amount; 'amount': other. (default "base") |
|
tax |
"net_tax_rate" | "rate" or null |
Compute tax from the box amount at each line's rate ('rate') or at the filer's approved net tax rates ('net_tax_rate'). | |
rate |
string or null | The rate printed next to the box, for display (percent). | |
terms |
array of Term |
A computed box: the signed sum of these terms. | |
floor_zero |
boolean | Computed boxes: never below zero. (default false) |
|
xml |
string or null | Element of the official electronic format, if any. | |
fill |
"final_period_interest" | "periodic_interest" | "previous_credit" | "previous_debt_carried" | "year_adjustments" | "year_final_period_interest" | "year_periodic_due" | "year_periodic_interest" | "year_periodic_paid" | "year_periodic_settled" or null |
A box the filer fills from its earlier returns, not from ledger lines (see Fill); it takes no lines and no hand-entered amount. |
|
final_period_blank |
boolean | Left blank in the last period of the year that is paid with the annual balance (interest.periods; Italy: LIPE VP14 in a quarterly filer's fourth quarter). (default false) |
|
fill_from |
string or null | For year_adjustments and year_periodic_due: the id of the box of the periodic returns it sums. |
ReturnForm
| Field | Type | Required | Description |
|---|---|---|---|
sources |
array of Source |
yes | Where the rules come from (at least one), e.g. the authority's page. (min items 1) |
valid_from |
string (date) | yes | |
valid_to |
string (date) or null | ||
published_at |
string (date) or null | ||
id |
string | yes | e.g. 'de.bmf.ustva.2026'. (pattern ^[a-z0-9_.-]+$) |
jurisdiction |
string | yes | Country the form is filed in, e.g. 'DE'. |
kind |
"annual_summary" | "oss_return" | "pst_return_bc" | "pst_return_sk" | "qst_return" | "recapitulative_statement" | "rst_return_mb" | "vat_return" |
yes | 'vat_return', 'recapitulative_statement', a Canadian provincial return ('qst_return', 'pst_return_bc', 'pst_return_sk', 'rst_return_mb') or 'annual_summary' (an annual return that settles nothing: the Spanish Modelo 390, the Italian Dichiarazione IVA) or 'oss_return' (the EU One-Stop Shop return, filed for the jurisdiction 'EU'). |
subdivision |
string or null | The province or state the form is filed in when that is not the whole country, e.g. 'CA-QC' for the QST return. Such a form reads only the lines taxed there (their jurisdiction). | |
tax_types |
array of "consumption_tax" | "gst" | "hst" | "pst" | "qst" | "rst" | "sales_tax" | "vat" or null |
The taxes the form reports: a tax line of another tax (a line tagged with another tax_type; untagged lines are 'vat') is not read by the form. Null: every tax. Canada files GST/HST with the CRA and QST with Revenu Québec. |
|
name |
string | yes | Official name of the form. |
method |
string or null | Accounting method the form is for, e.g. 'effective'. | |
version |
string | yes | Official form version or standard, as published. |
periods |
array of "half_year" | "month" | "quarter" | "two_months" | "year" |
yes | Filing periods the form may be used for: month, two_months, quarter, half_year, year. (min items 1) |
currency |
string | yes | ISO 4217 code of the amounts on the form. (pattern ^[A-Z]{3}$) |
base_precision |
0 | 2 |
Decimals of base amounts (0: whole currency units). (default 2) |
|
tax_precision |
0 | 2 |
Decimals of tax amounts and totals (0: whole currency units). (default 2) |
|
whole_units |
"round" | "truncate" |
How an amount in whole units drops its cents: cut off (DE: 'nur Beträge in vollen Euro') or rounded to the nearest unit, 50 cents up (FR, IT). (default "truncate") |
|
interest |
Interest or null |
Interest added to the periodic payments, if any. | |
group_by |
"counterparty_vat_number" or null |
Recapitulative statements: one row per customer VAT number. | |
boxes |
array of ReturnBox |
yes | The boxes of the form, in order; computed boxes follow their terms. (min items 1) |
rules |
array of DecisionRule |
yes | Ordered rules (first match wins) routing a tax-tagged ledger line to boxes. (min items 1) |
payable |
array of Term |
The amount owed for the period (positive) or refundable (negative), as a linear combination of boxes; empty for statements without tax. | |
agree |
array of Agreement |
Groups of boxes that must add up to the same amount. | |
notes |
array of string | How to read or fill the form. | |
limitations |
array of string | What the form model does not cover. | |
carry_forward |
CarryForward or null |
Periodic returns: a negative result before the year's last period is carried forward, not refunded. | |
periodic |
PeriodicSummary or null |
Annual summaries: the boxes taken from the periodic returns. |
RuleTrace
| Field | Type | Required | Description |
|---|---|---|---|
table_id |
string | yes | |
rule_id |
string | yes | |
reference |
string or null | yes | |
note |
string or null | yes | |
legend |
map of string or null | The remark an invoice for this outcome carries, by language (de, fr, it, en), with its legal basis; null when the matched rule has none. |
TaxRate
| Field | Type | Required | Description |
|---|---|---|---|
sources |
array of Source |
yes | Where the rules come from (at least one), e.g. the authority's page. (min items 1) |
valid_from |
string (date) | yes | |
valid_to |
string (date) or null | ||
published_at |
string (date) or null | ||
series |
string | yes | Stable id of the rate across its history, e.g. 'de.vat.standard'. (pattern ^[a-z0-9_.-]+$) |
jurisdiction |
string | yes | Country or subdivision code the rate applies in, e.g. 'DE', 'CA-ON'. |
tax_type |
"consumption_tax" | "gst" | "hst" | "pst" | "qst" | "rst" | "sales_tax" | "vat" |
yes | vat, gst, hst, pst, qst, rst, sales_tax or consumption_tax. |
rate_type |
"exempt" | "parking" | "reduced" | "special" | "standard" | "super_reduced" | "zero" |
yes | standard, reduced, super_reduced, parking, zero (taxable at 0%), special or exempt (outside the tax, no input tax deduction). |
rate |
string | yes | Percent as a decimal string, e.g. '19' for 19%. (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
categories |
array of string | Short labels of what the rate applies to. | |
description |
string or null | What the rate covers or why it differs, when notable. | |
supersedes |
array of string | Parent-level series this rate replaces in the subdivision (e.g. Ontario HST replaces federal GST). | |
option_to_tax |
boolean or null | Exempt supplies only: whether the supplier may opt to tax the supply (e.g. MWSTG Art. 22). Restrictions are given in the description. | |
id |
string | yes | Unique id of this version: the series and valid_from, e.g. 'de.vat.standard@2020-07-01'. |
TaxThreshold
A monetary limit that switches a tax treatment on or off.
Examples: the EU-wide EUR 10,000 limit for intra-EU distance sales (VAT Directive Art. 59c), the EUR 150 consignment limit for the import one-stop shop, and each member state's small-business exemption limit.
| Field | Type | Required | Description |
|---|---|---|---|
sources |
array of Source |
yes | Where the rules come from (at least one), e.g. the authority's page. (min items 1) |
valid_from |
string (date) | yes | |
valid_to |
string (date) or null | ||
published_at |
string (date) or null | ||
series |
string | yes | Stable id of the threshold across its history, e.g. 'eu.vat.distance_sales_threshold'. (pattern ^[a-z0-9_.-]+$) |
jurisdiction |
string | yes | A jurisdiction code, or a group such as 'EU'. |
tax_type |
"consumption_tax" | "gst" | "hst" | "pst" | "qst" | "rst" | "sales_tax" | "vat" |
(default "vat") |
|
kind |
"distance_sales" | "low_value_consignment" | "small_business_exemption" | "sme_union_turnover" |
yes | distance_sales: EU-wide limit below which B2C distance sales and electronic services stay taxed at origin; low_value_consignment: import one-stop-shop limit per consignment; small_business_exemption: domestic turnover limit of the small-business scheme; sme_union_turnover: EU-wide turnover limit for using the small-business scheme in other member states. |
amount |
string | yes | The limit as a decimal string, in currency. (pattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$) |
currency |
string | yes | ISO 4217 code of the amount. (pattern ^[A-Z]{3}$) |
basis |
string or null | What the amount is compared with, e.g. 'turnover in the preceding calendar year'. | |
applies_to |
array of string | Supply types the threshold applies to, e.g. ['goods', 'electronic_services']; empty means all supplies. | |
description |
string or null | What the threshold limits, in words. | |
id |
string | yes | Unique id of this version: the series and valid_from. |
Term
| Field | Type | Required | Description |
|---|---|---|---|
box |
string | yes | Id of the box whose value is added or subtracted. |
sign |
1 | -1 |
1 to add the box, -1 to subtract it. (default 1) |
|
part |
"amount" | "tax" |
The box's amount, or the tax it computes. (default "amount") |