Validare CNP
Verifică cifra de control a unui cod numeric personal şi citeşte informaţia codificată în el: sex,
data naşterii, vârsta şi judeţul.
O cifră de control corectă NU înseamnă că persoana există — răspunsul spune asta explicit, în
confirma_existenta_persoanei. Un CNP valid se poate genera în două minute; ruta verifică forma,
nu identitatea.
Zero retenţie: CNP-ul nu se scrie nicăieri — nici în loguri, nici în statistici, nici în cache.
Ruta e POST şi necachabilă, deci nici răspunsul nu se stochează.
Corpul cererii
Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.
{
"cnp": "1800101410013"
}
{
"cnp": "2850722120015"
}
{
"cnp": "7900315400025"
}
{
"cnp": "1800101410014"
}
Parametri de interogare
Cum se comportă
- Verifică cifra de control a unui cod numeric personal şi citeşte informaţia codificată în el: sex, data naşterii, vârsta şi judeţul.
- O cifră de control corectă NU înseamnă că persoana există. Răspunsul spune asta explicit, în
confirma_existenta_persoanei, care e mereufalse. Un CNP valid se generează în două minute; ruta verifică forma, nu identitatea. Folosită ca verificare de identitate, dă o falsă siguranţă. - Zero retenţie. CNP-ul nu se scrie nicăieri: nici în loguri, nici în statistici, nici în chei de cache. Nu e doar o politică — ruta e
POSTşi necachabilă, iar componenta care ar putea stoca un răspuns funcţionează numai peGET, deci datele nu au pe unde să ajungă la stocare. - Un CNP invalid NU e o eroare a cererii: răspunsul e 200 cu
valid: false. - Rezidenţii străini (prima cifră 7, 8 sau 9): secolul nu e codificat, deci data naşterii nu se poate stabili şi nu e ghicită —
data_nasteriişivarstasuntnull, iaran_incertetrue. La cifra 9 nici sexul nu e codificat. O dată de naştere inventată cu 50% şanse ar fi mai rea decât absenţa ei. Ziua şi luna se verifică totuşi în ambele secole plauzibile (1900 şi 2000): CNP-ul e acceptat dacă data există în cel puţin unul — 29 februarie din anul „00” există doar în 2000. - Codul de judeţ 70 nu e un judeţ. Din mai 2024, prin Sistemul Informatic Integrat pentru Emiterea Actelor de Stare Civilă, componenta de judeţ se completează cu
70la orice înregistrare, indiferent de locul naşterii. CNP-ul e perfect valid, dar judeţul nu mai e codificat —judet.denumireenullşijudet.motivenu_e_codificat. CNP-urile emise înainte nu se schimbă. - Codurile de judeţ formează o numerotare proprie, care nu se confundă cu SIRUTA sau cu codul auto: 01 Alba … 39 Vrancea în ordinea alfabetică a împărţirii din 1968, 40 Bucureşti, 41–46 sectoarele, 47–48 fostele sectoare 7 şi 8 (desfiinţate în 1979, dar prezente în CNP-urile emise până atunci), iar Călăraşi şi Giurgiu — create în 1981 — la capăt, 51 şi 52.
- Nu se întoarce numărul de ordine din CNP (secvenţa zilei): n-are utilizare pentru un client şi ar fi încă un detaliu personal care circulă degeaba.
La ce folosește
- Verificarea unui CNP într-un formular, înainte de a-l salva.
- Completarea automată a sexului şi a datei naşterii.
- Prinderea greşelilor de tastare prin nepotrivirea dintre CNP şi data introdusă manual.
Structura răspunsului
M, F, sau null la prima cifră 9.
null la rezidenţii străini, unde secolul nu e codificat.
null când data naşterii nu se poate stabili.
denumire e null şi motiv explică de ce.
true când secolul naşterii nu e codificat.
true la prima cifră 7, 8 sau 9.
false. Prezent tocmai ca să nu fie presupus altfel.
Exemple de răspuns
body: {"cnp": "1800101410013"}
{
"data": {
"valid": true,
"sex": "M",
"data_nasterii": "1980-01-01",
"varsta": 46,
"judet": {
"cod": 41,
"denumire": "Bucureşti — Sectorul 1",
"motiv": null
},
"an_incert": false,
"rezident_strain": false,
"confirma_existenta_persoanei": false
},
"meta": {
"temei": "structura CNP + cifra de control (cheia 279146358279).",
"retentie": "zero — CNP-ul şi datele derivate nu se stochează şi nu se cache-uiesc.",
"nota": "CNP valid ca structură. Verificarea nu atestă că persoana există."
}
}
body: {"cnp": "2850722120015"}
{
"data": {
"valid": true,
"sex": "F",
"data_nasterii": "1985-07-22",
"varsta": 41,
"judet": {
"cod": 12,
"denumire": "Cluj",
"motiv": null
},
"an_incert": false,
"rezident_strain": false,
"confirma_existenta_persoanei": false
},
"meta": {
"temei": "structura CNP + cifra de control (cheia 279146358279).",
"retentie": "zero — CNP-ul şi datele derivate nu se stochează şi nu se cache-uiesc.",
"nota": "CNP valid ca structură. Verificarea nu atestă că persoana există."
}
}
body: {"cnp": "7900315400025"}
{
"data": {
"valid": true,
"sex": "M",
"data_nasterii": null,
"varsta": null,
"judet": {
"cod": 40,
"denumire": "Bucureşti",
"motiv": null
},
"an_incert": true,
"rezident_strain": true,
"confirma_existenta_persoanei": false
},
"meta": {
"temei": "structura CNP + cifra de control (cheia 279146358279).",
"retentie": "zero — CNP-ul şi datele derivate nu se stochează şi nu se cache-uiesc.",
"nota": "CNP valid de rezident străin: prima cifră (7, 8 sau 9) nu codifică secolul, deci data naşterii NU se poate stabili şi nu e ghicită. Ziua şi luna au fost verificate în ambele secole plauzibile (1900 şi 2000) — CNP-ul e acceptat dacă data există în cel puţin unul, de pildă 29 februarie din anul „00”, care există doar în 2000. La cifra 9 nici sexul nu e codificat."
}
}
body: {"cnp": "1800101410014"}
{
"data": {
"valid": false,
"sex": null,
"data_nasterii": null,
"varsta": null,
"judet": null,
"an_incert": null,
"rezident_strain": null,
"confirma_existenta_persoanei": false
},
"meta": {
"temei": "structura CNP + cifra de control (cheia 279146358279).",
"retentie": "zero — CNP-ul şi datele derivate nu se stochează şi nu se cache-uiesc.",
"nota": "CNP invalid: fie cifra de control nu se verifică, fie data ori codul de judeţ nu există. Nu e o eroare a cererii — e rezultatul verificării."
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă, invalid, expirat sau revocat. |
| 403 | feature_indisponibil | Planul curent nu include funcţia de care ţine ruta. |
| 422 | validare | Lipseşte cnp sau nu are exact 13 caractere. Un CNP prezent dar greşit întoarce 200 cu valid: false. |
| 429 | cota_depasita | Cota lunară a planului a fost depăşită (vezi Retry-After). |
Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.
{
"eroare": {
"cod": "validare",
"mesaj": "Lipseşte cnp sau nu are exact 13 caractere. Un CNP prezent dar greşit întoarce 200 cu valid: false."
}
}