EU TIN & VAT Validator
Pricing
$20.00 / 1,000 number checkeds
EU TIN & VAT Validator
Check VAT numbers for every EU country, Northern Ireland, Norway and Switzerland. Personal numbers are format-checked only and are never sent to a register. Existence checks use VIES, Brønnøysund, the Swiss UID register, the Polish VAT white list and the French recherche-entreprises API.
Pricing
$20.00 / 1,000 number checkeds
Rating
0.0
(0)
Developer
Mike Berckmoes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Check VAT numbers for every EU country, Northern Ireland (XI), Norway and Switzerland, plus Belgian, Luxembourg, Dutch, German, Polish and French company numbers. Personal numbers are format-checked only. Existence checks use VIES, Brønnøysund, the Swiss UID register, the PL white list (about 100 searches/day) and FR recherche-entreprises.
Each line you submit becomes one dataset row. A bad number or a source that is down does not fail the run. You pay $0.02 per number-checked event, which is one number.
What does EU TIN & VAT Validator do?
It checks the format and check digit of a tax or company number, then asks an official source whether that number exists when the law allows an existence check.
Personal identifiers stay on the machine that runs the Actor. They are format-checked only and are never sent to VIES or a register. Their existence value is not_possible_for_personal_ids.
Company and VAT numbers can be confirmed against public registers:
- VIES (European Commission VAT REST API) for every EU member state and Northern Ireland. Greece is sent as EL, which is the VIES code; the row country stays GR.
- The Polish Ministry of Finance VAT white list (
wl-api.mf.gov.pl) for a NIP, and for a REGON when the list returns it. The white list allows about 100 searches/day. This Actor calls it one number at a time and does not try to get around that limit. - FR recherche-entreprises (
recherche-entreprises.api.gouv.fr) for a French SIREN or SIRET. - The Polish KRS open API for a 10-digit KRS number.
- Brønnøysund (
data.brreg.no) for a Norwegian MVA number. It exists only when the organisation is flagged as VAT-registered. - The Swiss UID public service
ValidateVatNumberfor a CHE number. That service allows 20 requests per minute. This Actor waits between calls and honoursRetry-After.
This is not the European Commission's TIN-on-the-web form, and it does not confirm that a person exists.
Why use it?
- One input list covers EU VAT, Norway, Switzerland, and the company and personal formats already supported for Belgium, Luxembourg, the Netherlands, Germany, Poland and France.
- Check digits are computed locally, so an impossible number is rejected before any HTTP call.
- VIES member-state outages become
source_unavailableon that row. The rest of the list still runs. - You get a public business name and address when the register returns them. Personal identifiers, bank accounts and representative names from the Polish white list are not copied into the dataset.
- Schedule it, call it from the Apify API, or download the dataset as JSON, CSV, Excel or HTML.
What does each check return?
| Field | Meaning |
|---|---|
normalized | Canonical number, with a country prefix for VAT |
country | ISO code, or XI for Northern Ireland. Greece is GR even when the VAT prefix is EL |
coverageLevel | Best free coverage in this repo for that country: full, id-only, vat-only or lei-only |
detectedType | individual, company or ambiguous |
formatValid / checkDigitValid | Local format and check digit. Check digit is null when that country publishes none |
existence | exists, not_found, source_unavailable or not_possible_for_personal_ids |
source | Register that answered, or check-digit when the number was rejected locally |
name / address | Public business name and address, when the source returned them |
How to check a number
- Open the Actor and paste one number per line into Numbers.
- Optionally prefix a line with a country (
AT,ELorGRfor Greece,XI,NO,CH, and the same for the other states) and a type (individual,companyorauto). - Start the run. Open the dataset when it finishes.
A 9-digit Dutch number is ambiguous: it can be a personal BSN or a company RSIN. With type individual or auto it is format-checked only. With type company it is treated as an RSIN and reported source_unavailable, because there is no free RSIN API. A full Dutch VAT number (NL#########B##) is sent to VIES.
How much does a check cost?
Pricing is pay per event. The event name is number-checked and the price is $0.02 per number. Empty input does not charge. A personal number, an invalid number and a number whose register is down each still count as one checked number, because the Actor did the check and returned a row.
Platform compute is separate from the event price. A short list fits in the default 256 MB run.
Input
See the Input tab for the full schema. numbers is a list of strings:
PL7740001454BE 0403170701NL individual 123456782
123456782 above is a synthetic elfproef example, not a real person.
Output
You can download the dataset in JSON, HTML, CSV or Excel.
{"input": "PL7740001454","normalized": "PL7740001454","country": "PL","detectedType": "company","numberKind": "nip","formatValid": true,"checkDigitValid": true,"existence": "exists","source": "wl-api.mf.gov.pl","name": "ORLEN SPÓŁKA AKCYJNA","address": "CHEMIKÓW 7, 09-411 PŁOCK"}
A personal number looks like this:
{"input": "NL individual 123456782","country": "NL","detectedType": "individual","numberKind": "bsn","formatValid": true,"checkDigitValid": true,"existence": "not_possible_for_personal_ids","source": null}
Sources and limits
| Number | Format | Existence |
|---|---|---|
| VAT (all EU states and XI) | Local rules. The states outside BE, LU, NL, DE, PL and FR use python-stdnum | VIES. Greece is queried as EL |
| NO MVA | Norwegian MVA check digit | Brønnøysund VAT-register flag |
| CH UID / MWST / TVA / IVA | Swiss UID check digit | UID ValidateVatNumber, 20 requests/minute |
| PL NIP | NIP check digit | PL white list, then VIES if the list has no row |
| PL REGON | REGON check digit | PL white list (GUS BIR needs a key, so it is not used) |
| PL KRS | 10 digits starting with 000 | Ministry of Justice KRS open API |
| FR SIREN / SIRET | Luhn | FR recherche-entreprises, then VIES |
| BSN, RSIN without a VAT suffix, Belgian national number, Luxembourg matricule, German IdNr, French SPI, PESEL, Latvian personal code, Spanish DNI/NIE, Romanian CNP | Local rules | Not queried. Format-checked only |
VIES answers such as MS_UNAVAILABLE and MS_MAX_CONCURRENT_REQ are retried, then stored as source_unavailable. The PL white list allows about 100 searches/day. The Swiss UID service allows 20 requests per minute.
Coverage matrix
coverageLevel is the best free check this repo can do for that country, not a claim that every field is filled. Iceland and Liechtenstein have format checks only and no free existence API, so a number from those states is not queried.
| Coverage | Countries | What a row can confirm |
|---|---|---|
full | CZ, FI, FR, IE, SK, NO, GB, CH | A national register exists in the company Actor, or (NO, CH) this Actor confirms the VAT flag itself |
id-only | PL, RO | Number lookup only (PL white list / KRS; RO is the company Actor's ANAF register). VAT still goes to VIES |
vat-only | AT, BE, BG, HR, CY, DK, EE, DE, GR, HU, IT, LV, LT, LU, MT, NL, PT, SI, ES, SE, XI | VAT format and VIES existence. No free company register in this repo |
lei-only | IS, LI | No free VAT or company API here |
This Actor does not call HMRC, so a UK VAT number is not existence-checked. GB is full in the shared list because the company Actor can use Companies House when you bring a free key.
A personal number keeps its country and is still never sent out. Its existence is not_possible_for_personal_ids.
FAQ and disclaimer
Are personal numbers sent to a government API? No. Personal numbers are format-checked only.
Which services confirm that a company number exists? Existence checks use VIES (every EU state and XI), Brønnøysund for Norway, the Swiss UID register (20 requests/minute), the PL white list (about 100 searches/day) and FR recherche-entreprises. Polish KRS numbers use the KRS open API as well.
What if VIES is down? That row is source_unavailable. Other numbers in the same run continue.
Official registers can name a sole trader. Do not use this Actor to build a file of private individuals. Results can include a business name and address that some laws treat as personal data. Use them only when you have a legitimate reason. Questions and corrections belong on the Actor's Issues tab. Programmatic access is on the API tab.