Skip to main content

The identifier catalog

Use it when you need a technical identifier that has to look real and pass a format check — a UUID, an email, an IBAN, a payment-card number, a checksummed tax or document number — without inventing it by hand or copying a real one. Every path on this page is a value for type="template"; the value attribute is a dotted path that picks which identifier you get.

This page is the full lookup. For a guided tour of the same generator — person data, dates, localization — see the template generator. For the person, name, and date families specifically, that page is the better starting point; this one is the exhaustive catalog of technical identifiers.

Outputs are illustrative

Every value below comes from a fixed seed, so it's reproducible, but the exact string can change between core versions. Read them as examples of shape, not as guarantees.

How to call

Two naming rules split the catalog:

  • Global identifiers carry a common. prefix — common.id.uuid, common.finance.iban, common.payment.card.pan, common.phone.e164.
  • Country-specific ones start with the country name — usa.docs.ssn, usa.tax.ein, brazil.tax.cpf, poland.docs.pesel.
<gen type="template" value="common.id.uuid"/>
<gen type="template" value="usa.docs.ssn"/>

An unknown path is a hard error, never a silent blank:

./run bad.tdc
error[TDC071]: unknown template path "usa.docs.nope"
--> bad.tdc:2:48
|
2 | <gen type="template" value="usa.docs.nope"/>
|                             ^^^^^^^^^^^^^

Why these pass validation

Most "number-like" identifiers carry a check digit computed from the rest of the number (Luhn, mod-11, ISO 7064, GS1 mod-10, …). Ten random digits fail the very first format check, so a test built on them is worthless. These templates emit values that pass their checksum yet are deliberately not real — reserved test ranges, fictional prefixes, IANA-reserved TLDs — so they're safe to drop into demos, fixtures, and CI. How each check digit is defined is covered below.

Parameters

Many identifiers accept parameters — pass them as ordinary attributes on <gen>. Any parameter you leave out is drawn at random; the ones you set are pinned across every row, and the check digit is recomputed each time so the value stays valid.

For example, pin the area part of every US Social Security number:

<gen type="template" value="usa.docs.ssn" area="555"/>
./run ssn.tdc
555700070
555073260
555030016
555375840
555020557

Every value starts with 555, and each one is still a well-formed SSN. Use a parameter when part of the identifier has to stay constant — a fixed issuer, a fixed tax office, a fixed domain — while the rest varies.

Discovering a path's parameters

A parameter is just a local <sequence name="…"> inside the data pack behind the path, and the caller overrides it with a constant. So the parameters a path accepts are exactly the local sequence names in its pack. Getting one wrong is a clear error (TDC072), never a silent no-op:

./run bad-param.tdc
error[TDC072]: "bogus" is not a parameter of "usa.docs.ssn" — it would be ignored
--> bad-param.tdc:2:47
|
2 | <gen type="template" value="usa.docs.ssn" bogus="1"/>
|                                           ^^^^^

A few representative paths and the parameters they expose:

PathParameters
common.internet.emaillocal, domain
common.internet.urlscheme, domain, slug
common.internet.domainword, token, suffix
common.finance.ibanbban
common.payment.card.panbase
usa.docs.ssnarea, group, serial
usa.tax.einprefix, serial
usa.tax.itinmid, group, serial
usa.finance.aba_routingprefix, tail
Simplified variants

When these generators moved into editable packs, a few rarely used parameters and "formatted" variants (the ones with brackets or dashes) were reduced to the plain form. The checksums and the core format are unchanged; only the cosmetic wrapping is gone.

IDs and internet

Opaque IDs (UUID, ULID, Nano ID, ObjectId), commit hashes, and safe web values. Use them when a record needs a primary key, a fake email, or a placeholder URL that can't collide with a real one.

<gen type="template" value="common.id.uuid"/>
<gen type="template" value="common.id.ulid"/>
<gen type="template" value="common.id.nanoid"/>
<gen type="template" value="common.git.sha"/>
./run ids.tdc
common.id.uuid        63af26a7-9997-4aa8-8883-bec8f2a5c541
common.id.ulid        5GQ9BM9G731XA1KW1KMYM9EGAK
common.id.nanoid      LKCYPokQsGREjVYrZvJjz
common.id.object_id   3ed9c528008a4cc46dbb53b2
common.git.sha        efffc5bd4c321932277f4ff77cc01993344ecd2e
common.system.semver  8.13.7

Emails and domains use IANA-reserved TLDs (.test, .invalid, .example), and the IPs sit in private or documentation ranges, so nothing here can reach a real address:

./run internet.tdc
common.internet.email     qjoasyc4yx@sandbox-8s2332.test
common.internet.domain    test-26vh9o.test
common.internet.url       https://fixture-vaqpcg.example/atlas-sandbox-sandbox
common.internet.ipv4      10.251.85.160
common.internet.ipv6      2001:db8:c43:28eb:f2c:ee5:e:8d5
common.internet.mac       c5:62:b8:e2:af:d3
common.internet.username  lfmln1e_b
PathProducesExample
common.git.shaGit commit SHA-1 (40 lowercase hex chars)efffc5bd4c321932277f4ff77cc01993344ecd2e
common.id.nanoidNano ID (21 chars, URL-safe alphabet A–Za–z0–9_-)LKCYPokQsGREjVYrZvJjz
common.id.object_idMongoDB ObjectId (24 lowercase hex chars)3ed9c528008a4cc46dbb53b2
common.id.ulidULID (26 chars, Crockford base32; first char 0–7)5GQ9BM9G731XA1KW1KMYM9EGAK
common.id.uuidUUID v4 (RFC 4122 — version 4, variant 8/9/a/b)63af26a7-9997-4aa8-8883-bec8f2a5c541
common.internet.domainSafe fake domain — token.suffix (RFC 2606 reserved TLDs)test-26vh9o.test
common.internet.emailSafe email — a 10-char local part at a safe fake domainqjoasyc4yx@sandbox-8s2332.test
common.internet.ipv4IPv4 in the private ranges (10/8, 172.16/12, 192.168/16)10.251.85.160
common.internet.ipv6IPv6 in the 2001:db8::/32 documentation range2001:db8:c43:28eb:f2c:ee5:e:8d5
common.internet.macMAC address — six colon-separated lowercase hex octetsc5:62:b8:e2:af:d3
common.internet.slugURL slug — 2 to 4 lowercase words joined by hyphenstest-atlas-sandbox
common.internet.urlSafe URL — scheme://safe-domain/slug (the scheme defaults to https)https://fixture-vaqpcg.example/atlas-sandbox-sandbox
common.internet.usernameUsername — a leading letter, then 7–13 chars of a–z0–9_lfmln1e_b
common.system.semverSemantic version — major 0–9, minor 0–19, patch 0–998.13.7

Finance and payments

IBANs, SWIFT/BIC codes, payment-card PANs, and the US ABA routing number — each with a real check built in. Use them when a fixture has to survive a bank-format check or a Luhn validator.

<gen type="template" value="common.finance.iban"/>
<gen type="template" value="common.finance.bic"/>
<gen type="template" value="common.payment.card.pan"/>
<gen type="template" value="usa.finance.aba_routing"/>
./run finance.tdc
common.finance.iban       DE60077427668812994595
common.finance.bic        VROLFR00F1Y
common.payment.card.pan   4111111726740445
usa.finance.aba_routing   649946910

The IBAN carries a valid ISO 7064 mod-97 check, the PAN carries a valid Luhn check in the Visa test range (4111…), and the routing number carries a valid mod-10 [3,7,1] check.

PathProducesExample
common.finance.bicSWIFT/BIC-11 (4 letters + country + 2 location + 3 branch)VROLFR00F1Y
common.finance.ibanIBAN (country defaults to DE, 18-digit BBAN, ISO 7064 mod-97 check)DE60077427668812994595
common.payment.card.panPayment-card PAN (Visa test range, 16 digits + Luhn check)4111111726740445
usa.finance.aba_routingUS ABA routing number (8 digits + mod-10 [3,7,1] check)649946910

Products and devices

Retail and hardware barcodes and identifiers — ISBN, EAN, UPC, GTIN, IMEI, ICCID, ISSN. Use them when a catalog or inventory fixture has to pass a scanner or a format check.

<gen type="template" value="common.book.isbn13"/>
<gen type="template" value="common.product.ean13"/>
<gen type="template" value="common.device.imei"/>
./run products.tdc
common.book.isbn13     9783635567452
common.product.ean13   9418766812071
common.product.upc_a   277703531852
common.product.gtin14  69243931643417
common.device.imei     263236381039942
common.device.iccid    8910106572426433879
common.periodical.issn 23614552
common.vehicle.vin     XJV8TB3B7W5726830
PathProducesExample
common.book.isbn10ISBN-10 (9 digits + mod-11 check, 10 → X)1684319684
common.book.isbn13ISBN-13 (978/979 prefix + 9 digits + GS1 mod-10 check)9783635567452
common.periodical.issnISSN (7-digit base + mod-11 check, weights 8..2, 10 → X)23614552
common.product.ean13EAN-13 (12-digit base + GS1 mod-10 check)9418766812071
common.product.gtin14GTIN-14 (13-digit base + GS1 mod-10 check)69243931643417
common.product.upc_aUPC-A (11-digit base + GS1 mod-10 check)277703531852
common.device.iccidICCID (89 + country + issuer prefix, 19 digits + Luhn check)8910106572426433879
common.device.imeiIMEI (14-digit base + Luhn check digit, 15 digits in all)263236381039942

Security and hashes

API keys, one-time codes, TOTP secrets, JWTs, and raw digests. Use them when you need a credential-shaped placeholder for an auth flow or a log line — never a real secret.

<gen type="template" value="common.security.api_key"/>
<gen type="template" value="common.security.otp"/>
<gen type="template" value="common.security.sha256"/>
./run security.tdc
common.security.api_key      tdc_cxmmn0eD60xEB5CLOilveNjDyxBcYaaM
common.security.otp          874846
common.security.md5          db3d24933e41cbafde844af6dddc769f
common.security.sha1         313f20b6a4fb5eedc53cf02ae32e56c2b7ee0d7b
common.security.sha256       f1be92ba089ddaa35e2273dd6c7d66d712c85e313316a2f006786f383e9f686e
common.security.totp_secret  76F7GJ5PYJXYHYY7E5DMY2L6G6XGVSAL
PathProducesExample
common.security.api_keyAPI key (tdc_ prefix by default + 32 alphanumerics)tdc_cxmmn0eD60xEB5CLOilveNjDyxBcYaaM
common.security.jwtFake JWT (fixed base64url header per alg + random payload and signature)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.6LKo…
common.security.md5MD5 digest (32 lowercase hex chars)db3d24933e41cbafde844af6dddc769f
common.security.otpNumeric one-time passcode (6 digits by default)874846
common.security.sha1SHA-1 digest (40 lowercase hex chars)313f20b6a4fb5eedc53cf02ae32e56c2b7ee0d7b
common.security.sha256SHA-256 digest (64 lowercase hex chars)f1be92ba089ddaa35e2273dd6c7d66d712c85e313316a2f006786f383e9f686e
common.security.totp_secretTOTP shared secret (32 base32 chars by default, RFC 4648 A–Z2–7)76F7GJ5PYJXYHYY7E5DMY2L6G6XGVSAL

Documents, transport, logistics

Machine-readable travel documents (ICAO 9303 MRZ), vehicle VINs, and ISO 6346 shipping containers. Use them when a fixture gets scanned or OCR'd and has to satisfy the format's composite check digits.

The two MRZ paths are multi-line — a TD1 identity card is three 30-char lines and a TD3 passport is two 44-char lines, each carrying ICAO composite check digits:

./run mrz.tdc
common.docs.mrz.id_td1 (identity card, three 30-char lines):
I<UTOV80Y7XXNC58C1E31V2B6IGCXD
8402079F3111275UTOFP4DCM7IPY95
MILLER<<ADAM<<<<<<<<<<<<<<<<<<

common.docs.mrz.passport_td3 (passport, two 44-char lines):
P<UTODOE<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
22VVYEM7V0UTO9403280<3703276L73REEFL4AFXU642

The single-line codes:

./run transport.tdc
common.vehicle.vin                  XJV8TB3B7W5726830
common.logistics.container_iso6346  PQXU6242844
PathProducesExample
common.docs.mrz.id_td1ICAO 9303 TD1 identity-card MRZ (three 30-char lines) with composite check digits(see above)
common.docs.mrz.passport_td3ICAO 9303 TD3 passport MRZ (two 44-char lines) with composite check digits(see above)
common.logistics.container_iso6346ISO 6346 container code (owner + category + 6-digit serial + mod-11 check)PQXU6242844
common.vehicle.vinVehicle identification number (ISO 3779, 17 chars, weighted mod-11 check; 10 → X)XJV8TB3B7W5726830

Phone numbers

common.phone.e164 picks a random country, and each country also has its own path. They all emit E.164 format. Where a country reserves a range for drama and testing, the pack uses it — US area 202 with the 555 exchange, Canada 613 555, UK Ofcom 07700 900xxx. Most countries reserve no such range, so those paths build a structurally valid number out of real prefixes instead: safe to store and to parse, but not a number anyone can dial. Use them when a contact fixture has to parse as a valid international number.

<gen type="template" value="usa.phone"/>
<gen type="template" value="common.phone.e164"/>
./run phones.tdc
usa.phone             +12025550883
canada.phone          +16135558575
united_kingdom.phone  +447700900864
germany.phone         +4917140038023
france.phone          +33618948981
common.phone.e164     +34663489915
PathProducesExample
argentina.phoneArgentina mobile, E.164 (+54 9 11…)+5491185268868
brazil.phoneBrazil mobile, E.164 (+55 + DDD + 9…)+5562940038023
canada.phoneCanada, E.164 (area 613, fictional 555 exchange)+16135558575
common.phone.e164E.164 phone, with a random country from the set+34663489915
france.phoneFrance mobile, E.164 (+33 6…)+33618948981
germany.phoneGermany mobile, E.164 (+49 15x/16x/17x…)+4917140038023
mexico.phoneMexico, E.164 (+52 + LADA, 10-digit national number)+527353382246
poland.phonePoland mobile, E.164 (+48 5…)+48587209191
russia.phoneRussia mobile, E.164 (+7 9…)+79962527739
spain.phoneSpain mobile, E.164 (+34 6…)+34631634932
united_kingdom.phoneUK mobile, E.164 (Ofcom drama range +44 7700 900xxx)+447700900864
usa.phoneUS, E.164 (area 202, fictional 555 exchange)+12025550883

National tax and document numbers

Every country listed here has its own family of checksummed tax, identity, and — for a few of them — bank numbers. The US set alone covers most common needs:

<gen type="template" value="usa.docs.ssn"/>
<gen type="template" value="usa.tax.ein"/>
<gen type="template" value="usa.tax.itin"/>
./run us-ids.tdc
usa.docs.ssn             003060008
usa.tax.ein              678895040
usa.tax.itin             975531718
usa.finance.aba_routing  649946910

Use these when a record has to carry a country-appropriate identifier that survives that country's validator — a Brazilian CPF, a Polish PESEL, a German VAT number — while staying provably fake. Here's the full list, by address:

PathProducesExample
argentina.docs.dniArgentine DNI (8-digit national identity number, no check digit)43073935
argentina.tax.cuilArgentine CUIL (2-digit prefix + 8-digit body + weighted mod-11 check)27740275106
argentina.tax.cuitArgentine CUIT (2-digit prefix + 8-digit body + weighted mod-11 check)24574791010
austria.tax.vatAustrian VAT / UID (ATU + 7 digits + Luhn-style check digit)ATU55031548
belgium.tax.vatBelgian VAT (BE + 8-digit base + mod-97 check)BE0507916645
bolivia.docs.ciBolivian Cedula de Identidad (7-digit number, no check digit)3991646
bolivia.tax.nitBolivian NIT (9-digit tax number, no check digit)252014061
brazil.tax.cnpjBrazilian CNPJ (8-digit root + 4-digit branch + two mod-11 check digits)25232116564552
brazil.tax.cpfBrazilian CPF (9-digit base + two mod-11 check digits)14806904651
bulgaria.tax.vatBulgarian VAT (BG + 9 or 10 digits, no checksum)BG380883064
canada.docs.sinCanadian SIN (8 digits + Luhn check)585996796
canada.tax.bnCanadian Business Number (9 digits, no checksum)307343577
canada.tax.program_accountCanadian program account (BN + program code + 4-digit reference)921050900RP9000
chile.docs.runChilean RUN (7–8 digit body + cyclic weighted mod-11 check, 10 → K)271951701
chile.tax.rutChilean RUT (7–8 digit body + cyclic weighted mod-11 check, 10 → K)90529471
colombia.docs.ccColombian Cedula de Ciudadania (8–10 digit number, no check digit)74407968
colombia.tax.nitColombian NIT (9-digit body + prime-weighted mod-11 check, right-to-left)4444807433
costa_rica.docs.cpfCosta Rican fisica ID (10 digits starting with 0, no check digit)0813694243
costa_rica.tax.cpjCosta Rican juridica ID (class digit + type + 6-digit serial, no check digit)4000813072
croatia.tax.vatCroatian VAT / OIB (HR + 10-digit base + ISO 7064 MOD 11,10 check)HR99570241890
cyprus.tax.vatCypriot VAT (CY + 8 digits + 1 uppercase letter)CY65642357G
czechia.tax.vatCzech VAT / DIC (CZ + 8, 9 or 10 digits, no checksum)CZ288311951
denmark.tax.vatDanish VAT / CVR (DK + 8 digits, no checksum)DK42005491
dominican_republic.docs.cedulaDominican Cedula (10-digit body + Luhn check digit)96179414394
dominican_republic.tax.rncDominican RNC (8-digit body + weighted mod-11 check)970897251
ecuador.docs.ciEcuadorian Cedula (province + 9-digit payload + mod-10 check)2144971195
ecuador.tax.rucEcuadorian RUC, private-company form (province + 9 + weighted mod-11 check + 001)0294486720001
el_salvador.docs.duiEl Salvador DUI (8-digit body + weighted mod-10 check digit)332432757
el_salvador.tax.nitEl Salvador NIT (8-digit body + weighted mod-10 check digit)492719607
estonia.tax.vatEstonian VAT / KMKR (EE + 9 digits, no checksum)EE949727018
europe.tax.vatEU VAT (delegates to a default member state — Germany)DE193530291
finland.tax.vatFinnish VAT / ALV (FI + 7-digit base + weighted mod-11 check)FI76372425
france.tax.sirenFrench SIREN (8 digits + Luhn check)033948829
france.tax.vatFrench VAT (FR + mod-97 key + valid Luhn SIREN)FR82250352820
germany.tax.vatGerman VAT / USt-IdNr (DE + 8 digits, iterative mod-11/10 check)DE641787309
greece.tax.vatGreek VAT / AFM (EL + 8-digit base + weighted mod-11 then mod-10 check)EL413288496
guatemala.docs.cuiGuatemala CUI (9-digit serial + department 01–22 + municipality 01–99, no check digit)2642014611803
guatemala.tax.nitGuatemala NIT (13-digit body, the same shape as the CUI, no check digit)4436278540509
honduras.docs.idHonduras national ID (department + municipality + year + 5-digit serial, no check digit)1801200568981
honduras.tax.rtnHonduras RTN (the 13-digit Honduras ID shape + 1 trailing digit, no check digit)09281955957643
hungary.tax.vatHungarian VAT / ANUM (HU + 7-digit base + weighted mod-10 check)HU27025501
ireland.tax.vatIrish VAT (IE + 7 digits + 1 uppercase letter)IE8448267L
italy.tax.vatItalian VAT / Partita IVA (IT + 10 digits + Luhn check)IT12124511358
latvia.tax.vatLatvian VAT / PVN (LV + 11 digits, no checksum)LV51009639397
lithuania.tax.vatLithuanian VAT / PVM (LT + 9 or 12 digits, no checksum)LT117600379
luxembourg.tax.vatLuxembourg VAT / TVA (LU + 8 digits, no checksum)LU96561821
malta.tax.vatMaltese VAT (MT + 8 digits, no checksum)MT07558770
mexico.tax.rfcMexico RFC (person 4-letter or org 3-letter + YYMMDD + 2 homoclave chars + mod-11 check char)TLT870426K69
mexico.tax.rfc_orgMexico RFC for an organization (3 letters + YYMMDD + 2 homoclave chars + mod-11 check char)ESV970818ZA1
mexico.tax.rfc_personMexico RFC for a person (4 letters + YYMMDD + 2 homoclave chars + mod-11 check char)QEHF820406TE1
netherlands.tax.vatDutch VAT / BTW (NL + 9 digits + B + 2-digit branch 01–99, no checksum)NL430439452B03
nicaragua.docs.cedulaNicaragua cedula (municipality + DDMMYY + 4-digit serial + control letter, no check digit)0051201752201B
nicaragua.tax.rucNicaragua RUC (person form — the same shape as the cedula, no check digit)0041010962608F
panama.docs.cedulaPanama cedula, citizen form (province 1–13 + two 1–9999 groups, no check digit)13187
panama.tax.rucPanama RUC, natural-person form — the same shape as the citizen cedula1221339
paraguay.docs.ciParaguay Cedula de Identidad (7-digit number, no check digit)3254657
paraguay.tax.rucParaguay RUC (person 7-digit or org 8-digit body + cycling-weight mod-11 check)919747108
peru.docs.dniPeru DNI (8-digit national identity number, no check digit)00124682
peru.tax.rucPeru RUC (2-digit prefix + 8-digit body + weighted mod-11 check digit)15278344671
poland.docs.peselPolish PESEL (century-encoded date + serial + sex digit + weighted mod-10 check)87212812168
poland.tax.nipPolish NIP (9 digits + weighted mod-11 check; rejects check==10)6047995975
poland.tax.vatPolish VAT (PL + NIP)PL8126284465
portugal.tax.vatPortuguese VAT / NIF (PT + 8-digit base + weighted mod-11 check)PT909207518
romania.tax.vatRomanian VAT / CIF (RO + 2 to 10 digits, no checksum)RO98311815
russia.bank.accountRussian 20-digit bank account with cross-field mod-10 control key over the BIK tail40702810299206214921
russia.bank.bikRussian BIK (9 digits: 04 + region + RKC + participant; no checksum)047225281
russia.bank.correspondent_accountRussian correspondent account (20 digits, embeds the BIK tail, cross-field mod-10 key)30101810080720184177
russia.docs.snilsRussian SNILS (9 digits + mod-101 two-digit check)21804781661
russia.geo.postalRussian postal code (6 digits, real range 101000–692999)326151
russia.tax.inn_orgRussian INN for a legal entity (10 digits, weighted mod-11 check)6840437608
russia.tax.inn_personRussian INN for a person (12 digits, two weighted mod-11 checks)860084325267
russia.tax.kppRussian KPP (9 digits: tax office + reason + serial; no checksum)976244677
russia.tax.ogrnRussian OGRN for a legal entity (13 digits, whole-number mod-11 check)1691669019293
russia.tax.ogrnipRussian OGRNIP for a sole proprietor (15 digits, whole-number mod-13 check)361197456067674
slovakia.tax.vatSlovak VAT / IC DPH (SK + 10 digits, no checksum)SK2872567116
slovenia.tax.vatSlovenian VAT / ID za DDV (SI + 7-digit base + weighted mod-11 check)SI47349972
spain.docs.dniSpanish DNI (8 digits + mod-23 control letter)73742916V
spain.docs.nieSpanish NIE (X/Y/Z + 7 digits + mod-23 control letter)X3914405N
spain.tax.cifSpanish CIF (entity-type letter + 7 digits + Luhn-style control digit)A43753219
spain.tax.vatSpanish VAT (ES + CIF)ESH50310499
sweden.tax.vatSwedish VAT / Momsnr (SE + 9-digit base + Luhn check + literal "01")SE977841031701
united_kingdom.docs.ninoUK National Insurance number (2 letters + 6 digits + suffix A–D; no checksum)QQ995347B
uruguay.docs.ciUruguay Cedula de Identidad (up to 7-digit body + weighted mod-10 check digit)01252600
uruguay.tax.rutUruguay RUT (11-digit body + weighted mod-11 check)218883180011
usa.docs.ssnUS Social Security number (area 001–899 excl. 666, group 01–99, serial 0001–9999)003060008
usa.finance.aba_routingUS ABA routing number (8 digits + mod-10 [3,7,1] check)649946910
usa.tax.einUS Employer Identification Number (valid IRS prefix + 7 digits; no checksum)678895040
usa.tax.itinUS ITIN (9 + 2 digits + valid group + 4 digits; no checksum)975531718
venezuela.docs.ciVenezuela Cedula de Identidad (V/E prefix + 7–8 digit body, no check digit)E7831675
venezuela.tax.rifVenezuela RIF (V/E/J/P/G prefix + 8-digit body + weighted mod-11 check digit)V919623361

How the check digits are built

The checksum logic isn't buried in compiled code — each pack computes its check digit declaratively with the <compute> tag, right next to the data. If a country changes its rules, you edit the pack's text file, not the engine. The bodies of these identifiers are drawn with the regex and number generators, and then <compute> appends the check digit. See Data Packs for how a pack is structured, and Writing your own pack for how to add one.

See also