PESEL
Universal Electronic System for Registration of the Population. 11-digit Polish national ID.
Use this page for field meaning, local checksum math, examples, and integration notes. Official identity, registry, account, or tax status still belongs to the owning system.
Entity Summary
- Jurisdiction
- Poland (PL)
- Category
- Polish Personal Identifier
- Format
- 11 numeric digits
- Local signal
- Birth date, gender digit, checksum
What is PESEL?
PESEL (Polish Personal Number)
The PESEL (Polish: Powszechny Elektroniczny System Ewidencji Ludności, Universal Electronic System for Registration of the Population) is the mandatory personal identification number used in Poland.
Introduced in 1979 under the communist government to track citizens, it has evolved into the central backbone of Polish digital administration, tax processing, banking operations, and healthcare services.
Scope and Issuing Authority
Every Polish citizen and permanent resident, as well as temporary residents staying in Poland for more than 30 days, is legally required to hold a PESEL number. The registry is governed and managed by the Ministry of Digital Affairs (Ministerstwo Cyfryzacji) of the Republic of Poland.
The number is assigned upon registration of birth for citizens, or upon application at the local municipal office (Urząd Gminy) for foreign residents.
Visual Structure Breakdown
The PESEL is always exactly 11 numeric digits long and is structured into five distinct fields:
[ Y Y ] [ M M ] [ D D ] [ S S S G ] [ C ]
| Fields | Positions | Meaning |
|---|---|---|
| YY | 1–2 | Year of birth (last two digits). |
| MM | 3–4 | Month of birth (modified by century offsets). |
| DD | 5–6 | Day of birth. |
| SSSG | 7–10 | Serial number and Gender indicator. The last digit of this serial (digit 10) encodes gender (even = female, odd = male). |
| C | 11 | Checksum control digit. |
Modulo Checksum Details
The 11th digit is a checksum calculated using a weighted modulo 10 method defined by standard national registration standards.
Weights
Each of the first 10 digits is multiplied by a corresponding weight multiplier in a repeating pattern:
| Digit Position | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| Weight | 1 | 3 | 7 | 9 | 1 | 3 | 7 | 9 | 1 | 3 |
Calculation Formula
The sum is calculated as:
\[S = \sum_{i=1}^{10} (d_i \times w_i)\]
The control checksum digit \(C\) is then computed as:
\[C = (10 - (S \pmod{10})) \pmod{10}\]
This ensures that if the modulo division yields a remainder of 0, the final checksum matches 0.
Validation Examples
| Sample Input | Description | Status |
|---|---|---|
| 92082612343 | Valid Male (1992) — Standard valid PESEL representing a male born on August 26, 1992. | ✓ Valid |
| 92082612336 | Valid Female (1992) — Standard valid PESEL representing a female born on August 26, 1992. | ✓ Valid |
| 92082612340 | Invalid Checksum — Fails the weighted modulo 10 checksum verification (calculated checksum is 3, input ends with 0). | ✗ Invalid |
| 92023012343 | Invalid Calendar Date — Parsed date decodes to February 30th, which is an invalid calendar day. | ✗ Invalid |
| 92132612343 | Invalid Month — Months field (13) exceeds normal calendar month limit and does not map to any valid century offset. | ✗ Invalid |
Implementation Guidance
When integrating PESEL validation in backend systems, developers should follow these rules:
Input Filtering and Regex
Before running checksum verification, validate the basic format constraints:
- Must consist of exactly 11 digits.
- Use basic regex to assert numerical integrity:
/^\d{11}$/.
Calendar Decoding
Do not decode the birth date assuming a 1900 century baseline. You must parse the month value MM to determine the century offset:
- Months 01-12: 1900-1999 (Offset +0)
- Months 21-32: 2000-2099 (Offset +20)
- Months 41-52: 2100-2199 (Offset +40)
- Months 61-72: 2200-2299 (Offset +60)
- Months 81-92: 1800-1899 (Offset +80)
Verify that the decoded year, month, and day form a valid calendar date (accounting for leap years in 2000 vs 1900).
function validatePESEL(pesel) {
if (!/^\d{11}$/.test(pesel)) return false;
const weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
let sum = 0;
for (let i = 0; i < 10; i++) {
sum += parseInt(pesel[i]) * weights[i];
}
const checksum = (10 - (sum % 10)) % 10;
return checksum === parseInt(pesel[10]);
}
Frequently Asked Questions
Can foreign nationals receive a PESEL?
Yes. Foreigners registering their residence for a stay over 30 days are automatically assigned a PESEL. Those who cannot register their residence can submit an application citing a legal basis (e.g. tax reporting, work contract requirements).
Why is the month field offset by 20, 40, 60, or 80?
This offset was designed to resolve century ambiguities. Because the year field YY only supports two digits, adding offsets to the month MM allows the system to distinguish between 1800, 1900, 2000, 2100, and 2200 birth years without changing the 11-digit length.
Can a PESEL number be changed?
A PESEL is generally permanent. It can only be changed under rare legal circumstances, such as:
1. An official correction of the holder's birth date.
2. A legal gender transition (since the 10th digit designates gender).
3. Adoption of a child.
Official Registry Sources
1. Ministry of Digital Affairs (Poland): Central administration office governing public registries and PESEL records database. Official portal.
2. Act of 24 September 2010 on Population Registration: The statutory legal base of Poland defining personal identification code schemas and citizen registration requirements.
3. PESEL Registry Specifications (Gov.pl): Documentation for governmental APIs and developer integration paths.