SME Eligibility
Reference for POST /v1/vat/sme-eligibility, including domestic establishment checks, Article 284 logic, and example eligibility responses.
Endpoint
POST /v1/vat/sme-eligibilityAuthentication: Public (no API key required)
Overview
Checks whether a business with a given annual domestic turnover falls within the national SME VAT exemption threshold for a specific member state (Art. 284 VAT Directive). This endpoint does not evaluate the EU cross-border SME scheme (Art. 284a). Thresholds are sourced from the official EU TEDB SMERetrievalService.
Amounts: annual_turnover_nac is expressed in minor units (cents) of the national currency. Threshold amounts in the response are in whole currency units as published by TEDB. TEDB defines its duplicate national-currency threshold as optional; when a country's validated national currency is EUR, VAT Engine can use the published EUR threshold directly as the national threshold. It does not exchange-rate-convert a missing threshold for a non-euro country.
Effective-dated currency: currency must match the national currency on reference_date. For Bulgaria, use BGN through 2025-12-31 and EUR from 2026-01-01. For Croatia, use HRK through 2022-12-31 and EUR from 2023-01-01, matching Croatia's official euro-adoption date documented by the European Commission and European Central Bank. VAT Engine verifies that the selected TEDB row uses the same effective currency before comparing any national-currency amount.
Country codes: TEDB uses EL for Greece (ISO 3166-1 uses GR).
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 3166-1 alpha-2 country code (TEDB uses EL for Greece) |
annual_turnover_nac | integer | Yes | Annual turnover in minor units of the national currency (must be ≥ 0) |
currency | string | Yes | ISO 4217 currency code — must match the country's national currency |
reference_date | string | No | YYYY-MM-DD date for threshold lookup. Defaults to today. |
Example Requests
Eurozone country (Germany)
curl -X POST https://api.vat-engine.app/v1/vat/sme-eligibility \-H "Content-Type: application/json" \-d '{"country":"DE","annual_turnover_nac":1800000,"currency":"EUR"}'Non-eurozone country (Poland, with explicit date)
curl -X POST https://api.vat-engine.app/v1/vat/sme-eligibility \-H "Content-Type: application/json" \-d '{"country":"PL","annual_turnover_nac":20000000,"currency":"PLN","reference_date":"2026-01-01"}'Response
{
"country": "DE",
"currency": "EUR",
"annual_turnover_nac": 1800000,
"reference_date": "2025-07-09",
"exemption_threshold_nac": 22000,
"exemption_threshold_eur": 22000,
"eligibility_status": "eligible",
"eligible_for_exemption": true,
"exceeded_by_nac": 0,
"scheme_type": "Regular scheme",
"policy": {
"one_national_annual_threshold": true,
"exclusion_article288_quarantine_period": null,
"voluntary_cessation_article290": null
},
"sectorals": [],
"data_situation_on": "2024-01-01",
"disclaimer": "Domestic-only check (Art. 284 VAT Directive). Does not evaluate the EU cross-border SME scheme (Art. 284a). Consult a tax advisor for formal eligibility decisions."
}Response Fields
| Field | Type | Description |
|---|---|---|
country | string | Echo of the submitted country code |
currency | string | Echo of the effective-dated national currency code |
annual_turnover_nac | integer | Echo of the submitted turnover in minor units |
reference_date | string | Effective date used for threshold lookup (YYYY-MM-DD) |
exemption_threshold_nac | number | null | Main exemption threshold in whole national-currency units. For euro-area countries, this uses the published EUR threshold when TEDB omits the optional duplicate national-currency value. It is null when the selected evidence belongs to another effective currency period. |
exemption_threshold_eur | number | null | Main exemption threshold in whole EUR units |
eligibility_status | string | Explicit result: eligible, ineligible, or indeterminate. An indeterminate result makes no eligibility conclusion. |
eligible_for_exemption | boolean | null | Whether turnover is within the threshold, or null when the result is indeterminate. |
exceeded_by_nac | integer | null | Amount over the threshold, 0 when within it, or null when the result is indeterminate. |
scheme_type | string | TEDB threshold type (e.g. Regular scheme) |
policy | object | National policy flags — see below |
sectorals | array | Sector-specific thresholds — see below. Empty array if none apply. |
data_situation_on | string | Effective date of the underlying TEDB data (YYYY-MM-DD) |
disclaimer | string | Legal disclaimer |
For an indeterminate comparison, the response includes "eligibility_status": "indeterminate", "eligible_for_exemption": null, and "exceeded_by_nac": null. This includes transition gaps where the latest TEDB row is denominated in the prior national currency. Main and sectoral national-currency thresholds from that row are suppressed so they cannot be interpreted in the submitted currency. Do not interpret an indeterminate result as eligible or ineligible; obtain current same-currency evidence from authoritative national guidance.
Policy Object
| Field | Type | Description |
|---|---|---|
one_national_annual_threshold | boolean | null | Single national annual threshold applies |
exclusion_article288_quarantine_period | string | null | Article 288 exclusion quarantine period (TEDB text) |
voluntary_cessation_article290 | boolean | null | Voluntary cessation flag under Article 290 |
Sectoral Object
| Field | Type | Description |
|---|---|---|
sector | string | null | Sector label (verbatim TEDB text) |
exemption_threshold_eur | number | null | Sectoral exemption threshold in whole EUR units |
exemption_threshold_nac | number | null | Sectoral exemption threshold in national-currency units; null when its parent evidence belongs to another effective currency period |
comment | string | null | Additional comment (verbatim TEDB text) |
Error Responses
| Status | Error | Cause |
|---|---|---|
| 400 | invalid_json | Request body is not valid JSON |
| 400 | invalid_country | Country code is not a valid 2-letter code |
| 400 | invalid_currency | Currency code is not a supported ISO 4217 code for the reference period |
| 400 | invalid_turnover | annual_turnover_nac is negative |
| 400 | invalid_reference_date | reference_date is not a valid YYYY-MM-DD date |
| 404 | no_sme_data | No TEDB threshold data found for the country/date |
| 422 | currency_mismatch | Currency does not match the country's national currency on reference_date |
| 429 | rate_limited | Too many requests — back off and retry |
| 500 | internal_error | Server error |