Reference

Company identifier formats by country

What a company number looks like in each country, how its check digit is computed, how to normalise it, a worked example and the API parameter that takes it. Every row is generated from the validators of the free identifier validator, so a value shown here is a value the validator accepts.

Updated 24 October 2026

Download the table

The same rows as this page, in English. Free to cite with attribution to Prometiam and a link to this page.

Check digit

Shape notation: N digit · L letter · X digit or letter · C check digit or character · {n} repeat n times

Showing 39 of 39 identifiers

Country and registerIdentifier and shapeCheck digitExampleAPI parameter
ES SpainRegistro Mercantil (BORME)NIF / CIFL N{7} CEnforcedA28015865company_numbercountry=ES
How it is checked, regex, code and links
Check
Odd positions of the 7 digits are doubled (a product above 9 loses 9) and the rest are added; control = (10 - sum mod 10) mod 10, written as that digit or as its letter (J A B C D E F G H I).
Normalised form
A28015865
Also accepted as input
A-28015865
A one-character slip
A28015866 is refused
Regex (normalised form)
^[ABCDEFGHJNPQRSUVW][0-9]{7}[0-9A-J]$
API
GET /companies/search?country=ES&company_number=A28015865 · also taken by nif=
VAT number
ES + NIF — built from the identifier by rule; the registration is not confirmed
Good to know
The first letter is the legal form (A public limited company, B limited company). A personal DNI or NIE has a different check (a mod 23 letter) and is not a company identifier: the API refuses it.
const re = /^[ABCDEFGHJNPQRSUVW][0-9]{7}[0-9A-J]$/
re.test('A28015865')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

FR FranceINSEE (Sirene), RNESIRENN{8} CEnforced552032534sirencountry=FR
How it is checked, regex, code and links
Check
Luhn (mod 10) over the 9 digits.
Normalised form
552032534
Also accepted as input
552 032 534
A one-character slip
552032535 is refused
Regex (normalised form)
^[0-9]{9}$
API
GET /companies/search?country=FR&siren=552032534
VAT number
FR + 2-digit key + SIREN — built from the identifier by rule; the registration is not confirmed
Good to know
The SIREN identifies the legal unit; the SIRET adds a 5-digit establishment number. Non-diffusible companies are found only by SIREN or SIRET, never by name.
const re = /^[0-9]{9}$/
re.test('552032534')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

FR FranceINSEE (Sirene), RNESIRETN{9} N{4} CEnforced55203253400646siretcountry=FR
How it is checked, regex, code and links
Check
Luhn (mod 10) over the 14 digits. La Poste (SIREN 356000000) is the documented exception: its digits add up to a multiple of 5.
Normalised form
55203253400646
Also accepted as input
552 032 534 00646
A one-character slip
55203253400647 is refused
Regex (normalised form)
^[0-9]{14}$
API
GET /companies/search?country=FR&siret=55203253400646
VAT number
FR + 2-digit key + SIREN — built from the identifier by rule; the registration is not confirmed
Good to know
SIREN (9 digits) plus the 5-digit NIC of one establishment. Store the SIREN as the company reference.
const re = /^[0-9]{14}$/
re.test('55203253400646')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

GB United KingdomCompanies HouseCompany numberN{8} | L{2} N{6}None00445790company_numbercountry=GB
How it is checked, regex, code and links
Check
No check digit: 8 digits, or 2 letters and 6 digits. The shape is the only test.
Normalised form
00445790
Also accepted as input
SC095237
Regex (normalised form)
^([0-9]{8}|[A-Z]{2}[0-9]{6})$
API
GET /companies/search?country=GB&company_number=00445790
VAT number
The register data holds no VAT number for this identifier.
Good to know
The prefix names the type: SC Scotland, NI Northern Ireland, OC, SO and NC limited liability partnerships, FC overseas companies. A well-formed number does not prove the company exists.
const re = /^([0-9]{8}|[A-Z]{2}[0-9]{6})$/
re.test('00445790')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

IE IrelandCROCRO numberN{4,7}None100416company_numbercountry=IE
How it is checked, regex, code and links
Check
No check digit: a plain sequential integer (4 to 7 digits are accepted). The shape is the only test.
Normalised form
100416
Regex (normalised form)
^[0-9]{4,7}$
API
GET /companies/search?country=IE&company_number=100416
VAT number
The register data holds no VAT number for this identifier.
Good to know
No letter prefix and no check digit. A well-formed number does not prove the company exists.
const re = /^[0-9]{4,7}$/
re.test('100416')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

PL PolandKrajowa Administracja Skarbowa (KAS)NIPN{9} CEnforced7740001454nipcountry=PL
How it is checked, regex, code and links
Check
Weights 6,5,7,2,3,4,5,6,7 over the first 9 digits; the sum mod 11 is the check digit. A remainder of 10 is never issued.
Normalised form
7740001454
Also accepted as input
774-000-14-54
A one-character slip
7740001455 is refused
Regex (normalised form)
^[0-9]{10}$
API
GET /companies/search?country=PL&nip=7740001454
VAT number
PL + NIP — built from the identifier by rule; the registration is not confirmed
Good to know
The NIP is the tax number. The KRS register number (10 digits, zero-padded, taken by company_number) has no check digit and is not validated here.
const re = /^[0-9]{10}$/
re.test('7740001454')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

PL PolandGUS (REGON)REGONN{8} C | N{13} CEnforced610188201regoncountry=PL
How it is checked, regex, code and links
Check
REGON-9: weights 8,9,2,3,4,5,6,7, sum mod 11 (10 reads as 0). REGON-14 repeats that on its first 9 digits and adds a second check over all 13 (weights 2,4,8,5,0,9,7,3,6,1,2,4,8).
Normalised form
610188201
A one-character slip
610188202 is refused
Regex (normalised form)
^([0-9]{9}|[0-9]{14})$
API
GET /companies/search?country=PL&regon=610188201
VAT number
The register data holds no VAT number for this identifier.
Good to know
REGON-9 identifies the entity, REGON-14 a local unit of it.
const re = /^([0-9]{9}|[0-9]{14})$/
re.test('610188201')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

NO NorwayBrønnøysundregistreneOrganisasjonsnummerN{8} CEnforced923609016company_numbercountry=NO
How it is checked, regex, code and links
Check
Weights 3,2,7,6,5,4,3,2 over the first 8 digits; check = 11 minus the sum mod 11 (0 when the remainder is 0). A result of 10 is never issued.
Normalised form
923609016
Also accepted as input
923 609 016
A one-character slip
923609017 is refused
Regex (normalised form)
^[0-9]{9}$
API
GET /companies/search?country=NO&company_number=923609016
VAT number
NO + number + MVA — published or confirmed by the register
Good to know
Sole proprietorships (ENK) are included as the register publishes them.
const re = /^[0-9]{9}$/
re.test('923609016')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

FI FinlandPRH / YTJY-tunnusN{7}-CEnforced0112038-9company_numbercountry=FI
How it is checked, regex, code and links
Check
Weights 7,9,10,5,8,4,2 over the 7 digits; check = 11 minus the sum mod 11 (0 when the remainder is 0). A remainder of 1 has no check digit, so such a number is never issued.
Normalised form
0112038-9
Also accepted as input
01120389112038-9
A one-character slip
0112038-8 is refused
Regex (normalised form)
^[0-9]{7}-[0-9]$
API
GET /companies/search?country=FI&company_number=0112038-9
VAT number
FI + the 8 digits without the hyphen — published or confirmed by the register
Good to know
A 6-digit body (a pre-2001 trade-register number) is read with its leading zero restored.
const re = /^[0-9]{7}-[0-9]$/
re.test('0112038-9')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

SE SwedenBolagsverketOrganisationsnummerN{6}-N{3} CEnforced556012-5790company_numbercountry=SE
How it is checked, regex, code and links
Check
Luhn (mod 10) over the 10 digits, and the third digit must be 2 or higher.
Normalised form
556012-5790
Also accepted as input
5560125790
A one-character slip
556012-5791 is refused
Regex (normalised form)
^[0-9]{6}-[0-9]{4}$
API
GET /companies/search?country=SE&company_number=556012-5790
VAT number
SE + 10 digits + 01 — built from the identifier by rule; the registration is not confirmed
Good to know
A personal identity number (personnummer) has a third digit of 0 or 1 and is refused. Sole traders are never served.
const re = /^[0-9]{6}-[0-9]{4}$/
re.test('556012-5790')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

HR CroatiaSudski registarMBSN{8} CAdvisory080000604company_numbercountry=HR
How it is checked, regex, code and links
Check
ISO 7064 MOD 11,10 over the first 8 digits. Advisory: a mismatch is a warning, not a rejection.
Normalised form
080000604
Also accepted as input
80000604
A one-character slip
080000605 is accepted with a warning
Regex (normalised form)
^[0-9]{9}$
API
GET /companies/search?country=HR&company_number=080000604
VAT number
The register data holds no VAT number for this identifier.
Good to know
The court register itself documents a few legacy numbers whose check digit was computed wrongly. A dropped leading zero is restored. Not the OIB.
const re = /^[0-9]{9}$/
re.test('080000604')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

HR CroatiaOIB (Porezna uprava)OIBN{10} CEnforced27759560625oibcountry=HR
How it is checked, regex, code and links
Check
ISO 7064 MOD 11,10 over the first 10 digits.
Normalised form
27759560625
A one-character slip
27759560626 is refused
Regex (normalised form)
^[0-9]{11}$
API
GET /companies/search?country=HR&oib=27759560625
VAT number
HR + OIB — built from the identifier by rule; the registration is not confirmed
Good to know
Issued to companies and to individuals alike, so a valid OIB does not say which. Nine digits is the length of an MBS, a different number.
const re = /^[0-9]{11}$/
re.test('27759560625')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

BE BelgiumKBO / BCEEnterprise numberN{8} C{2}Enforced0417.497.106company_numbercountry=BE
How it is checked, regex, code and links
Check
10 digits starting with 0 or 1; the last two are 97 minus the first eight digits mod 97.
Normalised form
0417.497.106
Also accepted as input
0417497106417497106
A one-character slip
0417.497.107 is refused
Regex (normalised form)
^[01][0-9]{3}\.[0-9]{3}\.[0-9]{3}$
API
GET /companies/search?country=BE&company_number=0417.497.106
VAT number
BE + the 10 digits — published or confirmed by the register
Good to know
Written 0NNN.NNN.NNN; dots and spaces are optional and a dropped leading zero is restored. Enterprises of natural persons are never served.
const re = /^[01][0-9]{3}\.[0-9]{3}\.[0-9]{3}$/
re.test('0417.497.106')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

DK DenmarkCVR (Erhvervsstyrelsen)CVR numberN{8}Advisory24256790company_numbercountry=DK
How it is checked, regex, code and links
Check
Weights 2,7,6,5,4,3,2,1 over all 8 digits; the sum should divide by 11. Advisory: a mismatch is a warning.
Normalised form
24256790
Also accepted as input
24 25 67 90
A one-character slip
24256791 is accepted with a warning
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=DK&company_number=24256790
VAT number
DK + CVR — built from the identifier by rule; the registration is not confirmed
Good to know
Some genuine CVR numbers fail the mod-11 check. Sole proprietorships and estates are never served.
const re = /^[0-9]{8}$/
re.test('24256790')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

EE EstoniaÄriregister (RIK)Registry code (registrikood)N{7} CEnforced10060701company_numbercountry=EE
How it is checked, regex, code and links
Check
First digit 1, 7, 8 or 9. Weights 1 to 7 over the first 7 digits, sum mod 11; when that is 10 the weights 3 to 9 are used, and a second 10 reads as 0.
Normalised form
10060701
Also accepted as input
1006 0701
A one-character slip
10060702 is refused
Regex (normalised form)
^[1789][0-9]{7}$
API
GET /companies/search?country=EE&company_number=10060701
VAT number
EE + 9 digits (KMKR, a separate number) — published or confirmed by the register
Good to know
The VAT number (KMKR) is a separate number and cannot be derived from it. Sole traders (FIE) are never served.
const re = /^[1789][0-9]{7}$/
re.test('10060701')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

SK SlovakiaRPOIČON{7} CAdvisory35763469company_numbercountry=SK
How it is checked, regex, code and links
Check
Weights 8,7,6,5,4,3,2 over the first 7 digits; check = 11 minus the sum mod 11 (10 reads as 0, 11 as 1). Advisory: a mismatch is a warning.
Normalised form
35763469
Also accepted as input
151653
A one-character slip
35763460 is accepted with a warning
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=SK&company_number=35763469
VAT number
The register data holds no VAT number for this identifier.
Good to know
About one percent of the IČO of non-commercial legal forms fail the check. Six and seven digit numbers are read with leading zeros restored. Commercial legal persons only.
const re = /^[0-9]{8}$/
re.test('35763469')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

CH SwitzerlandZefix, UID-Register (BFS)UIDCHE N{8} CEnforcedCHE-103.867.266company_numbercountry=CH
How it is checked, regex, code and links
Check
CHE plus 9 digits. Weights 5,4,3,2,7,6,5,4 over the first 8 digits; check = 11 minus the sum mod 11 (11 reads as 0). A result of 10 means no valid UID.
Normalised form
CHE103867266
Also accepted as input
CHE-103.867.266 MWSTCHE103867266
A one-character slip
CHE-103.867.267 is refused
Regex (normalised form)
^CHE[0-9]{9}$
API
GET /companies/search?country=CH&company_number=CHE-103.867.266
VAT number
the UID + MWST, TVA or IVA
Good to know
Dots, hyphens and a MWST, TVA or IVA suffix are accepted. Sole proprietorships are never served.
const re = /^CHE[0-9]{9}$/
re.test('CHE103867266')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

LV LatviaUzņēmumu reģistrsRegistration numberN{10} CEnforced40003032949company_numbercountry=LV
How it is checked, regex, code and links
Check
11 digits starting 4 to 9. Weights 9,1,4,8,3,10,2,5,7,6,1; the sum mod 11 must be 3.
Normalised form
40003032949
Also accepted as input
LV40003032949
A one-character slip
40003032940 is refused
Regex (normalised form)
^[4-9][0-9]{10}$
API
GET /companies/search?country=LV&company_number=40003032949
VAT number
LV + the 11 digits (State Revenue Service list) — published or confirmed by the register
Good to know
An 11-digit number starting 0 to 3 is a personal code and is refused. The oldest 9-digit codes carry no check digit.
const re = /^[4-9][0-9]{10}$/
re.test('40003032949')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

CY CyprusDRCORRegistration numberHE | AE + N{1,9}NoneHE165company_numbercountry=CY
How it is checked, regex, code and links
Check
No check digit: HE (company) or AE (overseas company) and up to 9 digits without a leading zero. The shape is the only test.
Normalised form
HE165
Also accepted as input
165AE3834
Regex (normalised form)
^(HE|AE)[1-9][0-9]{0,8}$
API
GET /companies/search?country=CY&company_number=HE165
VAT number
The register data holds no VAT number for this identifier.
Good to know
Bare digits mean HE. Trade names and partnerships are never served.
const re = /^(HE|AE)[1-9][0-9]{0,8}$/
re.test('HE165')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

RO RomaniaONRCCUI / CIFN{1,9} CAdvisory5022670company_numbercountry=RO
How it is checked, regex, code and links
Check
2 to 10 digits without a leading zero. The body is padded to 9 digits and weighted 7,5,3,2,1,7,5,3,2; check = sum x 10 mod 11 (10 reads as 0). Advisory: a mismatch is a warning.
Normalised form
5022670
Also accepted as input
RO5022670
A one-character slip
5022671 is accepted with a warning
Regex (normalised form)
^[1-9][0-9]{1,9}$
API
GET /companies/search?country=RO&company_number=5022670
VAT number
RO + CUI — built from the identifier by rule; the registration is not confirmed
Good to know
A few genuine CUI fail the check. An RO, CUI or CIF prefix is accepted; a 13-digit number is a personal code and is refused.
const re = /^[1-9][0-9]{1,9}$/
re.test('5022670')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

US United StatesState registers, SEC (CIK), GLEIF (LEI)State + register number, CIK-, LEI-SS-X{1,40} | CIK-N{10} | LEI-X{20}NoneNY-4424185company_numbercountry=US
How it is checked, regex, code and links
Check
No check digit anywhere: the state code and register number, CIK- and up to 10 digits (an SEC filer), or LEI- and 20 characters. The shape is the only test.
Normalised form
NY-4424185
Also accepted as input
ny 4424185CIK-0000320193
Regex (normalised form)
^([A-Z]{2}-[0-9A-Za-z][0-9A-Za-z./-]{0,39}|CIK-[0-9]{10}|LEI-[0-9A-Z]{20})$
API
GET /companies/search?country=US&company_number=NY-4424185
VAT number
The register data holds no VAT number for this identifier.
Good to know
Register numbers repeat across states, so the state prefix is part of the identifier. The API serves a defined set of state registers plus SEC filers and LEI holders, not every US company.
const re = /^([A-Z]{2}-[0-9A-Za-z][0-9A-Za-z./-]{0,39}|CIK-[0-9]{10}|LEI-[0-9A-Z]{20})$/
re.test('NY-4424185')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

LT LithuaniaJAR (Registrų centras)Company code (juridinio asmens kodas)N{8} CEnforced110053842company_numbercountry=LT
How it is checked, regex, code and links
Check
Weights 1 to 8 over the first 8 digits, sum mod 11; when that is 10 the weights 3,4,5,6,7,8,9,1 are used, and a second 10 reads as 0.
Normalised form
110053842
A one-character slip
110053843 is refused
Regex (normalised form)
^[0-9]{9}$
API
GET /companies/search?country=LT&company_number=110053842
VAT number
LT + 9 or 12 digits (State Tax Inspectorate list) — published or confirmed by the register
Good to know
LT in front is a VAT number, not the company code, and is refused. Sole proprietorships and partnerships are never served.
const re = /^[0-9]{9}$/
re.test('110053842')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

CA CanadaCorporations CanadaFederal corporation numberN{1,6}-CAdvisory426160-7company_numbercountry=CA
How it is checked, regex, code and links
Check
2 to 8 digits, written NNNNNN-N. Weights 7,6,5,4,3,2 over the six digits before the last; check = 11 minus the sum mod 11 (10 reads as 0, 11 as 1). Inferred from the register, not documented, so advisory.
Normalised form
426160-7
Also accepted as input
4261607#4261607
A one-character slip
426160-8 is accepted with a warning
Regex (normalised form)
^[0-9]{1,7}-[0-9]$
API
GET /companies/search?country=CA&company_number=426160-7
VAT number
The register data holds no VAT number for this identifier.
Good to know
Nine digits is a Business Number (searched with business_number), not a corporation number. Federal corporations only; provincial corporations are never served.
const re = /^[0-9]{1,7}-[0-9]$/
re.test('426160-7')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

AU AustraliaASIC (ACN, ARBN)ACN / ARBNN{8} CEnforced004 028 077company_numbercountry=AU
How it is checked, regex, code and links
Check
Weights 8,7,6,5,4,3,2,1 over the first 8 digits; check = (10 - sum mod 10) mod 10. Shown in ASIC’s 3-3-3 form.
Normalised form
004 028 077
Also accepted as input
004028077ACN 004 028 077
A one-character slip
004 028 078 is refused
Regex (normalised form)
^[0-9]{3} [0-9]{3} [0-9]{3}$
API
GET /companies/search?country=AU&company_number=004 028 077
VAT number
the ABN (11 digits), while active and registered for GST — published or confirmed by the register
Good to know
ACN and ARBN share one number space. An 11-digit number is an ABN, a separate number. Proprietary, public and foreign companies only.
const re = /^[0-9]{3} [0-9]{3} [0-9]{3}$/
re.test('004 028 077')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

AU AustraliaAustralian Business RegisterABNN{2} N{9}Enforced49004028077abncountry=AU
How it is checked, regex, code and links
Check
11 digits. Subtract 1 from the first digit, then weights 10,1,3,5,7,9,11,13,15,17,19; the sum must divide by 89.
Normalised form
49004028077
Also accepted as input
49 004 028 077ABN 49004028077
A one-character slip
49004028078 is refused
Regex (normalised form)
^[0-9]{11}$
API
GET /companies/search?country=AU&abn=49004028077
VAT number
the ABN itself, while active and registered for GST — published or confirmed by the register
Good to know
The ABN is the GST number while the business is active and registered for GST. It is searched with abn= and is never taken by company_number.
const re = /^[0-9]{11}$/
re.test('49004028077')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

JP JapanNational Tax AgencyCorporate number (法人番号)C N{12}Enforced1180301018771company_numbercountry=JP
How it is checked, regex, code and links
Check
13 digits; the first is the check digit over the 12-digit base: 9 minus (the sum of the base digits, weighted 1 and 2 alternately from the right, mod 9).
Normalised form
1180301018771
Also accepted as input
T1180301018771
A one-character slip
1180301018772 is refused
Regex (normalised form)
^[1-9][0-9]{12}$
API
GET /companies/search?country=JP&company_number=1180301018771
VAT number
The register data holds no VAT number for this identifier.
Good to know
A T in front and full-width digits are read; the bare 12-digit base is refused. Companies only; government bodies and associations are never served.
const re = /^[1-9][0-9]{12}$/
re.test('1180301018771')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

IL IsraelCorporations AuthorityCompany number (ח.פ.)N{8} CAdvisory520013954company_numbercountry=IL
How it is checked, regex, code and links
Check
9 digits starting 51, 52 or 56. The Israeli ID Luhn variant: weights 1,2 alternately, digit sums, total divisible by 10. Advisory: a mismatch is a warning.
Normalised form
520013954
Also accepted as input
ח.פ. 520013954
A one-character slip
520013955 is accepted with a warning
Regex (normalised form)
^5[126][0-9]{7}$
API
GET /companies/search?country=IL&company_number=520013954
VAT number
The register data holds no VAT number for this identifier.
Good to know
A personal ID passes the same arithmetic and is refused on the prefix. Partnerships, cooperatives and associations are other registers and never served.
const re = /^5[126][0-9]{7}$/
re.test('520013954')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

BR BrazilReceita Federal (CNPJ)CNPJX{12} C{2}Enforced33.000.167/0001-01company_numbercountry=BR
How it is checked, regex, code and links
Check
14 characters: 8 for the root, 4 for the order, 2 check digits. First digit: weights 5,4,3,2,9,8,7,6,5,4,3,2 over 12 characters; second: weights 6,5,4,3,2,9,8,7,6,5,4,3,2 over 13; each is 0 when the sum mod 11 is below 2, else 11 minus it.
Normalised form
33000167000101
Also accepted as input
33000167000101
A one-character slip
33.000.167/0001-02 is refused
Regex (normalised form)
^[0-9A-Z]{12}[0-9]{2}$
API
GET /companies/search?country=BR&company_number=33.000.167/0001-01
VAT number
The register data holds no VAT number for this identifier.
Good to know
Since July 2026 root and order may carry capital letters; the check digits stay digits. An 11-digit CPF (a person) is refused. One record per CNPJ root: the 8-digit root finds the head office.
const re = /^[0-9A-Z]{12}[0-9]{2}$/
re.test('33000167000101')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

AR ArgentinaARCA (CUIT), Registro Nacional de SociedadesCUITN{2}-N{8}-CEnforced30-70308853-4company_numbercountry=AR
How it is checked, regex, code and links
Check
11 digits, written NN-NNNNNNNN-N. Weights 5,4,3,2,7,6,5,4,3,2 over the first ten digits; check = 11 minus the sum mod 11, where 11 reads as 0 and 10 means the body gives no valid number (a company then holds prefix 33 instead of 30).
Normalised form
30-70308853-4
Also accepted as input
30703088534CUIT 30-70308853-4
A one-character slip
30-70308853-5 is refused
Regex (normalised form)
^(30|33|34)-[0-9]{8}-[0-9]$
API
GET /companies/search?country=AR&company_number=30-70308853-4
VAT number
The register data holds no VAT number for this identifier.
Good to know
The CUIT is the tax number ARCA gives a legal entity; the Registro Nacional de Sociedades is built on it. A company holds prefix 30 or 33, a foreign legal entity 34; prefixes 20, 23, 24 and 27 are the CUIT and CUIL of people and are refused. A leading CUIT, CUIL or CDI word is dropped. Commercial companies only: associations, foundations, cooperatives and sociedades de hecho are never served.
const re = /^(30|33|34)-[0-9]{8}-[0-9]$/
re.test('30-70308853-4')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

UA UkraineUnified State Register (EDR), Ministry of Justice of UkraineEDRPOU codeN{8}Advisory21673832company_numbercountry=UA
How it is checked, regex, code and links
Check
8 digits, leading zeros kept. The last digit is a mod-11 check digit, but it is only advisory here because a few genuine codes of the register fail it.
Normalised form
21673832
Also accepted as input
UA21673832
A one-character slip
21673833 is accepted with a warning
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=UA&company_number=21673832
VAT number
The register data holds no VAT number for this identifier.
Good to know
The EDRPOU code identifies a legal entity in the Unified State Register of the Ministry of Justice of Ukraine. A shorter number is read with its zeros restored, and a UA prefix, spaces and hyphens are tolerated. A 10-digit number is a person’s tax number and is refused. Commercial legal persons only; individual entrepreneurs (FOP) are never served.
const re = /^[0-9]{8}$/
re.test('21673832')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

RS SerbiaBusiness Registers Agency (APR)Matični broj (MB)N{7} CEnforced17204106company_numbercountry=RS
How it is checked, regex, code and links
Check
8 digits, the leading zero kept; a shorter number is read with its leading zeros restored. Weights 9,4,5,6,7,8,9 over the first 7 digits, s = sum mod 11; the check digit is s, with 10 read as 0. The rule is fitted to the numbers of the register itself, not to a published standard, and a mismatch is refused.
Normalised form
17204106
Also accepted as input
17-204-106
A one-character slip
17204107 is refused
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=RS&company_number=17204106
VAT number
The register data holds no VAT number for this identifier.
Good to know
A 13-digit number is a personal number (JMBG) and is refused. The tax number (PIB) is a separate number that the register open data does not carry and that cannot be derived from the matični broj. Companies only (d.o.o., a.d., o.d., k.d.); entrepreneurs, cooperatives, public enterprises and associations are never served.
const re = /^[0-9]{8}$/
re.test('17204106')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

EC EcuadorServicio de Rentas Internas (SRI), Superintendencia de Compañías (SCVS)RUCN{9} C N{3}Advisory0990023549001company_numbercountry=EC
How it is checked, regex, code and links
Check
13 digits: province (01 to 24, 30 abroad), a third digit 9 (private company) or 6 (public), a serial, the check digit and 001, the company itself (002 and up are its establishments). Module 11: weights 4,3,2,7,6,5,4,3,2 over the first nine digits, check = 11 minus the sum mod 11 (11 reads 0), the tenth digit; a public RUC (third digit 6) uses weights 3,2,7,6,5,4,3,2 over eight digits and the ninth digit. Advisory: a mismatch is a warning, not a rejection.
Normalised form
0990023549001
Also accepted as input
990023549001
A one-character slip
0990023548001 is accepted with a warning
Regex (normalised form)
^(0[1-9]|1[0-9]|2[0-4]|30)[69][0-9]{7}001$
API
GET /companies/search?country=EC&company_number=0990023549001
VAT number
The register data holds no VAT number for this identifier.
Good to know
A third digit 0 to 5 is a natural person's RUC (the cédula plus 001) and is refused, and so is a RUC ending 002 or higher, which is an establishment. A 12-digit value is read with the zero of the province restored (a spreadsheet drops it). The check digit is only a guide: the numbers of the Sociedades por Acciones Simplificadas are plain serials that often fail it. The RUC is the tax number: there is no separate VAT number.
const re = /^(0[1-9]|1[0-9]|2[0-4]|30)[69][0-9]{7}001$/
re.test('0990023549001')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

CL ChileRegistro de Empresas y Sociedades (RES), Ministerio de Economía, Fomento y Turismo; RUT of the Servicio de Impuestos Internos (SII)RUTN{8}-CEnforced76286049-Kcompany_numbercountry=CL
How it is checked, regex, code and links
Check
Eight digits from 50,000,000 (the block of legal persons), a dash and a check digit (0 to 9 or K), written 76.286.049-K. Weights 2,3,4,5,6,7 repeating from the right over the eight digits; check = 11 minus the sum mod 11, where 11 reads 0 and 10 reads K. The check is strict.
Normalised form
76286049-K
Also accepted as input
76.286.049-K76286049KRUT 76286049-k
A one-character slip
76286049-0 is refused
Regex (normalised form)
^[5-9][0-9]{7}-[0-9K]$
API
GET /companies/search?country=CL&company_number=76286049-K
VAT number
The register data holds no VAT number for this identifier.
Good to know
The RUT is the tax number the Servicio de Impuestos Internos (SII) gives a Chilean legal entity, and there is no separate VAT number. The register serves only the companies registered under the simplified regime of Ley 20.659 ("Empresa en un Día") since 2013, so a valid RUT of an older company, or of one formed before a notary, finds nothing. Dots, the word RUT and a lower-case k are accepted. A RUT below 50,000,000 belongs to a natural person and is refused.
const re = /^[5-9][0-9]{7}-[0-9K]$/
re.test('76286049-K')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

CO ColombiaRUES (Confecámaras), DIANNITN{9}-CEnforced900843898-9company_numbercountry=CO
How it is checked, regex, code and links
Check
9 digits starting 8 or 9, then the verification digit (DV) after a hyphen. Weights 3,7,13,17,19,23,29,37,41 from the right; DV = the remainder of the sum mod 11 when below 2, else 11 minus it.
Normalised form
900843898-9
Also accepted as input
900843898NIT 900843898-9
A one-character slip
900843898-8 is refused
Regex (normalised form)
^[89][0-9]{8}-[0-9]$
API
GET /companies/search?country=CO&company_number=900843898-9
VAT number
The register data holds no VAT number for this identifier.
Good to know
The DV is computed when left out and must match when typed. A number starting 1 to 7 is a personal cédula and is refused.
const re = /^[89][0-9]{8}-[0-9]$/
re.test('900843898-9')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

SG SingaporeACRAUENN{9} C | L N{2} L{2} N{4} CEnforced196800306Ecompany_numbercountry=SG
How it is checked, regex, code and links
Check
Local company: weights 10,8,6,4,9,7,5,3,1 over the 9 digits, sum mod 11 picks the check letter from Z K C M D N E R G W H. LLPs and foreign branches (T, S or R, year, two letters, serial) use weights 4,3,5,3,10,2,2,5,7 and the letters A B C D E F G H J K L.
Normalised form
196800306E
Also accepted as input
T08LL1267L
A one-character slip
196800306F is refused
Regex (normalised form)
^([0-9]{9}|[TSR][0-9]{2}[A-Z]{2}[0-9]{4})[A-Z]$
API
GET /companies/search?country=SG&company_number=196800306E
VAT number
The register data holds no VAT number for this identifier.
Good to know
An 8-digit business UEN (sole proprietorship, partnership) is refused. Local companies, LLPs and registered foreign company branches only.
const re = /^([0-9]{9}|[TSR][0-9]{2}[A-Z]{2}[0-9]{4})[A-Z]$/
re.test('196800306E')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

TW TaiwanGCIS (Ministry of Economic Affairs), Ministry of FinanceUnified business number (統一編號)N{7} CAdvisory22099131company_numbercountry=TW
How it is checked, regex, code and links
Check
8 digits. Weights 1,2,1,2,1,2,4,1, each product taken as tens digit plus units digit; the total should divide by 5 (10 before the 2023-24 change; a 7th digit of 7 may count as 0 or 1). Advisory: a mismatch is a warning.
Normalised form
22099131
Also accepted as input
TW22099131
A one-character slip
22099132 is accepted with a warning
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=TW&company_number=22099131
VAT number
the 8-digit UBN, where the company is in the Ministry of Finance tax file — published or confirmed by the register
Good to know
A few old dissolved numbers fail both rules. Seven digits are padded with a zero. Companies and Taiwan branches of foreign companies only; names are in Chinese.
const re = /^[0-9]{8}$/
re.test('22099131')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

CZ Czech RepublicVeřejný rejstřík (Ministry of Justice), RESIČON{7} CAdvisory45274649company_numbercountry=CZ
How it is checked, regex, code and links
Check
8 digits, shorter numbers read with leading zeros. Weights 8,7,6,5,4,3,2 over the first 7 digits, r = sum mod 11; check = 1 when r is 0, 0 when r is 1, else 11 minus r. Advisory: a mismatch is a warning.
Normalised form
45274649
Also accepted as input
CZ45274649
A one-character slip
45274640 is accepted with a warning
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=CZ&company_number=45274649
VAT number
The register data holds no VAT number for this identifier.
Good to know
A few live companies fail the check. A 9 or 10 digit number is a birth number (a natural person) and is refused. Sole traders are never served.
const re = /^[0-9]{8}$/
re.test('45274649')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

DE GermanyGLEIF (LEI), MarktstammdatenregisterLEIX{18} C{2}EnforcedW38RGI023J3WT1HWRP32company_numbercountry=DE
How it is checked, regex, code and links
Check
ISO 17442, ISO 7064 MOD 97-10: 18 letters or digits and 2 check digits; each letter becomes 10 to 35 and the whole string, read as one integer, leaves 1 modulo 97.
Normalised form
W38RGI023J3WT1HWRP32
Also accepted as input
w38r-gi02-3j3w-t1hw-rp32
A one-character slip
W38RGI023J3WT1HWRP33 is refused
Regex (normalised form)
^[0-9A-Z]{18}[0-9]{2}$
API
GET /companies/search?country=DE&company_number=W38RGI023J3WT1HWRP32 · also taken by lei=
VAT number
The register data holds no VAT number for this identifier.
Good to know
German company records are LEI-registered entities (GLEIF) and companies from the energy market register, not an extract of the Handelsregister. A company of the energy market register is numbered by its commercial-register entry, for example HRB12653/FRANKFURT-AM-MAIN (searched with register_number), declared by the operators and not checked against the register.
const re = /^[0-9A-Z]{18}[0-9]{2}$/
re.test('W38RGI023J3WT1HWRP32')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

NL NetherlandsGLEIF (LEI-registered entities); the KVK number of the Kamer van KoophandelKVK numberN{8}None17085815company_numbercountry=NL
How it is checked, regex, code and links
Check
No check digit is published: exactly 8 digits, a leading zero is part of the number (04040577), 00000000 is no number. The shape is the only test.
Normalised form
17085815
Also accepted as input
04040577
Regex (normalised form)
^[0-9]{8}$
API
GET /companies/search?country=NL&company_number=17085815
VAT number
The register data holds no VAT number for this identifier.
Good to know
The KVK number is the number of the Dutch Chamber of Commerce. Prometiam serves only Dutch legal entities that hold an LEI and whose KVK number GLEIF records (BV, NV, SE, cooperatives, OWM, CV and VOF), not every Dutch company and not an extract of the Dutch commercial register: a well-formed KVK number of a sole proprietorship, a foundation or an association finds nothing. A 9-digit number is an RSIN and is refused. The Dutch VAT number (btw-nummer) is a separate number and cannot be derived from the KVK number.
const re = /^[0-9]{8}$/
re.test('17085815')  // true

The regex tests the shape of the normalised form. It does not compute the check digit: run the identifier through the validator for that.

What this table does and does not prove

  • A valid shape and check digit prove a number is well-formed, not that a company holds it. Only a lookup in the register answers that.
  • UK, Irish, Cypriot and US identifiers have no check digit: for those the shape is the only test.
  • For the rows marked Advisory, genuine numbers exist that fail the check, so a mismatch is a warning and the number is still accepted.
  • These are the formats the Prometiam API accepts. Which entities it serves in each country has its own limits (sole traders and natural persons are left out in many registers); they are in each country’s guide.
  • VAT numbers are separate: where one can be built from the identifier the row says how, and whether the registration is confirmed. Check a VAT number at the VAT number checker.

In your own code

Each row opens a regex you can paste into JavaScript, Python or PostgreSQL. Validators for many of these countries (not all of them) are also published as the company-id-validators package, on PyPI and on npm.

Questions

Which company identifiers have a check digit?
Most of them: the Check digit column says Enforced, Advisory or None for each row. The United Kingdom, Ireland, Cyprus and the United States publish none, so only the shape can be tested. The rows marked Advisory have a check that genuine numbers can fail, so a mismatch is only a warning.

Does a valid check digit mean the company exists?
No. It proves the number is internally consistent, not that it was ever issued. To know whether the company exists, look it up in the register or through an API.

How do I normalise an identifier before storing it?
Strip spaces, dots, hyphens and slashes, upper-case the letters and restore dropped leading zeros where the register uses them. The Normalised form column shows what each validator returns; the API accepts the written forms too.

Can I use the table in my own project?
Yes. The JSON and CSV downloads carry the same rows. They are free to cite with attribution to Prometiam and a link to this page.

Validate a number in your browser, or look the company up.