VAT, tax ID and national ID validator: 23 countries, checksum only (VAT formats BE, DE, FR, IT, PL, AT, CH, IE)
VAT, tax ID and national ID validator: check a national identity, tax or company registration number against its country's official checksum rule. Covers 23 countries including NL BSN, ES NIF/NIE/CIF, IT codice fiscale, FR SIREN/SIRET, DE Steuer-ID, BE/PL/CZ national numbers, SE/NO/DK/FI personal numbers, BR CPF/CNPJ, AU ABN/TFN, UK NINo, IE PPS, US NPI/EIN. Structure and check digit only, no registry lookup; the number is never stored (logs keep only its length and character types).
Output (data): valid (boolean), country, kind, normalised (string|null), formatted (string|null), reason (null | length | charset | checksum | structure | reserved_range: a number in a range the issuer reserves or never assigned, e.g. CA SIN starting 0 or 8, UK NINO prefixes BG GB KN NK NT TN ZZ, US EIN unassigned prefixes, NZ IRD outside 10,000,000-150,000,000), algorithm (e.g. elfproef-11, mod-97-10, luhn), derived (object of facts the number encodes, {} when none: birth_date (YYYY-MM-DD) and sex (M|F) for IT cf, SE personnummer, PL pesel, BE rrn, NO fodselsnummer, DK cpr, FI hetu, CZ rc and SK rc; birthplace_code for IT cf; century_assumed (boolean) for SE personnummer, true when a 10-digit form forced the century to be inferred; for BE, NO, DK, FI, CZ and SK the number itself fixes the century (BE by the check digits, NO by the individual number, DK by the sequence digit, FI by the century sign, CZ/SK by the digit count). birth_date is omitted when the encoded date is not a real date, and for NO FH-numbers). FR nir carries no day and no century, so its derived holds sex, birth_year_yy (2 digits), birth_month (1-12, or null for special codes) and department_code instead of birth_date. normalised is the number without separators (SE personnummer keeps a 12-digit input's century and a + sign).
Deterministic: identical input returns identical output, so the response is served with Cache-Control: private, max-age=31536000, immutable (the paying client may cache it indefinitely; shared caches must not, because the response is paid).
Price: $0.05 USDC per call (x402, Base). Route contract version 1.0.0. Docs: https://api.duoleads.com/docs#id-national
Request
- Base URL: https://api.duoleads.com
- URL: https://api.duoleads.com/v1/id/national
- Auth: none declared
Query parameters
ISO 3166-1 alpha-2 country code, case-insensitive. One of the 23 supported countries; the United Kingdom is accepted as UK or GB (the response echoes what you sent). Accepted: one of the 23 supported ISO 3166-1 alpha-2 codes.
Identifier type for that country, e.g. bsn, nif, cf, cpf. Accepted: an identifier kind supported for the country.
The identifier. Separators (space . - /) are stripped before checking. Accepted: at most 64 characters.
Response
Paid and settled. data is route-specific; a route that judges its input returns 200 with data.valid: false for a bad value.
Changes
No recorded changes to this operation across all 1 revision of this API.