oneapi
Autentificare
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 Referer al 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ă — valoare e 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."
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422validareCâmpul cnp lipsește sau e prea lung. Mesajul NU repetă valoarea primită.
429cota_depasitaCota 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ă."
    }
}