StabisoDocs

Reference data API

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")
Stabiso, the Enterprise System of Record · generated from the code and its guides · release 20b7dd5b0c4d