@stll/stdnum
Validate, compact, format, generate, and parse standard identifiers through a
single Rust implementation. The npm package uses a native N-API binding on
Node.js and Bun; @stll/stdnum-wasm serves browsers and edge runtimes, and the
same registry is available from Python as stella-stdnum.
This package covers 11 global identifiers and 96 countries through 176 per-module entry points.
Install
npm install @stll/stdnum
# or
bun add @stll/stdnum
For browser or edge runtimes, install both packages:
npm install @stll/stdnum @stll/stdnum-wasm
For Python 3.11 or newer:
pip install stella-stdnum
Usage
import { cz } from "@stll/stdnum";
cz.ico.validate("25596641");
// { valid: true, compact: "25596641" }
cz.ico.validate("12345678");
// { valid: false, error: { code: "INVALID_CHECKSUM", ... } }
cz.rc.format("7103192745");
// "710319/2745"
cz.ico.validateMany(["25596641", "12345678"]);
// [{ valid: true, compact: "25596641" }, { valid: false, error: ... }]
Tree-shaking
Import only what you need:
import ico from "@stll/stdnum/cz/ico";
import iban from "@stll/stdnum/iban";
ico.validate("25596641");
iban.validate("CZ65 0800 0000 1920 0014 5399");
Browser and edge runtimes
Initialize the WebAssembly runtime once before calling the synchronous validator subpaths:
import { initialize } from "@stll/stdnum/browser";
import ico from "@stll/stdnum/cz/ico";
await initialize();
ico.validate("25596641");
Concurrent calls to initialize() share the same promise. Calling a validator
before initialization throws StdnumNotInitializedError from
@stll/stdnum/browser.
The WASM package also exposes the registry API asynchronously:
import { validate } from "@stll/stdnum-wasm";
await validate("cz.ico", "25596641");
Python
import stella_stdnum
result = stella_stdnum.validate("cz.ico", "25596641")
assert result.valid
assert result.compact == "25596641"
results = stella_stdnum.validate_many("cz.ico", ["25596641", "12345678"])
assert [result.valid for result in results] == [True, False]
The Rust registry owns validator behavior and metadata. TypeScript subpaths,
catalog files, and exact TypeScript/Python registry types are generated from
that registry. One committed fixture set checks the Rust, Node.js, WASM, and
Python surfaces, and ty checks the installed Python wheel as a real consumer.
Oracle Validation
The repo ships two oracle modes:
bun run oracleRuns the strict gate. It keeps only high-confidence cross-checks that are stable enough for CI.bun run oracle:surveyRuns the broader ecosystem survey. It includes noisier third-party validators and mutation probes to surface drift without treating every disagreement as a release blocker.
Both commands accept ORACLE_SAMPLES=<n> to trade off
runtime against coverage.
bun run performance:oracles is an optional local diagnostic for the handful
of specialized JavaScript oracles it covers. It is deliberately not a CI gate:
those country-specific comparisons are not representative of the library as a
whole. The benchmark alternates execution order and compares paired medians to
reduce host noise.
Dependabot watches every JavaScript, Python, Ruby, PHP, and Rust oracle manifest. Its weekly update PRs rerun the strict correctness gates against the new upstream versions before they can merge.
Supported Identifiers
International
| Identifier | Module | Type |
|---|---|---|
| Business Identifier Code | bic |
company |
| Credit Card Number | creditcard |
any |
| Bitcoin Base58Check Address | crypto/btcbase58 |
any |
| Bitcoin Bech32 Address | crypto/btcbech32 |
any |
| Ethereum Address | crypto/eth |
any |
| Cryptocurrency Wallet Address | crypto/wallet |
any |
| EU VAT Number | eu/vat |
company |
| IBAN | iban |
any |
| International Securities Identification Number | isin |
any |
| Legal Entity Identifier | lei |
company |
| Luhn | luhn |
any |
Countries
96 countries supported (click to expand)
| Country | Module | Identifier |
|---|---|---|
| AD | ad/nrt |
NRT |
| AE | ae/eid |
EID |
| AI | ai/tin |
TIN |
| AL | al/nipt |
NIPT |
| AM | am/tin |
TIN |
| AR | ar/cbu |
CBU |
ar/cuit |
CUIT | |
ar/dni |
DNI | |
| AT | at/businessid |
FN |
at/tin |
TIN | |
at/uid |
UID | |
at/vnr |
VNR | |
| AU | au/abn |
ABN |
au/acn |
ACN | |
au/tfn |
TFN | |
| AZ | az/voen |
VÖEN |
| BA | ba/jmbg |
JMBG |
| BD | bd/nid |
NID |
| BE | be/bis |
BIS |
be/nn |
NN | |
be/vat |
BTW | |
| BG | bg/egn |
ЕГН |
bg/pnf |
ЛНЧ | |
bg/vat |
ИН по ДДС | |
| BH | bh/cpr |
CPR |
| BR | br/cnpj |
CNPJ |
br/cpf |
CPF | |
| BY | by/unp |
УНП |
| BZ | bz/tin |
TIN |
| CA | ca/bn |
BN |
ca/sin |
SIN | |
| CH | ch/ssn |
AHV |
ch/uid |
UID | |
ch/vat |
MWST | |
| CL | cl/rut |
RUT |
| CN | cn/ric |
RIC |
cn/uscc |
USCC | |
| CO | co/nit |
NIT |
| CR | cr/cpf |
CPF |
| CU | cu/ni |
NI |
| CY | cy/vat |
ΦΠΑ |
| CZ | cz/bankaccount |
Číslo účtu |
cz/dic |
DIČ | |
cz/ico |
IČO | |
cz/rc |
RČ | |
| DE | de/handelsreg |
HReg |
de/idnr |
IdNr | |
de/stnr |
StNr | |
de/svnr |
SVNR | |
de/vat |
USt-IdNr. | |
| DK | dk/cpr |
CPR |
dk/cvr |
CVR | |
dk/vat |
CVR | |
| DO | do/rnc |
RNC |
| EC | ec/ruc |
RUC |
| EE | ee/ik |
IK |
ee/registrikood |
Registrikood | |
ee/vat |
KMKR | |
| EG | eg/tn |
TN |
| ES | es/cif |
CIF |
es/dni |
DNI | |
es/nie |
NIE | |
es/nss |
NSS | |
es/vat |
NIF | |
| FI | fi/hetu |
HETU |
fi/vat |
ALV nro | |
fi/ytunnus |
Y-tunnus | |
| FR | fr/nif |
NIF |
fr/nir |
NIR | |
fr/siren |
SIREN | |
fr/siret |
SIRET | |
fr/tva |
TVA | |
| GB | gb/nhs |
NHS |
gb/nino |
NINO | |
gb/sedol |
SEDOL | |
gb/utr |
UTR | |
gb/vat |
VAT | |
| GE | ge/pin |
PIN |
| GH | gh/tin |
TIN |
| GR | gr/amka |
ΑΜΚΑ |
gr/vat |
ΑΦΜ | |
| GT | gt/nit |
NIT |
| HK | hk/hkid |
HKID |
| HR | hr/vat |
OIB |
| HU | hu/vat |
ANUM |
| ID | id/npwp |
NPWP |
| IE | ie/pps |
PPS |
ie/vat |
VAT | |
| IL | il/idnr |
ת.ז. |
| IN | in/aadhaar |
Aadhaar |
in/gstin |
GSTIN | |
in/pan |
PAN | |
| IQ | iq/nid |
NID |
| IR | ir/nid |
NID |
| IS | is/kennitala |
kt. |
is/vsk |
VSK | |
| IT | it/codicefiscale |
CF |
it/iva |
P.IVA | |
| JP | jp/cn |
CN |
jp/mynumber |
My Number | |
| KR | kr/brn |
BRN |
kr/rrn |
RRN | |
| KW | kw/civil |
Civil ID |
| KZ | kz/iin |
IIN |
| LI | li/peid |
PEID |
| LK | lk/nic |
NIC |
| LT | lt/asmens |
AK |
lt/vat |
PVM kodas | |
| LU | lu/vat |
TVA |
| LV | lv/vat |
PVN |
| MA | ma/ice |
ICE |
| MC | mc/tva |
TVA |
| MD | md/idno |
IDNO |
| ME | me/pib |
PIB |
| MK | mk/edb |
EDB |
| MT | mt/vat |
VAT |
| MU | mu/brn |
BRN |
| MX | mx/clabe |
CLABE |
mx/curp |
CURP | |
mx/rfc |
RFC | |
| MY | my/nric |
NRIC |
| NG | ng/nin |
NIN |
| NI | ni/ruc |
RUC |
| NL | nl/bsn |
BSN |
nl/kvk |
KvK | |
nl/vat |
BTW | |
| NO | no/fodselsnummer |
Fødselsnr |
no/mva |
MVA | |
no/orgnr |
Orgnr | |
| NZ | nz/ird |
IRD |
| PA | pa/ruc |
RUC |
| PE | pe/ruc |
RUC |
| PH | ph/philid |
PhilID |
| PK | pk/cnic |
CNIC |
| PL | pl/nip |
NIP |
pl/pesel |
PESEL | |
pl/regon |
REGON | |
| PT | pt/cc |
CC |
pt/vat |
NIF | |
| RO | ro/cnp |
CNP |
ro/vat |
CIF | |
| RS | rs/pib |
PIB |
| RU | ru/inn |
ИНН |
| SE | se/orgnr |
Orgnr |
se/personnummer |
PN | |
se/vat |
Momsnr. | |
| SG | sg/uen |
UEN |
| SI | si/emso |
EMŠO |
si/vat |
DDV | |
| SK | sk/dic |
IČ DPH |
sk/ico |
IČO | |
sk/rc |
RČ | |
| TH | th/tin |
TIN |
| TR | tr/tckimlik |
T.C. Kimlik |
tr/vkn |
VKN | |
| TW | tw/ubn |
UBN |
| UA | ua/edrpou |
ЄДРПОУ |
| US | us/ein |
EIN |
us/itin |
ITIN | |
us/rtn |
RTN | |
us/ssn |
SSN | |
| UY | uy/rut |
RUT |
| VE | ve/rif |
RIF |
| VN | vn/mst |
MST |
| ZA | za/idnr |
SA ID |
API
Every identifier exports the same interface:
type Validator = {
name: string;
localName: string;
abbreviation: string;
country?: CountryCode;
entityType: "person" | "company" | "any";
compact: (value: string) => string;
format: (value: string) => string;
validate: (value: string) => ValidateResult;
// Optional metadata
description?: string;
sourceUrl?: string;
lengths?: readonly number[];
examples?: readonly string[];
aliases?: readonly string[];
candidatePattern?: string;
// Available on most validators
generate?: () => string;
};
type ValidateResult =
| { valid: true; compact: string }
| {
valid: false;
error: {
code:
| "INVALID_FORMAT"
| "INVALID_LENGTH"
| "INVALID_CHECKSUM"
| "INVALID_COMPONENT";
message: string;
};
};
Additional exports
Many person-type validators export parse(), returning
structured data extracted from the identifier:
import { cz } from "@stll/stdnum";
cz.rc.parse("7103192745");
// { birthDate: Date, gender: "male" }
Validators with parse(): BA JMBG, BG ЕГН, CN RIC,
CU NI, CZ RČ, DK CPR, EE IK, FI HETU, FR NIR,
IT CF, KR RRN, KW Civil ID, KZ IIN, LK NIC,
MX CURP, MY NRIC, NO Fødselsnr, PL PESEL, RO CNP,
SE PN, SI EMŠO, SK RČ, ZA SA ID.
detectNetwork() and the CardNetwork type are
top-level named exports:
import { detectNetwork } from "@stll/stdnum";
import type { CardNetwork } from "@stll/stdnum";
detectNetwork("4111111111111111");
// "visa"
Unicode handling
All validators normalize Unicode artifacts before validation: fullwidth digits, various dashes, non-breaking spaces, zero-width characters, and other common OCR/PDF copy-paste issues are handled automatically.
Development
bun install
bun run rust:check
bun run codegen:check
bun run typecheck
bun test
bun run lint # oxlint
bun run format # oxfmt
License
Metadata
Release files for stella-stdnum 2.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| stella_stdnum-2.3.2-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| stella_stdnum-2.3.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| stella_stdnum-2.3.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| stella_stdnum-2.3.2-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
| stella_stdnum-2.3.2-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 2.2 MB
Release files / stella_stdnum-2.3.2-cp311-abi3-win_amd64.whl
| Download URL | stella_stdnum-2.3.2-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 386.8 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
4901df7d38a924f3fdb1e541ed1e94e38b6cba3b5636dd6707318e042cf603f0
|
|
BLAKE2b-256 checksum How to use checksums |
86678ac1e50e82e8e20b884462a7138da830382e7a40e18c98203349f828a4ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / stella_stdnum-2.3.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | stella_stdnum-2.3.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 473.8 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
54da8f8609cf480dbf9ab0b995482eab17c5dcf0d35df8384d8c1b750da3b100
|
|
BLAKE2b-256 checksum How to use checksums |
1468db7cb737ce2e9eaa708480c94284a86cba56188972a065ba3de58b937b04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / stella_stdnum-2.3.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | stella_stdnum-2.3.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 472.8 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
bb23a79d1731e3fb5df1a913667772913225dddd08f6914e61fc509cfccbd83a
|
|
BLAKE2b-256 checksum How to use checksums |
8fcbb53dd9d89576c36c09469287fb4084faa3649fc88c07eed73422a3c00683
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / stella_stdnum-2.3.2-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | stella_stdnum-2.3.2-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 431.4 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f5531383fd7b19635b421121d398cd824eb4ecb6b9a42d3d34c585ec52f0988f
|
|
BLAKE2b-256 checksum How to use checksums |
74d2ac4f96c4366067fd1058dee3fcdb307b978d72e35fe2239c42c89aada1e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / stella_stdnum-2.3.2-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | stella_stdnum-2.3.2-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 445.0 kB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
a90bd9b4a24b6a0374a06c749939d8eefaf3763fe85eef8c5e581a82b1575d87
|
|
BLAKE2b-256 checksum How to use checksums |
ed73f8f316547aeaf7da840f04cb4cbdc9e92603961cbf228d6e707d20ed5e89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logSecurity for stella-stdnum 2.3.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 5 files in this release have been uploaded with provenance metadata.
Attestation for stella_stdnum-2.3.2-cp311-abi3-win_amd64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.