Alpha testing: all current functionality is free while VAT Engine is in active development

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-eligibility

Authentication: 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

FieldTypeRequiredDescription
countrystringYesISO 3166-1 alpha-2 country code (TEDB uses EL for Greece)
annual_turnover_nacintegerYesAnnual turnover in minor units of the national currency (must be ≥ 0)
currencystringYesISO 4217 currency code — must match the country's national currency
reference_datestringNoYYYY-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

FieldTypeDescription
countrystringEcho of the submitted country code
currencystringEcho of the effective-dated national currency code
annual_turnover_nacintegerEcho of the submitted turnover in minor units
reference_datestringEffective date used for threshold lookup (YYYY-MM-DD)
exemption_threshold_nacnumber | nullMain 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_eurnumber | nullMain exemption threshold in whole EUR units
eligibility_statusstringExplicit result: eligible, ineligible, or indeterminate. An indeterminate result makes no eligibility conclusion.
eligible_for_exemptionboolean | nullWhether turnover is within the threshold, or null when the result is indeterminate.
exceeded_by_nacinteger | nullAmount over the threshold, 0 when within it, or null when the result is indeterminate.
scheme_typestringTEDB threshold type (e.g. Regular scheme)
policyobjectNational policy flags — see below
sectoralsarraySector-specific thresholds — see below. Empty array if none apply.
data_situation_onstringEffective date of the underlying TEDB data (YYYY-MM-DD)
disclaimerstringLegal 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

FieldTypeDescription
one_national_annual_thresholdboolean | nullSingle national annual threshold applies
exclusion_article288_quarantine_periodstring | nullArticle 288 exclusion quarantine period (TEDB text)
voluntary_cessation_article290boolean | nullVoluntary cessation flag under Article 290

Sectoral Object

FieldTypeDescription
sectorstring | nullSector label (verbatim TEDB text)
exemption_threshold_eurnumber | nullSectoral exemption threshold in whole EUR units
exemption_threshold_nacnumber | nullSectoral exemption threshold in national-currency units; null when its parent evidence belongs to another effective currency period
commentstring | nullAdditional comment (verbatim TEDB text)

Error Responses

StatusErrorCause
400invalid_jsonRequest body is not valid JSON
400invalid_countryCountry code is not a valid 2-letter code
400invalid_currencyCurrency code is not a supported ISO 4217 code for the reference period
400invalid_turnoverannual_turnover_nac is negative
400invalid_reference_datereference_date is not a valid YYYY-MM-DD date
404no_sme_dataNo TEDB threshold data found for the country/date
422currency_mismatchCurrency does not match the country's national currency on reference_date
429rate_limitedToo many requests — back off and retry
500internal_errorServer error