Un endpoint pentru fișa firmei, unul pentru căutare, câteva validări și cursul BNR. Cheia în antet, JSON înapoi. Dacă știi curl, știi deja tot.
Bază: https://api-cui.ro/v1. Toate răspunsurile sunt JSON, UTF-8, cu diacritice reale (nu ș). Datele sunt ISO 8601 (2026-09-21).
curl https://api-cui.ro/v1/firma/14399840 -H "X-Api-Key: ck_..."
Cheia o iei din cont, în 30 de secunde. Planul gratuit are 100 de cereri pe lună.
Cheia se trimite în antetul X-Api-Key (sau Authorization: Bearer <cheie>). Sunt două feluri de chei:
| tip | prefix | unde | protecție |
|---|---|---|---|
| secretă | ck_ | pe server (ERP, facturare, importuri) | nu o trimite niciodată în URL sau în browser |
| publică | pk_ | în browser (checkout, formulare) | merge doar de pe domeniile aprobate în panou (verificăm Origin); poate fi trimisă și ca ?cheie=pk_... |
Răspunsurile pentru cheile publice includ antetele CORS pentru domeniul de origine.
Fișa firmei. {cui} acceptă și forma RO14399840 sau cu spații. Se validează cifra de control înainte de orice.
| câmp | ce e |
|---|---|
cui, cui_ro | numărul; cui_ro are prefixul RO când firma e plătitoare de TVA |
denumire, nr_reg_com, cod_caen, forma_juridica, forma_organizare, forma_proprietate, organ_fiscal, telefon, fax | identificare, așa cum le are ANAF |
stare.activa | true dacă nu e radiată și nu e inactivă fiscal |
stare.text, stare.data_inregistrare, stare.radiata, stare.data_radiere, stare.inactiv_fiscal, stare.data_inactivare, stare.data_reactivare | detaliile stării |
tva.platitor, tva.de_la, tva.pana_la, tva.perioade[] | înregistrarea în scopuri de TVA |
tva.la_incasare (+ _de_la, _pana_la), tva.split | TVA la încasare, split TVA |
efactura, efactura_de_la | înregistrarea în Registrul RO e-Factura |
adresa_sediu, adresa_fiscala | obiecte cu judet, judet_auto, localitate, strada, numar, detalii, cod_postal, cod_judet, cod_localitate, tara și text (pe o linie) |
adresa_anaf | textul brut al ANAF, pentru comparație |
verificat_la | când am citit ultima oară fișa de la ANAF |
meta.ms | cât a durat pe server |
Adaugă, în același răspuns: bilanturi[] (ultimii 3 ani: an, caen, cifra_afaceri, profit_net, venituri, cheltuieli, angajati, datorii, capitaluri, active), registru (cod_j, stare ONRC, data_inmatriculare, euid, web), persoane[] (nume, calitate — administratori, asociați), contacte[] (fel: email / telefon / site, valoare) și bani_publici (achiziții directe și contracte din SEAP, în lei).
curl "https://api-cui.ro/v1/firma/14399840?extins=1" -H "X-Api-Key: ck_..."
Toți anii disponibili (din 2011), cu aceleași câmpuri ca la extins. Sursa: Ministerul Finanțelor, date deschise.
Autocomplete după denumire. Minimum 3 litere; ignoră diacriticele, punctuația și cuvintele „SC”, „SRL”, „SA”, „PFA”. Întâi potrivire de prefix (sub 2 ms); dacă nu găsește nimic, caută și în interiorul numelui. limita ≤ 25, implicit 10. doar_active=0 include firmele radiate.
curl "https://api-cui.ro/v1/firme/cauta?q=dante+intern&judet=bucuresti" -H "X-Api-Key: ck_..."
{"rezultate":[{"cui":14399840,"denumire":"DANTE INTERNATIONAL SA","judet":"MUNICIPIUL BUCUREȘTI","localitate":"Sector 6 Mun. București","activa":true,"tva":true}],"meta":{"ms":1.1}}
Validări de format, fără să atingă baza. CUI: cifra de control. CNP: cifra de control + sex, data_nasterii, judet, rezident_strain. IBAN: mod 97, plus banca_cod pentru RO. Nu stocăm nimic din ce ne trimiți aici.
Cursul BNR. Fără parametri: ultima zi publicată, toate monedele. data=2026-09-15 întoarce cursul valabil în acea zi (ultima publicare de dinainte, dacă e weekend). moneda=EUR întoarce doar una. multiplu e 100 pentru HUF, JPY, KRW.
Erorile vin ca {"eroare": {"tip": "...", "mesaj": "...", "status": 4xx}}. Tipurile:
| status | tip | ce înseamnă |
|---|---|---|
| 400 | cui_invalid | nu trece de cifra de control |
| 401 | cheie_lipsa | lipsește antetul |
| 403 | cheie_necunoscuta, origine_nepermisa, cheie_secreta_in_url, cont_inactiv | cheia nu e bună sau nu e folosită unde trebuie |
| 404 | in_curs | CUI valid pe care nu-l avem încă; l-am cerut de la ANAF — reîncearcă după reincearca_in_secunde |
| 404 | necunoscut_anaf | ANAF nu are acest CUI (firmă străină, număr greșit) |
| 429 | ritm_depasit, cota_lunara_depasita | prea repede, sau cota lunii e consumată |
Fiecare răspuns autentificat are antetele X-Cota-Luna, X-Cota-Ramasa, X-Plan și X-Timp-Ms. Cererile refuzate (401/403/429) nu consumă cotă. Cota se resetează la 1 ale lunii.
Toate firmele sunt reverificate la ANAF cel puțin săptămânal; fișele servite cu date mai vechi de 7 zile primesc reverificare_ceruta: true și intră la coadă imediat. Firmele noi se descoperă zilnic. Dacă vrei să știi cât de proaspătă e o fișă, uită-te la verificat_la. /v1/stare arată, fără cheie, câte firme avem și ultima verificare.