Tools¶
Every tool returns the envelope. This page lists what each one accepts, which register answers, and what its statuses mean in practice. REST paths are on the REST API page; MCP tool names are identical.
check_vat — EU VAT number¶
vat, optional country_code, optional requester_vat.
Normalises the number (GR becomes EL, GB becomes XI, prefixes and separators stripped), checks its shape
against the national format, then queries VIES. A number that cannot possibly be a VAT number for that country
is rejected locally, without spending a call on the register.
| Status | When |
|---|---|
valid |
Registered for intra-EU trade. data.name / data.address when the member state discloses them. |
invalid |
Not registered, or the shape is wrong for the country, or the country is not in VIES. |
upstream_unavailable |
The gateway or that one member state is down (MS_UNAVAILABLE, MS_MAX_CONCURRENT_REQ, TIMEOUT, HTTP 5xx). |
Several member states return --- instead of a name and address. That is their choice, not a missing answer: the
number is still valid.
Audit proof. Pass requester_vat with your own VAT number to use the authenticated consultation. VIES then
returns data.request_identifier, which you can store to show when you checked a customer — the usual
requirement for zero-rating an intra-EU supply. Those calls are never served from cache, since each one needs its
own identifier.
lookup_siren — French business¶
q: a SIREN (9 digits), a SIRET (14 digits), or a company name.
Queries Recherche d'entreprises (DINUM: RNE + Sirene open data). A SIREN/SIRET whose checksum fails never reaches the register.
Returns the legal name, trade name, NAF code, legal form, size band, creation date, the establishment the query
pointed at (SIRET, address, INSEE code, coordinates) and the VAT number. A name search also returns
data.other_matches so you can disambiguate.
| Status | When |
|---|---|
valid |
The legal unit exists and is active (etat_administratif = A). |
invalid |
Nothing matches; or the SIREN exists but is closed; or the SIREN exists but carries no such SIRET. |
upstream_unavailable |
The register is down, rate limited us, or we throttled ourselves to stay under its ceiling. |
Records marked non-diffusible by their owner are absent from the open data, so a real one-person company can come
back invalid. Check data.total_results before telling a user their company does not exist.
normalize_siret — SIREN / SIRET, offline¶
siret: 9 or 14 digits, any spacing.
Pure logic, no register: Luhn checksum (including the documented La Poste exception, where the digits must sum to a multiple of 5), split into SIREN + NIC, the spaced form, and the FR VAT number derived from the SIREN.
Status is normalized when it checks out, invalid with a reason when the checksum or the length is wrong.
Never upstream_unavailable.
check_iban — IBAN and BIC¶
iban, optional bic.
mod-97 checksum, per-country BBAN structure, and the bank behind it when the country publishes a registry (bank name, BIC, branch code, SEPA membership).
| Status | When |
|---|---|
valid |
Structurally correct. If a bic was given it is also a valid BIC. |
invalid |
Bad checksum, wrong length for the country, unknown country, or a malformed bic. |
A bic from a different country than the IBAN does not make the result invalid — group entities legitimately do
this — but it is reported in reason so you can decide.
This checks the number, not the account. It cannot tell you whether the account is open or who owns it.
normalize_address_eu — postal address¶
address, optional country_code, postal_code, city.
France is geocoded against the Base Adresse Nationale: canonical street line, postcode, city, INSEE code,
coordinates and a match score. Scores below 0.5 come back as normalized with a warning rather than valid.
Other member states get structural normalisation only in v1: ISO country code, the national postcode shape and
its canonical spacing (1234 AB for NL, 12-345 for PL, 1234-567 for PT…), title-cased city. data.geocoded is
false and no register was consulted. This limit is deliberate and stated in the answer.
| Status | When |
|---|---|
valid |
Geocoded with confidence (FR only). |
normalized |
Canonical form returned without a register match. |
invalid |
Postcode does not fit the country, the country is not an EU member state, or no French address matches. |
upstream_unavailable |
The BAN did not answer (FR only). |
normalize_phone — phone number¶
phone, optional region.
libphonenumber metadata: E.164, international, national and RFC 3966 forms, calling code, region, line type
(mobile, fixed_line, voip…). region is only needed for numbers written without a + prefix; without it a
national number cannot be resolved and comes back invalid.
Status is valid when the number exists in that numbering plan, invalid otherwise. Never
upstream_unavailable.
check_email — email address¶
email, optional mx (default true).
Syntax and canonical form (IDN aware), then the domain's MX records over DNS. A domain with no MX but an A record
still accepts mail (RFC 5321), which is reported as data.implicit_mx.
Also flagged: data.disposable for known throwaway providers (checked before any DNS query), and
data.role_account for shared mailboxes (info@, noreply@, facturation@…) — useful when onboarding needs a
named human.
| Status | When |
|---|---|
valid |
Syntax is good and the domain can receive mail. |
invalid |
Bad syntax, disposable provider, domain does not exist, or no mail server. |
normalized |
mx=false: syntax checked, nothing looked up. |
upstream_unavailable |
The DNS resolver did not answer. |
There is no SMTP probe, so a valid result means the domain accepts mail, not that the mailbox exists. Probing
mailboxes gets servers blacklisted and is not something this service does.
check_eori — customs registration¶
eori.
The EU EOS validation service over SOAP. Returns the registered trader name and address, validity dates, and the service's own status description. Shape is checked locally first (two-letter country code plus up to 15 alphanumeric characters).
| Status | When |
|---|---|
valid |
Registered (status 0). |
invalid |
Not registered, or the shape is wrong. |
upstream_unavailable |
SOAP fault, timeout, or an answer without a status. |
Caching¶
Answers are cached so repeated checks of the same identifier are fast and do not hammer the registers. Default
lifetimes: VIES 24 h when valid and 1 h when invalid, Sirene 24 h, EORI 24 h, addresses 7 days, MX 1 h. cached
tells you which answer you got. upstream_unavailable is never cached, and authenticated VIES consultations are
never served from cache.