The Albanian Personal Number (Albanian: Numri Personal, abbreviated NUP) is the national civil identifier issued to Albanian citizens and foreign nationals with permanent residence in Albania. A single 10-character code serves simultaneously as the national identity document number, the social security number, the electoral roll number and the individual tax number (NIPT) — making it the single most important identifier for any individual dealing with Albanian government services, banking or employment.
The format was standardised by Council of Ministers Decision No. 827 of 11 December 2003 and is administered by the Central Civic Registry Service within Albania’s Ministry of Interior. This tool validates the full documented structure: decade code, birth date, gender and citizen-type encoding, sequence range and check character format.
How it works
The NUP is exactly 10 characters long in the form [D][Y][MM][DD][SSS][C]:
| Field | Positions | Content |
|---|---|---|
| Decade char | 1 | Digit (0-9) for 1800s; letter A-M for 1900-2029 |
| Year unit | 2 | Units digit of the birth year |
| Month code | 3-4 | Birth month + gender/citizen offset (see below) |
| Day | 5-6 | Birth day (01-31) |
| Sequence | 7-9 | Unique serial for same-date births (001-999) |
| Check char | 10 | Capital letter A-W (algorithm not public) |
Decade encoding: The decade character maps to a 10-year block. Digit 0 covers 1800-1809, digit 9 covers 1890-1899. Letter A begins the 1900 block, running up to J (1990-1999), then K (2000-2009), L (2010-2019), M (2020-2029). The second character is the units digit of the year within that decade, so K3 means born in 2003.
Month and gender encoding: The month field carries both the calendar month and two metadata bits. The base value is the birth month (1-12). An offset is added:
- +0 for male Albanian citizens (result 01-12)
- +30 for male non-citizens (result 31-42)
- +50 for female Albanian citizens (result 51-62)
- +80 for female non-citizens (result 81-92)
Decoding is simply: subtract the applicable offset to recover the real month and determine gender and citizenship.
Check character: Position 10 is a capital letter constrained to the 23-letter range A-W. It is computed from the other nine characters via a weighted-sum algorithm defined in the 2003 regulation. That regulation has not been published; both python-stdnum and stdnum-js explicitly mark the algorithm as unknown and perform only range checking — this tool does the same.
Example
Suppose the fictional NUP is J10315042F:
- Decade char
J→ decade 1990-1999 - Year unit
1→ birth year 1991 - Month code
03→ March, male, Albanian citizen (offset 0, month 3) - Day
15→ 15th - Birth date: 15 March 1991
- Sequence: 042 (42nd registration on that date)
- Check char:
F— within A-W range
| Field | Raw | Decoded |
|---|---|---|
| Decade | J | 1990-1999 |
| Year | 1 | 1991 |
| Month code | 03 | March, male citizen |
| Day | 15 | 15 |
| Sequence | 042 | valid (001-999) |
| Check char | F | A-W range pass |
A woman born on the same date would have month code 53 (03 + 50) and a different sequence number. A male non-citizen born then would have 33 (03 + 30).
Formula note
The weighted-sum for the check character is specified in Council of Ministers Decision No. 827, 11 December 2003, published in the Albanian Official Gazette. That document has not been digitised or made available in open sources. Every publicly available validation library — including python-stdnum (Arthur de Jong) and stdnum-js (koblas) — notes the algorithm as unknown and falls back to range-only checking. This validator faithfully matches that behaviour: it confirms C ∈ {A…W} but does not recompute the weighted sum.