{"openapi":"3.1.0","info":{"title":"EU Verify API","summary":"Verify and normalise EU business data: VAT, SIREN/SIRET, IBAN, address, phone, email, EORI.","description":"REST API for EU business-data verification against public registries. The same tools are exposed to AI agents over MCP at `/mcp`. Human documentation: [/docs](/docs/).","contact":{"name":"EU Verify","url":"https://verify.orvel.dev/"},"version":"0.1.0"},"paths":{"/v1/vat/{vat}":{"get":{"tags":["verification"],"summary":"Check an EU VAT number against VIES","operationId":"vat_v1_vat__vat__get","parameters":[{"name":"vat","in":"path","required":true,"schema":{"type":"string","title":"Vat"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only needed when the number has no country prefix","title":"Country Code"},"description":"Only needed when the number has no country prefix"},{"name":"requester_vat","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your own VAT number: switches to the authenticated consultation with a request identifier","title":"Requester Vat"},"description":"Your own VAT number: switches to the authenticated consultation with a request identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/siren/{q}":{"get":{"tags":["verification"],"summary":"Look up a French business by SIREN, SIRET or name","operationId":"siren_v1_siren__q__get","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":"string","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/siret/{siret}/normalize":{"get":{"tags":["verification"],"summary":"Validate and split a SIREN or SIRET","operationId":"siret_normalize_v1_siret__siret__normalize_get","parameters":[{"name":"siret","in":"path","required":true,"schema":{"type":"string","title":"Siret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/iban/{iban}":{"get":{"tags":["verification"],"summary":"Check an IBAN, and the BIC when given","operationId":"iban_v1_iban__iban__get","parameters":[{"name":"iban","in":"path","required":true,"schema":{"type":"string","title":"Iban"}},{"name":"bic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional BIC to check against the IBAN","title":"Bic"},"description":"Optional BIC to check against the IBAN"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/address/normalize":{"post":{"tags":["verification"],"summary":"Normalise an EU postal address","operationId":"address_v1_address_normalize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/phone/{phone}":{"get":{"tags":["verification"],"summary":"Normalise a phone number to E.164","operationId":"phone_v1_phone__phone__get","parameters":[{"name":"phone","in":"path","required":true,"schema":{"type":"string","title":"Phone"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO country code, for numbers written without a + prefix","title":"Region"},"description":"ISO country code, for numbers written without a + prefix"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/email/{email}":{"get":{"tags":["verification"],"summary":"Check an email address: syntax, MX, disposable","operationId":"email_v1_email__email__get","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"mx","in":"query","required":false,"schema":{"type":"boolean","description":"Also look up the MX records of the domain","default":true,"title":"Mx"},"description":"Also look up the MX records of the domain"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/eori/{eori}":{"get":{"tags":["verification"],"summary":"Check an EORI number against the EU EOS database","operationId":"eori_v1_eori__eori__get","parameters":[{"name":"eori","in":"path","required":true,"schema":{"type":"string","title":"Eori"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Monthly quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Anonymous rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/statuses":{"get":{"tags":["verification"],"summary":"What each result status means","operationId":"statuses_v1_statuses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/plans":{"get":{"tags":["verification"],"summary":"Public plan catalog with self-service checkout links","operationId":"plans_v1_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/checkout/{plan}":{"get":{"tags":["verification"],"summary":"Redirect to Stripe Checkout for a plan","operationId":"checkout_v1_checkout__plan__get","parameters":[{"name":"plan","in":"path","required":true,"schema":{"type":"string","title":"Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/session/{session_id}":{"get":{"tags":["verification"],"summary":"Return the API key after a successful Stripe Checkout","operationId":"checkout_session_v1_billing_session__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/portal":{"post":{"tags":["verification"],"summary":"Open the Stripe customer portal for this API key","operationId":"billing_portal_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/usage":{"get":{"tags":["verification"],"summary":"Current monthly usage for the API key","operationId":"usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageOut"}}}}}}}},"components":{"schemas":{"AddressRequest":{"properties":{"address":{"type":"string","title":"Address","description":"Street line, or the whole address as one line","default":""},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO 3166-1 alpha-2, e.g. FR, DE, NL"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},"additionalProperties":false,"type":"object","title":"AddressRequest"},"ErrorOut":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"details":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Details"}},"type":"object","required":["code","message"],"title":"ErrorOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"UsageOut":{"properties":{"plan":{"type":"string","title":"Plan"},"used":{"type":"integer","title":"Used"},"quota":{"type":"integer","title":"Quota"},"remaining":{"type":"integer","title":"Remaining"},"period":{"type":"string","title":"Period"}},"type":"object","required":["plan","used","quota","remaining","period"],"title":"UsageOut"},"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"}}}}