{"openapi":"3.1.0","info":{"title":"eu-vat-api — EU VAT validation via VIES (fail-closed)","description":"EU VAT number validation against the official VIES service, with requester consultation numbers and trader matching. Paid per request via x402 at the edge (USDC on Base, Coinbase facilitator); this origin never sees unpaid requests. The engine is online: when VIES or a member state cannot answer, the API returns a machine-readable refusal — never a guess. Source: VIES (VAT Information Exchange System), European Commission.","version":"0.1.0"},"paths":{"/v1/check":{"post":{"summary":"V1 Check","description":"Validate one EU VAT number against the live VIES service. Returns the official verdict plus the registered trader name/address where the member state publishes them. Supply requester_country_code + requester_vat_number to receive a VIES consultation number (request_identifier) — the identifier businesses keep as proof of the check; trader_* fields enable approximate name/address matching. Fail-closed: if VIES or the member state cannot answer, the call is refused machine-readably (502/503/504, e.g. member_state_unavailable) — never a fabricated verdict. x402 price: $0.001 per request.","operationId":"v1_check_v1_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Check V1 Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batch":{"post":{"summary":"V1 Batch","description":"Validate up to 100 VAT numbers in one request (same per-item shape as /v1/check's result, input order kept). Exceeding the cap fails the whole call with a machine-readable protocol error. Items VIES could not answer keep their engine payload verbatim AND are listed in the envelope's refusals array ({index, code, user_error, message}) — those items carry NO verdict; treat them as unanswered, not invalid. x402 price: $0.100 flat per request.","operationId":"v1_batch_v1_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Batch V1 Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/demo/check":{"post":{"summary":"V1 Demo Check","description":"Free playground demo lane: the same full VIES verdict as /v1/check, no payment — hard rate-limited (10 requests per 5 minutes per IP). For evaluation only; use /v1/check for production traffic.","operationId":"v1_demo_check_v1_demo_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Demo Check V1 Demo Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/health":{"get":{"summary":"V1 Health","description":"Free: service liveness, pinned eu-vat engine version, and the upstream identity. Does NOT call VIES — use /v1/status for live availability.","operationId":"v1_health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Health V1 Health Get"}}}}}}},"/v1/status":{"get":{"summary":"V1 Status","description":"Free: live VIES availability per member state, passed through from the official status endpoint. Check the availability window before paying for a check that would be refused. Rate-limited (free path).","operationId":"v1_status_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Status V1 Status Get"}}}}}}}},"components":{"schemas":{"BatchRequest":{"properties":{"vat_ids":{"items":{"type":"string"},"type":"array","title":"Vat Ids"}},"type":"object","required":["vat_ids"],"title":"BatchRequest"},"CheckRequest":{"properties":{"vat_id":{"type":"string","title":"Vat Id"},"requester_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Country Code"},"requester_vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Vat Number"},"trader_name":{"type":"string","title":"Trader Name","default":""},"trader_street":{"type":"string","title":"Trader Street","default":""},"trader_city":{"type":"string","title":"Trader City","default":""},"trader_postal_code":{"type":"string","title":"Trader Postal Code","default":""},"trader_company_type":{"type":"string","title":"Trader Company Type","default":""}},"type":"object","required":["vat_id"],"title":"CheckRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}