Stop guessing.
Charge with proof.
One call answers three questions at once: charge VAT or not, at what rate, under which mechanism. Legal basis and invoice note included.
One call, two VAT numbers.
POST /v1/decide with seller and buyer. The API validates both, then applies the tax rule.
curl -X POST "https://api.vatverify.dev/v1/decide" \ -H "Authorization: Bearer $VATVERIFY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "seller_vat": "DE811569869", "buyer_vat": "FR44732829320" }'import { Vatverify } from "@vatverify/node"const vatverify = new Vatverify()const { data, meta } = await vatverify.decide({ seller_vat: "DE811569869", buyer_vat: "FR44732829320",})data.charge_vat // falsedata.mechanism // "reverse_charge"data.rate // 0data.legal_basis // "EU VAT Directive Article 196"data.invoice_note // "Reverse charge — VAT to be accounted..."See the full endpoint schema: POST /v1/decide.
seller_vatstringrequiredSeller VAT number with country prefix. Seller country is derived from the prefix (DE → Germany). Must be an EU-27 country in v1.
buyer_vatstringrequiredBuyer VAT number with country prefix. Validated against the upstream registry as part of the decision. B2B-only in v1.
The decision, plus the rule.
Same data / meta envelope as /validate. Seller and buyer sources are reported per-lookup under meta.sources.
{ "data": { "charge_vat": false, "rate": 0, "mechanism": "reverse_charge", "legal_basis": "EU VAT Directive Article 196", "explanation": "Your customer provided a valid France VAT number (FR44732829320, verified on 2026-04-14). For B2B cross-border supplies within the EU, the reverse charge mechanism applies. Issue a zero-rated invoice.", "invoice_note": "Reverse charge — VAT to be accounted for by the recipient", "disclaimer": "This is guidance, not legal advice. Confirm with a qualified tax adviser for your specific situation.", "buyer_vat": { "valid": true, "country": { "code": "FR", "name": "France" } }, "decided_at": "2026-04-14T15:42:03.451Z" }, "meta": { "request_id": "0190f8ea-a5b2-7000-a123-000000000000", "latency_ms": 820, "source_status": "live", "sources": [ { "role": "seller", "source": "vies", "source_status": "live", "cached": true, "cached_at": "2026-04-14T09:02:11.000Z", "stale_seconds": 23512 }, { "role": "buyer", "source": "vies", "source_status": "live", "cached": false, "cached_at": null, "stale_seconds": null } ] } }
One of standard, reverse_charge, zero_rated, or out_of_scope. Drives your invoice template.
The article or rule that justifies the mechanism. Cite it on the invoice when local tax authorities require it.
Ready-to-print text for the invoice footer. Empty string when no note is required.
Deterministic rules, not tax advice. Surface alongside the decision so your team always sees it.
Deterministic, always.
Edge cases fail loudly with typed error codes, never with a silent wrong answer. B2C support is on the roadmap.
- EU seller → EU buyer, valid VAT200reverse_charge · rate 0Article 196: buyer accounts for VAT
- EU seller → same-country B2B200standard · seller rateDomestic VAT at the seller rate
- EU seller → B2C (no VAT number)400b2c_not_supportedOSS / IOSS territory; on the roadmap
- EU seller → unregistered buyer400buyer_vat_not_registeredReverse-charge requires a valid buyer VAT
- Non-EU seller (UK / CH / NO)400seller_country_unsupportedEU-27 sellers only in v1
Available on Business.
50,000 requests/month, /v1/decide included. Start on Free for validation; upgrade to Business when you need the tax-rules engine.