EU Verify¶
Call this before you generate an invoice. check_invoice_party says whether a seller or buyer is invoice-ready. Factur-X will not emit a file when the verdict is not_ready, and it returns the dated evidence pack with the document. This is a format and verification API, not a Plateforme Agréée and not a Peppol access point.
The same REST API and MCP server still expose the eight register checks the verdict is built from.
| Tool | Question it answers | Register |
|---|---|---|
check_invoice_party |
Can this party appear on an e-invoice, and what is the evidence? | SIREN, VIES, IBAN, address, EORI when supplied |
check_vat |
Is this EU VAT number registered for intra-EU trade, and to whom? | VIES (DG TAXUD) |
lookup_siren |
Which French business is this SIREN / SIRET / name? | Recherche d'entreprises (RNE + Sirene) |
normalize_siret |
Is this SIREN/SIRET well formed, and what is its VAT number? | none, pure logic |
check_iban |
Is this IBAN valid, and which bank is it? | mod-97 + bank registry |
normalize_address_eu |
What is the canonical form of this address? | Base Adresse Nationale (FR) |
normalize_phone |
What is this number in E.164, and is it a mobile? | libphonenumber |
check_email |
Can this address receive mail, and is it disposable? | DNS |
check_eori |
Is this EORI number registered for customs? | EOS validation (DG TAXUD) |
Nothing is stored. Inputs go to the register named above and the answer is cached for a day at most.
One envelope, four statuses¶
Every tool answers the same shape, so a client (or an agent) branches on one field:
{
"tool": "check_vat",
"status": "valid",
"input": { "vat": "FR03552081317" },
"normalized": { "country_code": "FR", "vat_number": "03552081317", "vat": "FR03552081317" },
"data": { "name": "ELECTRICITE DE FRANCE", "address": "22 AVENUE DE WAGRAM 75008 PARIS" },
"source": "vies",
"cached": false,
"checked_at": "2026-09-03T19:02:47Z"
}
status |
Meaning |
|---|---|
valid |
The identifier exists and is active in the register. |
invalid |
Well formed but unknown, inactive, or failing its checksum. reason says which. |
normalized |
Nothing to look up; normalized holds the canonical form. |
upstream_unavailable |
The register did not answer. Not a negative result: retry after retry_after_s. These calls are free. |
invoice_ready |
check_invoice_party only. data.evidence is the dated pack (SIREN, VIES request id, IBAN checksum). |
not_ready |
check_invoice_party only. data.reasons is a closed list. Do not treat this as an outage. |
That last row is the reason this service exists as a product. VIES member states go down individually, and code that treats "the Italian register is offline" as "this VAT number is fake" rejects real customers. Read Tools for the semantics of each status per tool.
Start¶
- Quickstart: a free key and your first call, in two minutes.
- Tools: every tool, its arguments, and what its statuses mean.
- REST API and MCP server: the two surfaces.
- Pricing: Free 500 calls/month, then EUR 9 / 29 / 79.
Already a facturx-api Pro or Scale customer? Your fx. key works here as well, on its own quota. See Pricing.