Identificatori v1 / Identificatori
Validează un CNP
Nu trece prin serviciul cu cache: valoarea n-are voie să ajungă într-o cheie de cache, nici
măcar sub formă de hash. Se calculează la fiecare cerere; e oricum aritmetică pură.
POST
https://oneapi.ro/api/identificatori/v1/cnp
Corpul cererii
Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.
NumeTipDescriereValori acceptate
cnpobligatoriu
text
Maxim 20.
max 20 car.
Bărbat născut în 1980
Corpul cererii
{
"cnp": "1800101410013"
}
Femeie, an bisect
Corpul cererii
{
"cnp": "2990230412345"
}
Persoană născută după 2000
Corpul cererii
{
"cnp": "5041225410010"
}
Parametri de interogare
Ruta nu acceptă parametri de interogare.
Cum se comportă
- Corpul are un singur câmp,
cnp(șir, obligatoriu, cel mult 20 de caractere). Câmpurile din corp nu apar în tabelul de parametri, de aceea sunt descrise aici. - De ce POST. Într-un GET, CNP-ul ar ajunge în logurile de acces ale serverului, în istoricul browserului și în antetul
Refereral paginii următoare — trei locuri din care nu-l mai poți scoate. Ruta echivalentă pe GET răspunde 405 și trimite aici. - Zero retenție. CNP-ul nu se scrie nicăieri: nici în bază, nici în loguri, nici într-o cheie de cache. Răspunsul nici nu repetă valoarea primită —
valoaree mereu(ascuns), fiindcă apelantul o are deja, iar noi n-avem motiv s-o punem într-un corp care poate ajunge în logurile lui. Nici mesajele de eroare nu o repetă. - Componentele sunt DERIVATE din codul trimis, nu căutate undeva: data nașterii, sexul și județul sunt literalmente scrise în CNP. Nu confirmă că persoana există.
- Nu există endpoint de generare de CNP-uri valide, nici „pentru testare". Un generator ar fi util mai ales cuiva care vrea să treacă de o validare, nu cuiva care vrea să valideze.
- Codurile de județ din CNP nu sunt nici SIRUTA, nici indicativele auto: e ordinea alfabetică a județelor de la 1978. Călărași și Giurgiu, înființate în 1981, au primit 51 și 52. Codul 47 e Sectorul Agricol Ilfov, care a existat între 1981 și 1997 și apare în CNP-urile emise atunci.
- La prima cifră 7 sau 8 (rezidenți străini) și 9 (fără cetățenie română), secolul nu e determinat de cod, deci data nașterii nu se poate deduce — lipsește din componente, ceea ce e corect, nu o scăpare.
La ce folosește
- Prinzi o greșeală de tastare la completarea unui formular, înainte de a trimite datele mai departe.
- Verifici coerența unui dosar: data nașterii declarată trebuie să se potrivească cu cea din CNP.
- Afli vârsta unei persoane din codul pe care îl ai deja, fără să întrebi o bază de date.
Structura răspunsului
Toate câmpurile de mai jos sunt în data.
CâmpTipDescriere
tip
string
Tipul folosit la validare.
valoare
string
Mereu
(ascuns). CNP-ul primit nu se repetă în răspuns.
valid
boolean
Dacă trece cifra de control și toate verificările de coerență.
componente.data_nasterii
string
Derivată din cod. Lipsește la rezidenți străini, unde secolul nu e determinat.
componente.varsta
integer
Vârsta în ani împliniți, la data cererii.
componente.sex
string
masculin sau feminin, din prima cifră.
componente.judet_nastere
string
Județul sau sectorul de înregistrare.
componente.cod_judet
string
Codul din CNP, ca text de două cifre.
componente.rezident_strain
boolean
Prima cifră 7 sau 8.
componente.fara_cetatenie_romana
boolean
Prima cifră 9.
observatie
string
Precizare despre cum se citeşte răspunsul: o convenţie de calcul sau o limită a datelor.
motive
array
Ce anume nu e în regulă: cifră de control, dată inexistentă, cod de județ nealocat.
Exemple de răspuns
corp: {"cnp": "1800101410013"}
POSThttps://oneapi.ro/api/identificatori/v1/cnp
{
"data": {
"tip": "cnp",
"valoare": "(ascuns)",
"valid": true,
"componente": {
"data_nasterii": "1980-01-01",
"varsta": 46,
"sex": "masculin",
"judet_nastere": "București — Sectorul 1",
"cod_judet": "41",
"rezident_strain": false,
"fara_cetatenie_romana": false
},
"observatie": "Componentele sunt DERIVATE din CNP-ul trimis — nu vin dintr-o bază de date și nu confirmă că persoana există. CNP-ul nu se stochează și nu se loghează nicăieri."
}
}
corp: {"cnp": "2990230412345"}
POSThttps://oneapi.ro/api/identificatori/v1/cnp
{
"data": {
"tip": "cnp",
"valoare": "(ascuns)",
"valid": false,
"motive": [
"data nașterii 1999-02-30 nu există",
"cifra de control nu se potrivește"
]
}
}
corp: {"cnp": "5041225410010"}
POSThttps://oneapi.ro/api/identificatori/v1/cnp
{
"data": {
"tip": "cnp",
"valoare": "(ascuns)",
"valid": false,
"motive": [
"cifra de control nu se potrivește"
]
}
}
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 | Câmpul cnp lipsește sau e prea lung. Mesajul NU repetă valoarea primită. |
| 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": "Câmpul cnp lipsește sau e prea lung. Mesajul NU repetă valoarea primită."
}
}