oneapi
Autentificare
Business v1 / Firme

Căutare firme

Caută firme după nume (fuzzy, word_similarity) și/sau filtre: județ, localitate (cod SIRUTA sau nume),
CAEN principal (caen de orice nivel — J, 62, 620, 6201 — prinde firmele de sub el; inexistent = 404),
formă juridică, stare, plătitor TVA. Filtrele de locație folosesc sediul REZOLVAT.
Rezultat paginat (?pagina=&per_pagina=), sortat pe relevanță (când e q) apoi denumire.

GET
https://oneapi.ro/api/business/v1/firme/cauta

Parametri de interogare

NumeTipDescriereValori acceptate
caenopțional string | null Cod CAEN de orice nivel — secţiune (J), diviziune (62), grupă (620), clasă (6201) — şi întoarce firmele de sub el. Un cod inexistent e 404, nu o listă goală. Ce s-a căutat e în meta.caen. ex. 62ex. 4932ex. 6210
caen_versiuneopțional string | null Revizia codului din caen (1, 2, 3), când forma lui e ambiguă: 4932 e taxi în Rev.2 şi transport ocazional de pasageri în Rev.3. Fără ea, codul se caută întâi în Rev.3, apoi în Rev.2 şi Rev.1. 123
sortareopțional string | null Ordinea: relevanta (implicit când se caută după nume), denumire (implicit fără q), cifra_afaceri, profit, salariati (descrescător, pe ultimul bilanţ depus), data_inmatriculare (cele mai noi întâi). relevantadenumirecifra_afaceriprofitsalariatidata_inmatriculare
salariati_minopțional integer | null Cel puţin atâţia salariaţi (numărul mediu din ultimul bilanţ). Firmele fără bilanţ nu trec de filtru. 0
salariati_maxopțional integer | null Cel mult atâţia salariaţi. 0
ca_minopțional number | null Cifra de afaceri minimă, în lei, din ultimul bilanţ. 0
ca_maxopțional number | null Cifra de afaceri maximă, în lei. 0
an_infiintare_minopțional integer | null Înmatriculate cel mai devreme în acest an. 1800 – 2100
an_infiintare_maxopțional integer | null Înmatriculate cel târziu în acest an. 1800 – 2100
are_registruopțional boolean | null Cu 1, doar firmele care apar în cel puţin un registru public (autorizaţii, licenţe, sancţiuni — /firme/{cui}/registre); cu 0, cele care nu apar. ex. 1
are_achizitiiopțional boolean | null Cu 1, doar firmele care au câştigat cel puţin o achiziţie publică; cu 0, cele care n-au câştigat niciuna. ex. 1
are_fonduriopțional boolean | null Cu 1, doar beneficiarii de fonduri europene; cu 0, ceilalţi. ex. 1
categorieopțional string | null O categorie de servicii de la /caen/categorii (instalatori, stomatologi, service-auto…) în loc de un cod CAEN. Nu se combină cu caen. ⚠️ Totalul e o limită de jos, nu numărul meseriei. Categoria îşi declară codurile în CAEN Rev.3, iar codul pe care îl poartă o firmă vine din ANAF fără să spună ediţia; din ediţiile vechi se iau numai codurile care duc EXCLUSIV în categorie, nu şi clasele-sac (a lua tot „4399 — construcţii specializate n.c.a." ar umfla cifra cu firme care fac altceva). De aceea categorie=X dă mai puţin decât caen=<codul ei>, care e permisiv — pe meseriile cu un singur cod, mediana e în jur de trei sferturi. Răspunsul o spune: meta.total_e_limita_de_jos, meta.coduri_cautate şi meta.nota_acoperire. constructii-cladiriinstalatorielectricienizugravifinisajefaiantari-parchetaritamplariizolatiiacoperisurizidariterasamente-demolariarhitectiproiectare-ingineriedesign-interiormobilacurateniedezinsectie-deratizaregradinarireparatii-electrocasnicereparatii-calculatoare-telefoaneservice-autoservice-motopiese-autodealeri-autoinchirieri-autobenzinariitransport-marfamutaricurierattaxitransport-persoanelogistica-depozitarerestaurantefood-truckcateringbaruri-cafenelehoteluripensiuni-cazarecampingbrutarii-cofetariimedici-familieclinici-medicalestomatologilaboratoare-analizepsihologikinetoterapiefarmaciispitaleingrijire-varstniciveterinarifrizerii-coafuricosmeticaspa-masajspalatorii-curatatoriipompe-funebrefitnesssportevenimenteartisti-spectacolecontabilitateavocati-notariconsultanta-managementpublicitate-marketingdesign-graficfotografitraducatoriresurse-umanepaza-protectieservicii-birouasigurariagentii-imobiliaredezvoltatori-imobiliariinchirieri-imobiliareagentii-turismdezvoltare-softwareconsultanta-ithosting-webtelecomunicatiigradinite-cresescolicursuri-meditatiiscoli-sofericursuri-arte-sportmagazine-alimentaremagazine-constructiimagazine-hainemagazine-electronicemagazine-mobilaflorariibijuteriicultura-plantelorzootehnieservicii-agricolesilviculturaenergie-regenerabilafurnizori-energiedeseuri-reciclare
formaopțional string | null Forma juridică (SRL, SA, PFA…), aşa cum apare în nomenclatorul ONRC. ex. SRL
judetopțional string | null Filtrare pe judeţul sediului rezolvat. ex. CJex. IS
localitateopțional integer | null Localitatea sediului rezolvat prin Locations — nume sau cod SIRUTA. 1
qopțional string | null Textul căutat în denumire (potrivire fuzzy). ex. digital
stareopțional string | null Starea firmei la registrul comerţului (funcţiune, radiată, dizolvare…). ex. funcțiune
tvaopțional boolean | null Cu 1 întoarce numai plătitorii de TVA, cu 0 numai neplătitorii. ex. true
uatopțional integer | null UAT-ul sediului rezolvat — nume sau cod SIRUTA. Mai îngust decât judet, mai larg decât localitate. 1

Cum se comportă

  • Căutare după denumire cu potrivire fuzzy (similaritate de cuvinte), plus filtre combinabile: judet, localitate, uat, caen, forma, stare, tva. Rezultatele sunt paginate offset (pagina, per_pagina).
  • Filtrele geografice (judet, localitate, uat) se aplică pe sediul rezolvat prin Locations, nu pe textul brut — aşa că prind şi firmele al căror sediu era scris neuniform la ONRC.
  • Căutarea nu e menită să înlocuiască o interogare exactă după CUI: pentru asta există /firme/{cui}. E gândită pentru descoperire — „firme de transport din Cluj plătitoare de TVA".
  • caen e ierarhic şi trece peste revizii. caen=62 prinde 6201, 6202…, iar firmele care încă poartă coduri Rev.1 ori deja Rev.3 se prind prin corespondenţa oficială INS. Fişierul ANAF amestecă reviziile, deci un filtru pe codul exact ar fi pierdut firmele trecute pe altă revizie.
  • Filtrele de mărime (salariati_*, ca_*) citesc ultimul bilanţ depus al firmei: o firmă fără bilanţ nu trece de ele, pentru că nu ştim cât e — n-o putem declara „între 10 şi 49 de salariaţi".
  • Cu sortare=cifra_afaceri, profit ori salariati, lista devine un clasament pe ultimul bilanţ depus al fiecărei firme (anul e în financiar.an, deci poate diferi între firme) şi cuprinde doar firmele care au bilanţ — meta.paginare.total scade în consecinţă. Pentru un clasament pe un singur an: /firme/top.
  • Firmele încă pe Rev.2 intră într-o categorie doar când codul lor vechi duce clar acolo: fie toate corespondentele lui Rev.3 sunt în categorie, fie a fost doar renumerotat în cel mult 3 coduri (5610 restaurante → 5611 + 5612; 4120 → 4100; 4532 piese auto → 4782), fie îşi păstrează numărul (6820 → 6820). Codurile-sac nu intră: 4399 „alte lucrări speciale de construcţii" se împarte în zece coduri Rev.3, deci „instalatori" nu mai prinde firme de schele ori fundaţii. Preţul: activităţile care în Rev.2 stăteau doar în codurile-sac (zidăria, în 4399) apar abia pe măsură ce firmele trec, obligatoriu, pe Rev.3.

La ce folosește

  • Un câmp de căutare cu autocomplete pentru firme.
  • Segmentarea pieţei: câte firme active dintr-un CAEN, într-un judeţ.
  • Găsirea unei firme al cărei CUI nu-l ştii, pornind de la nume.

Structura răspunsului

CâmpTipDescriere
data[].cui integer Codul fiscal.
data[].denumire string | null Denumirea.
data[].cod_inmatriculare string | null Numărul de ordine în registrul comerţului (J…).
data[].forma_juridica string | null Forma juridică (SRL, SA, PFA…).
data[].stare string | null Starea firmei, ca obiect: denumire e textul brut din ONRC (107 valori distincte folosite), categorie e clasificarea noastră în 7 cutii — activa, suspendata, dizolvata, lichidare, radiata, insolventa, alta — pe care o foloseşti ca să filtrezi sau să grupezi. cod e codul ONRC al stării.
data[].data_inmatriculare string | null Data înmatriculării la registrul comerţului.
data[].radiere.vazut_la string
data[].radiere.dupa string | null
data[].sediu.judet string Judeţul sediului social.opțional
data[].sediu.localitate string Localitatea sediului social.opțional
data[].sediu.cod_siruta integer Codul SIRUTA al localităţii — chainable spre /locations/v1.opțional
data[].caen_principal.cod string Codul CAEN principal.
data[].caen_principal.denumire string | null Denumirea activităţii principale.
data[].fiscal.tva boolean Plătitoare de TVA.
data[].fiscal.inactiv boolean Declarată inactivă fiscal.
data[].fiscal.e_factura boolean Înrolată în e-Factura.
data[].financiar object Ultimul bilanţ depus (an, cifră de afaceri, profit net, salariaţi); null la firmele fără bilanţ — PFA-uri, firme noi —, nu zero.
data[].financiar.an integer Anul bilanţului.
data[].financiar.cifra_afaceri number | null Cifra de afaceri netă, în lei.
data[].financiar.profit_net number | null Profitul net, în lei; negativ = pierdere.
data[].financiar.salariati integer | null Numărul mediu de salariaţi.
meta.paginare.pagina integer Pagina curentă.
meta.paginare.per_pagina integer Rezultate pe pagină.
meta.paginare.total integer Total rezultate.
meta.paginare.pagini integer Număr de pagini.
meta.caen object Cum s-a înţeles parametrul caen: codul cerut, revizia în care s-a citit şi codul pe care l-a folosit ruta. La o listă de coduri, câte un obiect pe cod.
meta.caen.cerut string Codul CAEN trimis, normalizat (litere mari, fără puncte).
meta.caen.versiune_cerut string Revizia în care s-a citit codul trimis: cea din caen_versiune, altfel prima în care există.
meta.caen.nivel string Nivelul codului folosit — la rutele de firme, al codului cerut: sectiune, subsectiune, diviziune, grupa, clasa sau agregat.
meta.caen.denumire string Denumirea codului, din nomenclatorul CAEN.
meta.caen.clase_cautate integer Câte clase CAEN, din toate reviziile purtate de firme, cad sub codul cerut.
meta.caen.clase_altele_decat_cerut integer Câte dintre ele NU sunt codul cerut. Căutarea e permisivă (traduce codul în toate ediţiile, ca să prindă firmele nerenumerotate), iar traducerea urcă uneori în clase mult mai largi — deci totalul poate fi despre mai mult decât meseria cerută.
meta.caen.nota_acoperire string Apare doar când s-a căutat şi pe alte clase decât codul cerut, şi spune ce să foloseşti dacă vrei o cifră strict despre meseria cerută.
meta.caen.clase string[] Clasele brute pe care s-a căutat, când sunt cel mult 20. Ca totalul să fie verificabil, nu o cifră de luat pe credit.

Exemple de răspuns

GEThttps://oneapi.ro/api/business/v1/firme/cauta?q=digital
{
    "data": [
        {
            "cui": 32917762,
            "denumire": "DIGITAL 1 VENTURES DEVELOPMENT SRL",
            "cod_inmatriculare": "J12/957/2014",
            "forma_juridica": "SRL",
            "stare": {
                "cod": "1084",
                "denumire": "radiată",
                "categorie": "radiata"
            },
            "data_inmatriculare": "2014-03-13",
            "sediu": {
                "judet": "Cluj",
                "localitate": "Cluj-Napoca",
                "cod_siruta": 54984
            },
            "caen_principal": {
                "cod": "6201",
                "denumire": "Activități de realizare a soft-ului la comandă (software orientat client)"
            },
            "fiscal": {
                "tva": true,
                "inactiv": false,
                "e_factura": false
            },
            "financiar": {
                "an": 2025,
                "cifra_afaceri": 83990,
                "profit_net": 3947,
                "salariati": 1
            }
        }
    ],
    "meta": {
        "paginare": {
            "pagina": 1,
            "per_pagina": 20,
            "total": 6105,
            "pagini": 306
        }
    }
}

Coduri de eroare

CodSlugCând apare
200categorie_nerezolvabiladata: null + motivul în meta.fara_date: categoria cerută nu se poate rezolva în codurile pe care le poartă firmele, fiindcă înţelesul codului ei diferă între ediţiile CAEN (meta.clase_ambigue le numeşte). NU e „nu există astfel de firme" — de aceea nu e listă goală.
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422validareUn parametru nedeclarat ori o valoare care nu trece validarea (an_infiintare_, are_, ca_, caen, caen_versiune, categorie, forma, judet, localitate, q, salariati_, sortare, stare, tva, uat); un maxim sub minim ori categorie împreună cu caen intră tot aici. Câmpul vinovat e în detalii.
422q_scurtTermenul de căutare trebuie să aibă cel puțin 3 caractere.
422fara_criteriuSpecifică q sau cel puțin un filtru.
422filtru_necunoscutUn filtru care nu corespunde niciunei entităţi (judeţ, localitate, UAT, formă juridică, stare, CATEGORIE scrise greşit) — nu o listă goală; detalii.camp spune care.
422caen_inexistentCodul din caen nu există în nicio revizie CAEN. ⚠️ 422, nu 404, din 6 oct 2026: aici caen e o valoare de FILTRU, iar pe o listare 404 ar însemna „resursa nu există" şi nu s-ar putea deosebi, la client, de o secţiune fără date. Codul scurt rămâne caen_inexistent, nu devine filtru_necunoscut: „codul CAEN nu există" şi „judeţul nu există" rămân două lucruri diferite. Pe rutele care au codul în CALE (/caen/{cod}/…, /sector/{caen}/…) rămâne 404, fiindcă acolo codul E resursa.
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": "Un parametru nedeclarat ori o valoare care nu trece validarea (an_infiintare_*, are_*, ca_*, caen, caen_versiune, categorie, forma, judet, localitate, q, salariati_*, sortare, stare, tva, uat); un maxim sub minim ori categorie împreună cu caen intră tot aici. Câmpul vinovat e în detalii.",
        "detalii": {
            "caen": [
                "Valoarea trimisă nu respectă regula parametrului."
            ]
        }
    }
}