oneapi
Autentificare
Financiar v1 / Validare

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ă.

POST
https://oneapi.ro/api/financiar/v1/validare/cnp

Corpul cererii

Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.

NumeTipDescriereValori acceptate
cnpobligatoriu string Obligatoriu, în corpul cererii. Exact 13 cifre. max 13 car.
CNP valid Corpul cererii
{
    "cnp": "1800101410013"
}
CNP de femeie, născută în Cluj Corpul cererii
{
    "cnp": "2850722120015"
}
Rezident străin Corpul cererii
{
    "cnp": "7900315400025"
}
Cifră de control greşită Corpul cererii
{
    "cnp": "1800101410014"
}

Parametri de interogare

Ruta nu acceptă 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 mereu false. 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 pe GET, 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 şi varsta sunt null, iar an_incert e true. 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 70 la orice înregistrare, indiferent de locul naşterii. CNP-ul e perfect valid, dar judeţul nu mai e codificat — judet.denumire e null şi judet.motiv e nu_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

CâmpTipDescriere
data.valid boolean Rezultatul verificării: cifra de control, data şi codul de judeţ.
data.sex string M, F, sau null la prima cifră 9.
data.data_nasterii string null la rezidenţii străini, unde secolul nu e codificat.
data.varsta integer Ani împliniţi, socotiţi pe ziua românească. null când data naşterii nu se poate stabili.
data.judet object Codul şi denumirea. La codul 70, denumire e null şi motiv explică de ce.
data.judet.cod integer Codul din nomenclatorul sursei — cheia pe care se filtrează.
data.judet.denumire string Denumirea, aşa cum o publică sursa.
data.judet.motiv null
data.an_incert boolean true când secolul naşterii nu e codificat.
data.rezident_strain boolean true la prima cifră 7, 8 sau 9.
data.confirma_existenta_persoanei boolean Mereu false. Prezent tocmai ca să nu fie presupus altfel.
meta.temei string Temeiul legal al valorilor sau al modului de calcul.
meta.retentie string Confirmarea că intrarea nu s-a scris nicăieri.
meta.nota string Precizare despre cum se citesc datele din răspuns — o capcană, o convenţie sau o limită a sursei.

Exemple de răspuns

body: {"cnp": "1800101410013"}

POSThttps://oneapi.ro/api/financiar/v1/validare/cnp
{
    "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ă."
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422validareLipseşte cnp sau nu are exact 13 caractere. Un CNP prezent dar greşit întoarce 200 cu valid: false.
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": "Lipseşte cnp sau nu are exact 13 caractere. Un CNP prezent dar greşit întoarce 200 cu valid: false."
    }
}