Sari la conținut

Dezvoltatori

API Firma BunăToată firma, într-o cerere.

REST și JSON peste aceleași date ca site-ul: registrul ONRC, starea ANAF, bilanțurile 2008–prezent, reprezentanți, dosare, contracte publice, fonduri UE, sancțiuni, scor de risc, legături între firme, statistici și clasamente, firmele noi și webhook-uri când se schimbă ceva.

Început rapid

  1. Fă-ți un cont (gratuit) și creează o cheie în Cont → API.
  2. Trimite cheia în antetul Authorization la fiecare cerere.
  3. Planul gratuit are 500 de cereri pe lună: profilul firmei și căutarea, ca să încerci.
curl https://firmabuna.ro/v1/firme/14399840 \
  -H "Authorization: Bearer fb_live_…"

Autentificare

Cheile încep cu fb_live_ și se trimit ca Authorization: Bearer … (sau în antetul X-API-Key). Le creezi și le revoci din cont; cheia întreagă se arată o singură dată. Ține-o pe server, nu în aplicații din browser. Limitele sunt pe cont, nu pe cheie.

Planuri și limite

PlanPreț / lunăCereri / lunăPe minutInclude
Gratuitgratuit50010profil, căutare, sancțiuni, fonduri UE, statistici, clasamente, curs BNR
Developer99 lei + TVA20.00060toate endpoint-urile
Business299 lei + TVA150.000300toate endpoint-urile, 10 webhook-uri
Enterprisela cerere1.000.0001.200toate endpoint-urile, 50 webhook-uri

Fiecare răspuns are antetele X-RateLimit-Limit, X-RateLimit-Remaining, X-Quota-Limit și X-Quota-Used. La interogarea în lot fiecare CUI e o cerere. Cererile greșite (400) sau în afara planului (403) nu se numără. La cotă, cererile se opresc până la 1 ale lunii; treci oricând pe un plan mai mare din cont.

Erori

{ "eroare": { "cod": "firma_inexistenta", "mesaj": "CUI-ul nu e în registrul ONRC." } }
  • 400 cerere_invalidaParametru lipsă sau greșit (CUI invalid, URL de webhook nepublic…). Nu se numără în cotă.
  • 401 fara_cheie / cheie_invalidaLipsește antetul Authorization sau cheia a fost revocată.
  • 403 plan_insuficientEndpoint-ul nu e în planul tău. Nu se numără în cotă.
  • 404 firma_inexistenta …CUI-ul nu e în registrul ONRC (sau webhook-ul nu există).
  • 429 prea_multe_cereri / cota_epuizataLimita pe minut sau cota lunară. Antetul Retry-After spune câte secunde să aștepți.

Firme

Profil, căutare, bilanțuri, reprezentanți, evenimente, dosare, risc, legături, sancțiuni, fonduri UE, contracte publice

GET/v1/firme/{cui}Toate planurile

Profilul unei firme

Registrul ONRC, starea ANAF (TVA, TVA la încasare, split TVA, inactiv, RO e-Factura), ultimul bilanț și treapta de risc. Include și asociațiile, fundațiile, asociațiile de proprietari, sindicatele și patronatele găsite la ANAF (câmpul `tip`). Dacă starea ANAF e mai veche de 3 zile, se reverifică la ANAF înainte de răspuns (câteva secunde); `anaf.verificat_la` spune momentul.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO

Cerere

curl "https://firmabuna.ro/v1/firme/14399840" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "cui": 2816464,
  "denumire": "DEDEMAN SRL",
  "tip": "firma",
  "tip_denumire": "Firmă",
  "nr_reg_com": "J1992002621040",
  "euid": "ROONRC.J1992002621040",
  "forma_juridica": "SRL",
  "stare": "activa",
  "stari_onrc": [
    "funcțiune"
  ],
  "data_inmatricularii": "1992-11-05",
  "adresa": {
    "sediu": "Str. ALEXEI TOLSTOI, nr. 8",
    "localitate": "Municipiul Bacău",
    "judet": "Bacău",
    "cod_postal": "600093"
  },
  "caen": {
    "cod": "4752",
    "denumire": "Comerț cu amănuntul al articolelor de fierărie…"
  },
  "web": "www.dedeman.ro",
  "anaf": {
    "gasita": true,
    "platitor_tva": true,
    "tva_de_la": "1993-07-01",
    "tva_la_incasare": false,
    "split_tva": false,
    "inactiv": false,
    "inactiv_de_la": null,
    "e_factura": true,
    "verificat_la": "2026-10-05T16:20:00.000Z"
  },
  "bilant": {
    "an": 2025,
    "sursa": "mf",
    "caen": "4752",
    "cifra_afaceri": 13157835535,
    "venituri": 13502101112,
    "cheltuieli": 11563219341,
    "profit_brut": 1938881771,
    "pierdere_bruta": null,
    "profit_net": 1635337205,
    "pierdere_neta": null,
    "salariati": 12702,
    "active_imobilizate": 4501234567,
    "active_circulante": 4201234567,
    "stocuri": 2101234567,
    "creante": 401234567,
    "casa_banci": 1201234567,
    "datorii": 2014755147,
    "capitaluri_proprii": 5110382928,
    "capital_subscris": 4380160
  },
  "risc": {
    "treapta": "scazut",
    "scor": 0
  },
  "insolventa": null,
  "sanctiuni": {
    "verificat_la": "2026-10-06T04:20:00.000Z",
    "pe_lista": false,
    "liste": []
  },
  "actualizat_la": "2026-10-05T06:00:00.000Z",
  "url": "https://firmabuna.ro/firma/2816464-dedeman-srl"
}
GET/v1/cautareToate planurile

Caută firme după nume sau CUI

Ignoră diacriticele, punctuația și forma juridică; cuvintele pot fi în orice ordine. Rezultatele exacte vin primele, apoi cele active după cifra de afaceri.

Parametri

  • qquery, obligatoriu
  • judetqueryJudețul: slug (bacau), nume cu sau fără diacritice (Bacău) ori indicativ (BC)
  • include_radiatequery Valori: true, false. Implicit: false.
  • limitquery Implicit: 10. Maxim 50.
  • offsetquery Implicit: 0. Maxim 2000.

Cerere

curl "https://firmabuna.ro/v1/cautare?q=dedeman" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "total": 0,
  "rezultate": [
    {
      "cui": 0,
      "denumire": "…",
      "tip": "firma",
      "tip_denumire": "…",
      "stare": "…",
      "forma_juridica": "…",
      "judet": "…",
      "localitate": "…",
      "caen": {
        "cod": "…",
        "denumire": "…"
      },
      "data_inmatricularii": "…",
      "cifra_afaceri": 0,
      "an_bilant": 0,
      "potrivire": "cui"
    }
  ]
}
POST/v1/firme/lotDeveloper+

Mai multe firme deodată (până la 100 de CUI)

Profilul fiecărei firme, ca la GET /v1/firme/{cui}. Fiecare CUI se numără ca o cerere.

Cerere

curl -X POST "https://firmabuna.ro/v1/firme/lot" \
  -H "Authorization: Bearer fb_live_…" \
  -H "Content-Type: application/json" \
  -d '{"cui":[14399840,"RO2816464"]}'

Răspuns 200

{
  "firme": [
    {
      "cui": 2816464,
      "denumire": "DEDEMAN SRL",
      "tip": "firma",
      "tip_denumire": "Firmă",
      "nr_reg_com": "J1992002621040",
      "euid": "ROONRC.J1992002621040",
      "forma_juridica": "SRL",
      "stare": "activa",
      "stari_onrc": [
        "funcțiune"
      ],
      "data_inmatricularii": "1992-11-05",
      "adresa": {
        "sediu": "Str. ALEXEI TOLSTOI, nr. 8",
        "localitate": "Municipiul Bacău",
        "judet": "Bacău",
        "cod_postal": "600093"
      },
      "caen": {
        "cod": "4752",
        "denumire": "Comerț cu amănuntul al articolelor de fierărie…"
      },
      "web": "www.dedeman.ro",
      "anaf": {
        "gasita": true,
        "platitor_tva": true,
        "tva_de_la": "1993-07-01",
        "tva_la_incasare": false,
        "split_tva": false,
        "inactiv": false,
        "inactiv_de_la": null,
        "e_factura": true,
        "verificat_la": "2026-10-05T16:20:00.000Z"
      },
      "bilant": {
        "an": 2025,
        "sursa": "mf",
        "caen": "4752",
        "cifra_afaceri": 13157835535,
        "venituri": 13502101112,
        "cheltuieli": 11563219341,
        "profit_brut": 1938881771,
        "pierdere_bruta": null,
        "profit_net": 1635337205,
        "pierdere_neta": null,
        "salariati": 12702,
        "active_imobilizate": 4501234567,
        "active_circulante": 4201234567,
        "stocuri": 2101234567,
        "creante": 401234567,
        "casa_banci": 1201234567,
        "datorii": 2014755147,
        "capitaluri_proprii": 5110382928,
        "capital_subscris": 4380160
      },
      "risc": {
        "treapta": "scazut",
        "scor": 0
      },
      "insolventa": null,
      "sanctiuni": {
        "verificat_la": "2026-10-06T04:20:00.000Z",
        "pe_lista": false,
        "liste": []
      },
      "actualizat_la": "2026-10-05T06:00:00.000Z",
      "url": "https://firmabuna.ro/firma/2816464-dedeman-srl"
    }
  ],
  "negasite": [
    "…"
  ]
}
GET/v1/firme/{cui}/bilanturiDeveloper+

Toate bilanțurile, 2008–prezent

Din fișierele Ministerului Finanțelor și, pentru anii lipsă, de la ANAF.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/bilanturi" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "bilanturi": [
    null
  ]
}
GET/v1/firme/{cui}/reprezentantiDeveloper+

Reprezentanții legali

Administratorii și ceilalți reprezentanți din registrul ONRC. Persoanele care au făcut opoziție apar fără legături (id null) sau fără nume.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/reprezentanti" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "reprezentanti": [
    {
      "id": 0,
      "nume": "…",
      "calitate": "…",
      "persoana_juridica": true,
      "potrivire": "…",
      "alte_firme": 0
    }
  ]
}
GET/v1/firme/{cui}/evenimenteDeveloper+

Istoricul schimbărilor

Fiecare schimbare detectată: stare ONRC, TVA, inactiv, sediu, denumire, reprezentanți, bilanț nou, dosare. Cu `dupa_id` primești doar evenimentele mai noi, în ordine crescătoare (pentru sincronizare).

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO
  • dupa_idquery
  • limitquery Implicit: 50. Maxim 200.

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/evenimente" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "evenimente": [
    {
      "id": 3690355,
      "cui": 52656513,
      "tip": "dosar_insolventa",
      "eticheta": "Dosar de insolvență",
      "descriere": "6062/118/2026 · Tribunalul CONSTANTA · deschiderea procedurii la cererea debitorului",
      "valoare_veche": null,
      "valoare_noua": {
        "numar": "6062/118/2026",
        "institutie": "TribunalulCONSTANTA",
        "obiect": "deschiderea procedurii la cererea debitorului"
      },
      "sursa": "just",
      "detectat_la": "2026-10-05T23:31:19.438Z"
    }
  ]
}
GET/v1/firme-noiDeveloper+

Firmele nou înregistrate

Firmele (și organizațiile) înregistrate într-un interval, după data înmatriculării, cele mai noi întâi, cu filtre pe județ, CAEN și tipul entității. Implicit ultimele 7 zile; intervalul are cel mult 366 de zile. ONRC publică registrul o dată pe lună, deci firmele din ultimele săptămâni apar pe măsură ce sosesc edițiile (sau mai devreme, la ANAF). Pe pagini: `total`, `trunchiat`, `limit`, `offset`.

Parametri

  • dequeryPrima zi, inclusiv; implicit acum 7 zile
  • panaqueryUltima zi, inclusiv; implicit azi
  • judetqueryJudețul: slug (cluj), nume cu sau fără diacritice (Cluj) ori indicativ (CJ)
  • caenqueryCodul CAEN principal sau un prefix al lui (41, 412, 4120)
  • tipqueryDoar un tip de entitate (implicit toate) Valori: firma, asociatie, fundatie, federatie, uniune, asociatie_proprietari, sindicat, patronat.
  • limitquery Implicit: 100. Maxim 500.
  • offsetquery Implicit: 0.

Cerere

curl "https://firmabuna.ro/v1/firme-noi" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "de": "…",
  "pana": "…",
  "total": 0,
  "trunchiat": true,
  "firme": [
    {
      "cui": 0,
      "denumire": "…",
      "tip": "firma",
      "tip_denumire": "…",
      "nr_reg_com": "…",
      "forma_juridica": "…",
      "stare": "…",
      "data_inmatricularii": "…",
      "judet": "…",
      "localitate": "…",
      "caen": {
        "cod": "…",
        "denumire": "…"
      },
      "url": "…"
    }
  ]
}
GET/v1/evenimenteDeveloper+

Fluxul de evenimente al tuturor firmelor

Schimbările detectate la toate firmele: firme noi, radieri, stare ONRC, TVA, inactivări, dosare de insolvență, sancțiuni, reprezentanți etc. — aceleași tipuri ca la webhook-uri. Fără `dupa_id`: cele mai noi întâi; pagina următoare cu `inainte_de_id` = cel mai mic id primit. Cu `dupa_id`: doar evenimentele mai noi, crescător (pentru sincronizare: păstrezi cel mai mare id primit). Filtre pe tip (unul sau mai multe, separate prin virgulă), interval (după data detectării), județ și CAEN. `trunchiat` = mai urmează.

Parametri

  • tipqueryTipuri separate prin virgulă: firma_noua, stare_schimbata, denumire_schimbata, sediu_schimbat, radiere, tva_inregistrare, tva_anulare, inactiv, reactivare, efactura_inregistrare, tva_incasare_schimbat, bilant_nou, dosar_insolventa, procedura_insolventa, sanctiune, sanctiune_ridicata, dosar_nou, administrator_nou, administrator_iesit
  • dequeryDetectate din ziua aceasta, inclusiv
  • panaqueryDetectate până în ziua aceasta, inclusiv
  • judetqueryJudețul: slug (cluj), nume cu sau fără diacritice (Cluj) ori indicativ (CJ)
  • caenqueryCodul CAEN principal sau un prefix al lui (41, 412, 4120)
  • dupa_idquery
  • inainte_de_idquery
  • limitquery Implicit: 100. Maxim 500.

Cerere

curl "https://firmabuna.ro/v1/evenimente" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "trunchiat": true,
  "evenimente": [
    {
      "id": 3690355,
      "cui": 52656513,
      "tip": "dosar_insolventa",
      "eticheta": "Dosar de insolvență",
      "descriere": "6062/118/2026 · Tribunalul CONSTANTA · deschiderea procedurii la cererea debitorului",
      "valoare_veche": null,
      "valoare_noua": {
        "numar": "6062/118/2026",
        "institutie": "TribunalulCONSTANTA",
        "obiect": "deschiderea procedurii la cererea debitorului"
      },
      "sursa": "just",
      "detectat_la": "2026-10-05T23:31:19.438Z"
    }
  ]
}
GET/v1/firme/{cui}/dosareDeveloper+

Dosarele în instanță

Dosarele de pe portal.just.ro în care firma e parte, potrivite după denumire, întâi cele cu termen viitor, apoi după ultima modificare. Fără nume de persoane fizice. `incomplet` = numele e foarte comun și portalul a întors numărul maxim de rezultate. `total` = toate dosarele găsite; cu `limit` și `offset` se citesc pe pagini, iar `trunchiat` spune dacă mai urmează.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO
  • limitqueryCâte dosare pe pagină, cel mult 500 Implicit: 500. Maxim 500.
  • offsetquery Implicit: 0.

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/dosare" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "verificat_la": "…",
  "incomplet": true,
  "total": 0,
  "trunchiat": true,
  "dosare": [
    {
      "numar": "…",
      "instanta": "…",
      "sectie": "…",
      "categorie": "…",
      "stadiu": "…",
      "obiect": "…",
      "data_inregistrare": "…",
      "data_modificare": "…",
      "termen_urmator": "…",
      "ultima_solutie": "…",
      "rolul_firmei": "…"
    }
  ]
}
GET/v1/firme/{cui}/riscDeveloper+

Scorul de risc explicat

Scor 0–100 (mai mare = mai riscant), din Altman Z″, capitaluri, pierderi, starea ANAF și dosare, cu punctele fiecărui factor. Informativ, nu o recomandare de credit.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/risc" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "treapta": "scazut",
  "scor": 0,
  "altman_z": 0,
  "an_bilant": 0,
  "calculat_la": "…",
  "factori": [
    {
      "cod": "…",
      "descriere": "…",
      "puncte": 0
    }
  ]
}
GET/v1/firme/{cui}/sanctiuniToate planurile

Listele de sancțiuni UE și OFAC

Verificarea firmei în lista consolidată a sancțiunilor financiare UE și în listele OFAC (SDN și Consolidated non-SDN), actualizate zilnic. Se întorc doar potrivirile sigure: după CUI sau numărul de registru confirmate de denumire, după denumire unică în registru (cu Romania în intrare), sau reprezentanți activi după nume și data nașterii. `potriviri` gol = firma nu apare în liste la data `verificat_la`. Informativ; sursa oficială e la `url`.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/sanctiuni" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "verificat_la": "…",
  "liste": [
    {
      "cod": "…",
      "denumire": "…",
      "publicata_la": "…",
      "verificata_la": "…",
      "url": "…"
    }
  ],
  "potriviri": [
    {
      "lista": "…",
      "id_intrare": "…",
      "referinta": "…",
      "denumire": "…",
      "tip": "…",
      "programe": [
        "…"
      ],
      "listat_la": "…",
      "url": "…",
      "metoda": "identificator",
      "potrivit_la": "…",
      "reprezentant": {
        "nume": "…",
        "calitate": "…"
      }
    }
  ]
}
GET/v1/firme/{cui}/fonduriToate planurile

Proiectele cu fonduri europene

Proiectele în care firma e beneficiar, lider sau partener, din listele publice de pe data.gov.ro: MIPE — proiectele contractate 2014–2020 (POIM, POR, POC, POCU, POCA, POAT, POAD) și AFIR — PNDR 2007–2013 și 2014–2020. Se întorc doar potrivirile sigure: după CUI (POCU, PNDR 2007–2013) confirmat de denumire, sau după denumirea exactă, unică în registru (sau unică în județul proiectului), cu forma juridică compatibilă. `nerambursabil` = fonduri UE + buget național (AFIR: valoarea contractată, în euro). Programele 2021–2027 și PNRR nu sunt incluse încă. În plus, `contracte_furnizor`: contractele SEAP câștigate de firmă ca furnizor de bunuri, servicii sau lucrări în proiecte finanțate din fonduri europene (marcajul autorității în SEAP), cu sumarul în `ca_furnizor` (`ca_furnizor.contracte` = câte sunt în total). Contractele se citesc pe pagini cu `limit` și `offset`; `contracte_furnizor_trunchiat` spune dacă mai urmează.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO
  • limitqueryCâte contracte ca furnizor pe pagină, cel mult 2000 Implicit: 2000. Maxim 2000.
  • offsetquery Implicit: 0.

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/fonduri" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "proiecte_total": 0,
  "ca_partener": 0,
  "totaluri": [
    {
      "moneda": "RON",
      "proiecte": 0,
      "valoare_totala": 0,
      "nerambursabil": 0,
      "platit": 0
    }
  ],
  "proiecte": [
    {
      "program": "…",
      "perioada": "…",
      "autoritate": "MIPE",
      "cod_proiect": "…",
      "titlu": "…",
      "masura": "…",
      "rol": "beneficiar",
      "moneda": "RON",
      "valoare_totala": 0,
      "nerambursabil": 0,
      "fonduri_ue": 0,
      "platit": 0,
      "stadiu": "…",
      "data_inceput": "…",
      "data_sfarsit": "…",
      "an": 0,
      "judet": "…",
      "localitate": "…",
      "potrivire": "cui",
      "sursa": "…"
    }
  ],
  "ca_furnizor": {
    "contracte": 0,
    "valoare_ron": 0,
    "programe": [
      "…"
    ]
  },
  "contracte_furnizor": [
    {
      "data": "…",
      "autoritate": "…",
      "autoritate_cui": 0,
      "obiect": "…",
      "cpv": "…",
      "valoare_ron": 0,
      "acord_cadru_ofertanti": 0,
      "procedura": "…",
      "tip_contract": "…",
      "numar_anunt": "…",
      "program": "…",
      "tip_finantare": "…"
    }
  ],
  "contracte_furnizor_trunchiat": true,
  "surse": [
    {
      "cod": "…",
      "program": "…",
      "autoritate": "…",
      "date_la": "…",
      "verificat_la": "…",
      "url": "…",
      "fisier": "…"
    }
  ]
}
GET/v1/firme/{cui}/contracteDeveloper+

Contractele publice câștigate

Contractele de achiziție publică în care firma e furnizor câștigător, din orice sursă de finanțare: SEAP, prin AADR pe data.gov.ro, contractele publicate din 2018 încoace. Cele mai noi întâi, pe pagini (`limit`, `offset`), cu filtre pe an și pe autoritatea contractantă. Sumarul (`total`, `valoare_ron`, `autoritati`) e calculat pe toate contractele care trec de filtre, nu doar pe pagină; `trunchiat` spune dacă mai urmează. Fără filtre, `total` și `valoare_ron` sunt cele din `contracte_publice` din profil.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO
  • limitqueryCâte contracte pe pagină, cel mult 500 Implicit: 100. Maxim 500.
  • offsetquery Implicit: 0.
  • anqueryDoar contractele din anul acesta (după data contractului) Maxim 2100.
  • autoritate_cuiqueryDoar contractele cu autoritatea contractantă cu acest CUI

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/contracte" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "total": 0,
  "valoare_ron": 0,
  "acorduri_cadru": 0,
  "primul": "…",
  "ultimul": "…",
  "trunchiat": true,
  "autoritati": [
    {
      "denumire": "…",
      "cui": 0,
      "contracte": 0,
      "valoare_ron": 0
    }
  ],
  "contracte": [
    {
      "data": "…",
      "numar": "…",
      "autoritate": "…",
      "autoritate_cui": 0,
      "obiect": "…",
      "cpv": "…",
      "valoare_ron": 0,
      "acord_cadru_ofertanti": 0,
      "procedura": "…",
      "tip_contract": "…",
      "numar_anunt": "…",
      "fonduri_ue": true,
      "program": "…"
    }
  ]
}
GET/v1/firme/{cui}/legaturiDeveloper+

Firmele legate prin reprezentanți comuni

Nivelul 1: firmele în care reprezentanții acestei firme sunt și ei reprezentanți; nivelul 2: un pas mai departe. Fără persoane juridice (lichidatori) și fără persoanele cu opoziție.

Parametri

  • cuicale, obligatoriuCUI, cu sau fără prefixul RO

Cerere

curl "https://firmabuna.ro/v1/firme/14399840/legaturi" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "legaturi": [
    {
      "cui": 0,
      "denumire": "…",
      "stare": "…",
      "nivel": 0,
      "prin": [
        {
          "persoana": "…",
          "calitate": "…"
        }
      ]
    }
  ]
}

Statistici

Cifrele naționale, pe județe și pe activități CAEN; clasamente

GET/v1/statisticiToate planurile

Cifrele naționale

Câte firme sunt în România pe stări, câte s-au înființat anul acesta, câte bilanțuri și persoane sunt în registru, clasamentul după cifra de afaceri, cifrele pe fiecare județ și pe fiecare diviziune CAEN, plus ediția ONRC folosită. Cifrele sunt pentru firmele din registrul comerțului (fără asociații, fundații și celelalte organizații) și sunt recalculate periodic din registru; `calculat_la` spune când. `entitati_neradiate` numără, pe tipuri, toate entitățile (inclusiv organizațiile).

Cerere

curl "https://firmabuna.ro/v1/statistici" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "firme": {
    "total": 0,
    "active": 0,
    "radiate": 0,
    "suspendate": 0,
    "insolventa": 0,
    "dizolvare": 0,
    "noi_anul_acesta": 0
  },
  "entitati_neradiate": {},
  "persoane": 0,
  "bilanturi": {
    "randuri": 0,
    "ani": 0,
    "de_la": 0,
    "pana_la": 0
  },
  "clasament": {
    "an": 0,
    "firme_clasate": 0,
    "cifra_afaceri_totala": 0
  },
  "editie_onrc": {
    "data": "…",
    "nume": "…"
  },
  "judete": [
    {
      "denumire": "…",
      "slug": "…",
      "cod": "…",
      "total": 0,
      "active": 0,
      "cifra_afaceri": 0
    }
  ],
  "diviziuni_caen": [
    {
      "cod": "…",
      "denumire": "…",
      "sectiune": "…",
      "firme_active": 0
    }
  ],
  "calculat_la": "…"
}
GET/v1/statistici/judete/{judet}Toate planurile

Cifrele unui județ

Firmele din județ pe stări (`in_dificultate` = în insolvență sau în dizolvare), înființate anul acesta, cifra de afaceri a firmelor clasate, activitățile (diviziunile CAEN) și localitățile cu cele mai multe firme active. Cifrele sunt pentru firmele din registrul comerțului (fără asociații, fundații și celelalte organizații) și sunt recalculate periodic din registru; `calculat_la` spune când.

Parametri

  • judetcale, obligatoriuSlug (cluj), nume cu sau fără diacritice (Cluj) ori indicativ (CJ)

Cerere

curl "https://firmabuna.ro/v1/statistici/judete/{judet}" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "judet": {
    "denumire": "…",
    "slug": "…",
    "cod": "…"
  },
  "firme": {
    "total": 0,
    "active": 0,
    "radiate": 0,
    "in_dificultate": 0,
    "noi_anul_acesta": 0
  },
  "cifra_afaceri": 0,
  "an_cifra_afaceri": 0,
  "activitati": [
    {
      "cod": "…",
      "denumire": "…",
      "firme_active": 0
    }
  ],
  "localitati": [
    {
      "localitate": "…",
      "firme_active": 0
    }
  ],
  "calculat_la": "…"
}
GET/v1/statistici/caen/{cod}Toate planurile

Cifrele unei activități CAEN

O diviziune (2 cifre, ex. 41) sau o clasă (4 cifre, ex. 4120): firmele pe stări, înființate anul acesta, firmele active pe județe și, la diviziuni, clasele cu cele mai multe firme active. Din 2025 registrul folosește CAEN Rev.3, iar firmele trec treptat la codurile noi (ex. 4120 → 4100), așa că o activitate poate fi împărțită între codul vechi și cel nou; `caen.revizia` spune revizia denumirii. Cifrele sunt pentru firmele din registrul comerțului (fără asociații, fundații și celelalte organizații) și sunt recalculate periodic din registru; `calculat_la` spune când.

Parametri

  • codcale, obligatoriu

Cerere

curl "https://firmabuna.ro/v1/statistici/caen/{cod}" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "caen": {
    "cod": "…",
    "denumire": "…",
    "sectiune": "…",
    "diviziune": "…",
    "revizia": 0
  },
  "firme": {
    "total": 0,
    "active": 0,
    "noi_anul_acesta": 0
  },
  "judete": [
    {
      "denumire": "…",
      "slug": "…",
      "cod": "…",
      "firme_active": 0
    }
  ],
  "clase": [
    {
      "cod": "…",
      "denumire": "…",
      "firme_active": 0
    }
  ],
  "calculat_la": "…"
}
GET/v1/clasamenteToate planurile

Clasamentul după cifra de afaceri

Firmele ordonate după cifra de afaceri din ultimul an cu bilanțuri (`an`), național sau pe un județ și / sau o activitate CAEN (diviziune, grupă sau clasă). `loc` = locul în clasamentul cerut, `loc_national` = locul în țară. Pe pagini: `total`, `trunchiat`, `limit`, `offset`. Filtrul CAEN se aplică pe codul din registru: din 2025, CAEN Rev.3 (ex. 4120 → 4100), deci pentru o activitate merită cerute ambele coduri.

Parametri

  • judetqueryJudețul: slug (cluj), nume cu sau fără diacritice (Cluj) ori indicativ (CJ)
  • caenqueryCodul CAEN principal sau un prefix al lui (41, 412, 4120)
  • limitquery Implicit: 20. Maxim 100.
  • offsetquery Implicit: 0.

Cerere

curl "https://firmabuna.ro/v1/clasamente" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "an": 0,
  "total": 0,
  "trunchiat": true,
  "firme": [
    {
      "loc": 0,
      "loc_national": 0,
      "cui": 0,
      "denumire": "…",
      "stare": "…",
      "judet": "…",
      "caen": {
        "cod": "…",
        "denumire": "…"
      },
      "cifra_afaceri": 0,
      "profit": 0,
      "salariati": 0,
      "url": "…"
    }
  ]
}

Curs BNR

Cursul de referință, istoric din 2005, conversii

GET/v1/curs-bnrToate planurile

Cursul de referință BNR la o dată

Toate monedele sau doar cele cerute, cu variația față de publicarea anterioară. În zilele fără publicare (weekend, sărbători) se folosește ultimul curs anterior; `data_cursului` spune ziua folosită. Arhivă din 2005.

Parametri

  • dataqueryYYYY-MM-DD; implicit azi
  • monedequeryCoduri separate prin virgulă

Cerere

curl "https://firmabuna.ro/v1/curs-bnr" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "data_ceruta": "…",
  "data_cursului": "…",
  "nota": "…",
  "baza": "RON",
  "cursuri": [
    {
      "moneda": "EUR",
      "denumire": "Euro",
      "curs": 5.0782,
      "multiplicator": 0,
      "anterior": 0,
      "variatie": 0,
      "variatie_procent": 0
    }
  ],
  "necotate": [
    "…"
  ],
  "sursa": "…"
}
GET/v1/curs-bnr/istoricToate planurile

Seria zilnică a unei monede

Cursul pe fiecare zi de publicare dintr-un interval (implicit ultimele 30 de zile, cel mult 10 ani), cu minim, maxim, medie și variația pe interval.

Parametri

  • monedaquery, obligatoriu
  • dequery
  • panaquery

Cerere

curl "https://firmabuna.ro/v1/curs-bnr/istoric?moneda=EUR" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "moneda": "…",
  "denumire": "…",
  "baza": "RON",
  "de": "…",
  "pana": "…",
  "zile": 0,
  "minim": 0,
  "maxim": 0,
  "medie": 0,
  "variatie_procent": 0,
  "serie": [
    {
      "data": "…",
      "curs": 0
    }
  ],
  "sursa": "…"
}
GET/v1/curs-bnr/conversieToate planurile

Conversie valutară la cursul BNR

Între oricare două monede cotate de BNR, inclusiv RON, la cursul unei zile (implicit azi).

Parametri

  • sumaquery
  • dinquery, obligatoriu
  • inquery, obligatoriu
  • dataquery

Cerere

curl "https://firmabuna.ro/v1/curs-bnr/conversie?din=EUR&in=RON" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "suma": 0,
  "din": "…",
  "in": "…",
  "rezultat": 0,
  "curs_folosit": "…",
  "data_cursului": "…",
  "nota": "…",
  "sursa": "…"
}

Webhook-uri

Notificări la schimbări, semnate HMAC-SHA256

POST/v1/webhooksBusiness+

Abonare la evenimentele unor firme

La fiecare eveniment nou (vezi GET /v1/firme/{cui}/evenimente) al firmelor alese, trimitem un POST JSON la `url`, semnat cu secretul întors aici (o singură dată). Reîncercăm de 6 ori, în ~15 ore; după 10 livrări eșuate la rând webhook-ul se dezactivează.

Cerere

curl -X POST "https://firmabuna.ro/v1/webhooks" \
  -H "Authorization: Bearer fb_live_…" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://exemplu.ro/webhooks/firmabuna","cui":[14399840,2816464],"evenimente":["inactiv","dosar_insolventa"]}'

Răspuns 201

null
GET/v1/webhooks

Webhook-urile contului

Cerere

curl "https://firmabuna.ro/v1/webhooks" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "webhooks": [
    {
      "id": "…",
      "url": "…",
      "cui": [
        0
      ],
      "evenimente": [
        "…"
      ],
      "activ": true,
      "motiv_dezactivare": "…",
      "ultima_livrare_reusita": "…",
      "creat_la": "…"
    }
  ]
}
GET/v1/webhooks/{id}

Un webhook, cu ultimele 50 de livrări

Parametri

  • idcale, obligatoriu

Cerere

curl "https://firmabuna.ro/v1/webhooks/wh_…" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

null
PUT/v1/webhooks/{id}

Schimbă adresa, firmele sau evenimentele; reactivează

Un webhook dezactivat după erori repetate se reactivează cu `activ: true`.

Parametri

  • idcale, obligatoriu

Cerere

curl -X PUT "https://firmabuna.ro/v1/webhooks/wh_…" \
  -H "Authorization: Bearer fb_live_…" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://exemplu.ro/webhooks/firmabuna","cui":[14399840,2816464],"evenimente":["inactiv","dosar_insolventa"]}'

Răspuns 200

{
  "id": "…",
  "url": "…",
  "cui": [
    0
  ],
  "evenimente": [
    "…"
  ],
  "activ": true,
  "motiv_dezactivare": "…",
  "ultima_livrare_reusita": "…",
  "creat_la": "…"
}
DELETE/v1/webhooks/{id}

Șterge un webhook

Parametri

  • idcale, obligatoriu

Cerere

curl -X DELETE "https://firmabuna.ro/v1/webhooks/wh_…" \
  -H "Authorization: Bearer fb_live_…"
POST/v1/webhooks/{id}/test

Trimite acum un eveniment de test

Un POST semnat cu `tip: "test"`, ca să verifici semnătura și adresa. Răspunsul spune ce a întors serverul tău.

Parametri

  • idcale, obligatoriu

Cerere

curl -X POST "https://firmabuna.ro/v1/webhooks/wh_…/test" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "livrat": true,
  "cod_http": 0,
  "eroare": "…",
  "durata_ms": 0
}

Cont

Planul și consumul

GET/v1/cont

Planul și consumul lunii

Nu se numără în cotă.

Cerere

curl "https://firmabuna.ro/v1/cont" \
  -H "Authorization: Bearer fb_live_…"

Răspuns 200

{
  "plan": "…",
  "cereri_pe_minut": 0,
  "cereri_incluse": 0,
  "cereri_folosite": 0,
  "peste_cota": 0,
  "webhook_uri": 0
}

Semnătura webhook-urilor

La fiecare eveniment trimitem un POST JSON la adresa ta (doar https, IP public), cu antetele FirmaBuna-Signature, FirmaBuna-Webhook-Id și FirmaBuna-Event-Id. Răspunde cu orice cod 2xx în 10 secunde. Altfel reîncercăm după 1 min, 5 min, 30 min, 2 h și 12 h. După 10 livrări eșuate la rând webhook-ul se dezactivează și primești un e-mail. Același eveniment poate ajunge de două ori: folosește eveniment.id ca cheie de deduplicare.

Corpul

{
  "webhook_id": "wh_9-e1zYvuLdP8",
  "eveniment": {
    "id": 3690355,
    "cui": 52656513,
    "tip": "dosar_insolventa",
    "eticheta": "Dosar de insolvență",
    "descriere": "6062/118/2026 · Tribunalul CONSTANTA · deschiderea procedurii la cererea debitorului",
    "valoare_veche": null,
    "valoare_noua": { "numar": "6062/118/2026", "institutie": "TribunalulCONSTANTA", "obiect": "…" },
    "sursa": "just",
    "detectat_la": "2026-10-05T23:31:19.438Z"
  },
  "firma": { "cui": 52656513, "denumire": "PLATINUM TEHNIC S.R.L.", "url": "https://firmabuna.ro/firma/52656513-platinum-tehnic-srl" }
}

Verificarea (Node.js)

import { createHmac, timingSafeEqual } from 'node:crypto';

// body = corpul brut al cererii (string), exact cum a sosit
function verifica(secret, body, antet) {
  const p = Object.fromEntries(antet.split(',').map((x) => x.split('=')));
  if (Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false; // mai vechi de 5 minute
  const asteptat = createHmac('sha256', secret).update(`${p.t}.${body}`).digest();
  const primit = Buffer.from(p.v1, 'hex');
  return primit.length === asteptat.length && timingSafeEqual(primit, asteptat);
}

// verifica(process.env.FIRMABUNA_WEBHOOK_SECRET, body, req.headers['firmabuna-signature'])
API pentru dezvoltatori · Firma Bună