{"openapi":"3.1.0","info":{"title":"Firmoscop API","version":"0.3.0","description":"Verificarea firmelor românești, AI-native. Profil de firmă, căutare, grupuri de firme și scor de bonitate — GRATUIT din indexul propriu (ANAF, ONRC, Ministerul Finanțelor, SEAP). Verdictul complet de risc comercial (verde/galben/roșu) e calculat DETERMINIST din surse publice (ANAF, MF, portalul instanțelor, BPI) — 1 credit. Autentificare: cheie Bearer `fk_…` (o generezi la /developers; contul gratuit are 10 credite pe lună). Toate răspunsurile limitate per cheie întorc headere X-RateLimit-*.","contact":{"name":"Firmoscop","url":"https://firmoscop.ro/developers"}},"servers":[{"url":"https://firmoscop.ro"}],"tags":[{"name":"Chei & cont","description":"Emitere cheie, cont, credite."},{"name":"Firme (gratuit)","description":"Index propriu: căutare, profil, grup de firme — fără credit."},{"name":"Verificare (credite)","description":"Verdict de risc calculat la sursă."},{"name":"Prospectare","description":"Liste filtrate de firme (plătit, fără date personale)."},{"name":"Monitorizare","description":"Listă de urmărire, re-verificată zilnic."},{"name":"Meta","description":"Statistici publice, MCP."}],"paths":{"/api/v1/keys/register":{"post":{"tags":["Chei & cont"],"summary":"Creează cont gratuit pe email (10 credite pe lună)","description":"Email NOU → cont gratuit + sesiune (201, cu token și cookie). Email DEJA înregistrat → NU se deschide sesiune: primești 200 cu `needsCode:true` și un cod pe email, pe care îl confirmi la POST /auth/email/verify. Adresa singură nu dă acces la un cont existent. Contul gratuit are 10 credite pe lună, fără card. Plafonul se reîmprospătează la începutul fiecărei luni, iar ce nu folosești nu se reportează. Verificarea emailului sau sign-in-ul Google nu schimbă plafonul. Contul e NECONFIRMAT până la prima confirmare a adresei. Pașii care merg: (2) POST /auth/email/request {email} → cod pe email; (3) POST /auth/email/verify {email, code} → token de sesiune NOU (tokenul de aici și orice cheie `fk_`, tokenuri OAuth sau webhook-uri emise înainte se revocă la confirmare; răspunsul le enumeră în `revocat`); (4) POST /api/v1/keys/rotate cu tokenul nou → cheia `fk_`. Confirmă adresa înainte să rotești cheia.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"label":{"type":"string","description":"numele agentului/aplicației (opțional)"}}}}}},"responses":{"201":{"description":"Cont creat / autentificat (cookie de sesiune setat).","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"loggedIn":{"type":"boolean"},"isNew":{"type":"boolean"}}}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/keys/rotate":{"post":{"tags":["Chei & cont"],"summary":"Emite/rotește cheia API `fk_…` (afișată o singură dată)","description":"Necesită sesiune (cookie sau X-Fs-Session) sau o cheie Bearer existentă. Rotația invalidează cheia anterioară. Folosește sesiunea de DUPĂ confirmarea adresei (POST /auth/email/request → POST /auth/email/verify): pe un cont neconfirmat, cheia emisă aici moare la prima confirmare (cod, link magic sau Google). Acreditarea cererii se re-verifică la scriere: o sesiune sau cheie care nu mai e validă primește 401 `credential_revoked`.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Cheia nouă.","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","example":"fk_…"},"message":{"type":"string"}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Tokenul OAuth (`fso_…`) al unei aplicații conectate, de ex. ChatGPT sau Claude: nu gestionează contul. Merge cu cheia API sau din cont. Eroarea e `insufficient_scope`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"tags":["Chei & cont"],"summary":"Contul curent: email, credite, firme urmărite","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Starea contului.","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","nullable":true},"credits":{"type":"integer","description":"Cât mai poate consuma contul acum: plafonul lunar rămas + soldul care nu expiră."},"creditStatus":{"type":"object","description":"Desfacerea lui `credits`. O operație consumă întâi din plafonul lunii, apoi din sold; 402 doar când sunt goale amândouă.","properties":{"remaining":{"type":"integer"},"plan":{"type":"object","properties":{"limit":{"type":"integer"},"used":{"type":"integer"},"remaining":{"type":"integer"}},"description":"Plafonul planului în luna UTC curentă; se reface la începutul lunii."},"topup":{"type":"integer","description":"Soldul: credite din pachete cumpărate sau adăugate manual. Nu expiră și nu se resetează lunar."}}},"watching":{"type":"integer"},"watchLimit":{"type":"integer","nullable":true,"description":"Plafonul listei de urmărire al contului: 25 pe contul gratuit; null = cont fără plafon."},"adresaDovedita":{"type":"boolean","nullable":true,"description":"Adresa contului e confirmată (cod pe email, link magic sau Google). Un cont creat prin register rămâne `false` până la prima confirmare, care revocă cheia și sesiunile emise înainte. `null` = starea n-a putut fi citită."}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/search":{"get":{"tags":["Firme (gratuit)"],"summary":"Caută firme după nume (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":3}}],"responses":{"200":{"description":"Candidați potriviți pe nume.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"hits":{"type":"array","items":{"$ref":"#/components/schemas/SearchHit"}}}}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/suggest":{"get":{"tags":["Firme (gratuit)"],"summary":"Sugestii publice după nume (fără cont, limitat pe IP)","description":"Câmpuri minime, pentru autocomplete public. Pentru integrare folosește /api/v1/search cu cheie.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Până la 10 sugestii.","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"hits":{"type":"array","items":{"$ref":"#/components/schemas/SuggestHit"}}}}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}":{"get":{"tags":["Firme (gratuit)"],"summary":"Profil de firmă (identitate, stare, bilanțuri, bonitate, reprezentanți) — fără credit","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Profilul firmei din index.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfile"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}/connections":{"get":{"tags":["Firme (gratuit)"],"summary":"Grup de firme (rețea prin reprezentanți comuni) — fără credit","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Firmele legate prin administratori/reprezentanți cu același nume.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connections"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/verify/{cui}":{"get":{"tags":["Verificare (credite)"],"summary":"Verifică o firmă după CUI (1 credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."},{"name":"fresh","in":"query","schema":{"type":"string","enum":["1"]},"description":"ocolește cache-ul de 24h"}],"responses":{"200":{"description":"Raport structurat: verdict, semnale cu sursă+dată, financiare, dosare, artifactUrl.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyReport"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Plafonul lunar al planului e consumat și soldul e gol — mesajul spune când se reface plafonul și cum obții mai multe credite (pachet sau plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Doar pe sesiunea de cont (cookie), nu pe cheia Bearer: cererea a pornit dintr-un link de pe alt site (`Sec-Fetch-Site: cross-site`, fără `X-Fs-Session`). Nu se consumă nimic. Eroarea e `cross_site_request`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/verify/batch":{"post":{"tags":["Verificare (credite)"],"summary":"Verifică până la 20 de firme într-o cerere (1 credit / firmă reușită)","description":"Sincron. Se taxează doar verificările reușite; se oprește când se termină creditele. Pentru volume mari, împarte în loturi.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cuis"],"properties":{"cuis":{"type":"array","items":{"type":"string","pattern":"^\\d{1,10}$"},"maxItems":20}}}}}},"responses":{"200":{"description":"Rezultat per CUI (raport sau eroare) + credite rămase.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object"}},"creditsRemaining":{"type":"integer"}}}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}/financials":{"get":{"tags":["Firme (gratuit)"],"summary":"Bilanțuri multi-anuale (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Istoric financiar din index.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"cui":{"type":"string"},"count":{"type":"integer"},"financials":{"type":"array","items":{"$ref":"#/components/schemas/FinancialYear"}}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}/financials.csv":{"get":{"tags":["Firme (gratuit)"],"summary":"Bilanțuri multi-anuale ca CSV pentru Excel (fără credit)","description":"Aceleași date ca /financials, dar CSV (UTF-8 cu BOM, un an per rând). Include câmpurile de bilanț extinse (active circulante/imobilizate, profit brut, capital subscris) când sunt disponibile.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Fișier CSV descărcabil.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}/contracts":{"get":{"tags":["Firme (gratuit)"],"summary":"Contracte publice câștigate, paginat (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Pagină de contracte SEAP.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"cui":{"type":"string"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Contract"}}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}/history":{"get":{"tags":["Firme (gratuit)"],"summary":"Istoric de modificări ONRC — mențiuni (fără credit)","description":"Timeline de schimbări (redenumire, sediu, stare juridică, CAEN, nr. înmatriculare) capturate prin CDC, cel mai recent întâi.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Evenimente de istoric.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"cui":{"type":"string"},"count":{"type":"integer"},"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company/{cui}/debts":{"get":{"tags":["Firme (gratuit)"],"summary":"Restanțe la buget (ANAF, lista datornicilor) — fără credit","description":"Din lista trimestrială ANAF a datornicilor. `hasDebt:false` = nu figurează (fără restanțe raportate peste pragul ANAF).","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Restanțe (sau hasDebt:false).","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiscalDebt"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/vat/{cui}":{"get":{"tags":["Firme (gratuit)"],"summary":"Stare fiscală: TVA / inactiv fiscal / e-Factura (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Starea fiscală din index.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VatStatus"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/vies/{country}/{vat}":{"get":{"tags":["Firme (gratuit)"],"summary":"Validare TVA intracomunitar prin VIES (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Cod stat membru UE (RO, DE, EL, XI…)."},{"name":"vat","in":"path","required":true,"schema":{"type":"string"},"description":"Numărul de TVA, fără codul de țară."}],"responses":{"200":{"description":"Rezultatul validării VIES.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViesResult"}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/caen":{"get":{"tags":["Firme (gratuit)"],"summary":"Caută coduri CAEN după cod sau denumire (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2}}],"responses":{"200":{"description":"Coduri potrivite.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Caen"}}}}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/caen/{code}":{"get":{"tags":["Firme (gratuit)"],"summary":"Denumirea unui cod CAEN (fără credit)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{2,6}$"}}],"responses":{"200":{"description":"Codul + denumirea.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Caen"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pricing":{"get":{"tags":["Meta"],"summary":"Prețuri citibile de mașină (public, fără cheie) — pentru top-up autonom al agenților","responses":{"200":{"description":"Unitatea de preț, pachetele de credite, abonamentele, fereastra de re-check și free tier-ul. Contul gratuit are 10 credite pe lună, fără card. Plafonul se reîmprospătează la începutul fiecărei luni, iar ce nu folosești nu se reportează. Un credit = o pagină de listă de 25 de firme. La descărcarea în Excel, primele 50 de rânduri sunt gratuite, apoi un credit la 25 de firme. O verificare automată, adică raportul complet cerut din Google Sheets, din programul tău sau dintr-un agent conectat cu cheie API, costă un credit; căutarea și profilul firmei rămân gratuite. Creditele cumpărate nu expiră: stau în soldul tău și se folosesc după ce ai consumat plafonul lunar al planului. Prețurile sunt cu TVA inclus: `vat_rate` dă cota, iar `price_net_ron` baza fără TVA.","content":{"application/json":{"schema":{"type":"object","properties":{"free_tier":{"type":"object","description":"Poarta contului gratuit: un plafon lunar de credite, nu un sold primit o singură dată.","properties":{"monthly_quota":{"type":"integer","description":"Creditele contului gratuit în fiecare lună. Se reîmprospătează la începutul lunii calendaristice (UTC); ce nu folosești nu se reportează."},"quota_resets":{"type":"string","enum":["month_start_utc"]},"unused_rolls_over":{"type":"boolean"},"card_required":{"type":"boolean"},"deprecated_fields":{"type":"array","items":{"type":"string"},"description":"Cheile vechi păstrate pentru compatibilitate."},"signup_credits":{"type":"integer","deprecated":true,"description":"Depășit din 20 oct 2026: are valoarea lui monthly_quota. Citește monthly_quota."},"verified_credits":{"type":"integer","deprecated":true,"description":"Depășit din 20 oct 2026: are valoarea lui monthly_quota. Citește monthly_quota."},"monthly_free_verifications":{"type":"integer","deprecated":true,"description":"Depășit din 20 oct 2026: are valoarea lui monthly_quota. Citește monthly_quota."}}}}}}}}}}},"/api/v1/companies":{"get":{"tags":["Prospectare"],"summary":"Liste filtrate de firme (1 credit la 25 de firme)","description":"Prospectare pe CAEN / județ / localitate / formă juridică / stare / TVA / e-Factura / vechime / benzi de mărime. Obligatoriu cel puțin `caen` sau `county`. Rândurile conțin DOAR date de persoană juridică — fără reprezentanți sau contact. Sediile secundare (punctele de lucru cu cod fiscal propriu) nu apar: nu sunt firme separate. Revânzarea în bloc e interzisă (ToS).","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"caen","in":"query","schema":{"type":"string","pattern":"^\\d{2,6}$"},"description":"Cod CAEN sau prefix (ex. 41 = toată diviziunea construcții)."},{"name":"county","in":"query","schema":{"type":"string"},"description":"Județ (ex. Cluj) — diacriticele nu contează."},{"name":"state","in":"query","schema":{"type":"string","enum":["active","insolvent"]}},{"name":"vat","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"Plătitor de TVA."},{"name":"minTurnover","in":"query","schema":{"type":"number","minimum":0,"maximum":1000000000000000},"description":"Cifra de afaceri minimă (lei), din ultimul bilanț."},{"name":"minEmployees","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000000},"description":"Numărul minim de angajați."},{"name":"legalForm","in":"query","schema":{"type":"string"},"description":"Forma juridică, exact (SRL, SA, PFA, II, IF, AF, PF, SNC…)."},{"name":"locality","in":"query","schema":{"type":"string"},"description":"Localitatea (ex. Cluj-Napoca) — diacriticele nu contează."},{"name":"address","in":"query","schema":{"type":"string","minLength":3},"description":"Text din adresa sediului (stradă / cod poștal). ONRC abreviază — caută partea distinctivă."},{"name":"localityType","in":"query","schema":{"type":"string","enum":["urban","rural"]},"description":"Mediul: urban (municipii, orașe, sectoare) sau rural (comune, sate). Localitățile fără prefix recunoscut nu intră în niciuna."},{"name":"finYear","in":"query","schema":{"type":"integer","minimum":2008,"maximum":2026},"description":"Anul de bilanț pe care se aplică pragurile financiare (cifră de afaceri, angajați, evoluție). Implicit: ultimul bilanț al fiecărei firme, dar numai dacă e din ultimul an fiscal publicat sau din cel dinaintea lui; firmele cu bilanț mai vechi nu trec pragurile."},{"name":"turnoverGrowthPct","in":"query","schema":{"type":"number","minimum":-10000,"maximum":10000},"description":"Evoluția cifrei de afaceri față de anul precedent, în %: pozitiv = creștere minimă, negativ = scădere minimă."},{"name":"efactura","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"Înscrisă în RO e-Factura."},{"name":"finantare","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"A încasat finanțare publică (PNRR). Filtru îngust: sub 3.000 de societăți din tot registrul."},{"name":"inactive","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"Declarată inactivă fiscal de ANAF."},{"name":"registeredAfter","in":"query","schema":{"type":"string","format":"date"},"description":"Înmatriculată la/după data asta (YYYY-MM-DD, între 1900 și anul viitor)."},{"name":"registeredBefore","in":"query","schema":{"type":"string","format":"date"},"description":"Înmatriculată până la data asta (YYYY-MM-DD, între 1900 și anul viitor)."},{"name":"maxTurnover","in":"query","schema":{"type":"number","minimum":0,"maximum":1000000000000000},"description":"Cifra de afaceri maximă (lei) — benzi de mărime; 0 = firme fără cifră de afaceri în bilanț."},{"name":"maxEmployees","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000000},"description":"Numărul maxim de angajați; 0 = firme fără angajați în bilanț."},{"name":"sort","in":"query","schema":{"type":"string","enum":["turnover"]},"description":"sort=turnover → cele mai mari firme întâi (implicit: după CUI)."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":25}}],"responses":{"200":{"description":"Pagină de firme + credite rămase.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"filters":{"type":"object"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"},"lista":{"type":"object","nullable":true,"description":"Filtrul rulat, în forma canonică a listelor salvate din aplicație (chei sortate, valori parsate, fără page/pageSize/sort). Listele salvate se gestionează din contul de pe app.firmoscop.ro, nu prin API-ul public: rutele lor nu sunt în acest document. `faraFirmeNoi` = filtrul cere bilanț, deci lista nu poate prinde firme noi. `null` când filtrul rulat nu se poate salva (filtrează după adresă).","properties":{"filtru":{"type":"string"},"faraFirmeNoi":{"type":"boolean"}}},"creditsCharged":{"type":"integer","description":"Creditele debitate pentru pagină: ceil(rânduri / 25), minimum 1."},"creditsRemaining":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CompanyListRow"}}}}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Plafonul lunar rămas și soldul, adunate, nu acoperă pagina. Corpul are `cost`, `remaining` (plafon + sold) și `rows`; nu se debitează nimic.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/statistici":{"get":{"tags":["Prospectare"],"summary":"Statisticile unei selecții, cu etalonul național (gratuit, cere cont)","description":"Aceleași filtre ca `/api/v1/companies`, dar răspunsul e agregat: categorii și numere, niciun rând de firmă. Fiecare categorie poartă și ponderea ei la nivel național (`nationalSharePct`), ca felia să se poată citi în context. Nu costă credite — creditul plătește lista de firme, nu un procent. Obligatoriu cel puțin `caen` sau `county`, ca la listare.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"breakdown","in":"query","schema":{"type":"string","enum":["judet","activitate","an_infiintare","grupa_angajati","grupa_cifra_afaceri","tip_localitate","forma_juridica"],"default":"judet"},"description":"Dimensiunea pe care se detaliază selecția."},{"name":"caen","in":"query","schema":{"type":"string","pattern":"^\\d{2,6}$"},"description":"Cod CAEN sau prefix (ex. 41 = toată diviziunea construcții)."},{"name":"county","in":"query","schema":{"type":"string"},"description":"Județ (ex. Cluj) — diacriticele nu contează."},{"name":"state","in":"query","schema":{"type":"string","enum":["active","insolvent"]}},{"name":"legalForm","in":"query","schema":{"type":"string"},"description":"Forma juridică, exact (SRL, SA, PFA…). Restul filtrelor din `/api/v1/companies` se acceptă identic."}],"responses":{"200":{"description":"Categoriile selecției, cu ponderea proprie și cea națională.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"application/json":{"schema":{"type":"object","properties":{"filters":{"type":"object"},"breakdown":{"type":"string"},"breakdownLabel":{"type":"string"},"total":{"$ref":"#/components/schemas/StatBucket"},"buckets":{"type":"array","items":{"$ref":"#/components/schemas/StatBucket"}},"truncated":{"type":"integer","description":"Categorii rămase în afara plafonului de 14. Zero = nu s-a tăiat nimic."}}}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/firme-noi/export.csv":{"get":{"tags":["Prospectare"],"summary":"Firmele înmatriculate într-o zi, ca CSV (gratuit, cere cont)","description":"Lista de pe [/firme-noi](/firme-noi), ca fișier: peste ce se vede public adaugă adresa sediului social, forma juridică, data înmatriculării și statutul TVA / e-Factura. Nu costă credite — contul e poarta, nu prețul. La PFA și întreprinderi individuale (`tip=pfa`) coloana `adresa_sediu` vine goală: acolo sediul e frecvent domiciliul persoanei. Revânzarea în bloc e interzisă (ToS).","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"zi","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":"Ziua înmatriculării (`YYYY-MM-DD`). Implicit: ultima zi încheiată cu înmatriculări."},{"name":"judet","in":"query","schema":{"type":"string"},"description":"Slug-ul județului din URL-ul paginii (ex. `cluj`)."},{"name":"tip","in":"query","schema":{"type":"string","enum":["societati","pfa"],"default":"societati"},"description":"`societati` = numere J (SRL/SA); `pfa` = numere F (PFA/ÎI/ÎF)."}],"responses":{"200":{"description":"Fișier CSV (text/csv), max 1000 firme.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."}},"content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/firme-noi/alerts":{"get":{"tags":["Prospectare"],"summary":"Segmentele de firme noi la care ești abonat","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Lista abonamentelor.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Prospectare"],"summary":"Abonează-te la firmele noi dintr-un segment (digest zilnic pe email)","description":"Digestul pleacă în fiecare dimineață (după ora 7, ora României) și conține firmele înmatriculate în ultima zi încheiată din segment, plus link spre exportul CSV. O singură trimitere pe zi per abonament. Dezabonare cu un clic din orice email. Numărul de segmente e plafonat pe plan.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"judet","in":"query","schema":{"type":"string"},"description":"Slug-ul județului (ex. `cluj`). Lipsă = toată țara."},{"name":"caen","in":"query","schema":{"type":"string","pattern":"^\\d{2,6}$"},"description":"Prefix CAEN (ex. `62` prinde 6201, 6202…). Lipsă = toate domeniile."},{"name":"tip","in":"query","schema":{"type":"string","enum":["societati","pfa"],"default":"societati"}}],"responses":{"200":{"description":"Abonamentul exista deja.","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Abonament creat.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Plafonul de segmente al planului e atins.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Prospectare"],"summary":"Renunță la un segment","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Șters.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/companies/export.csv":{"get":{"tags":["Prospectare"],"summary":"Descarcă lista de prospectare ca CSV (primele 50 de rânduri gratuite, apoi 1 credit la 25)","description":"Aceleași filtre ca `/companies`, dar întoarce un CSV descărcabil (max 500 firme, cele mai mari după cifra de afaceri) — lista de lead-uri pentru o echipă de vânzări. Costul se calculează pe rândurile livrate: ceil(max(0, rânduri − 50) / 25) credite, deci 500 de rânduri = 18 credite, la fel pe sesiune și pe cheie. Același export (aceleași filtre și același `limit`) repetat în 24 de ore nu se taxează a doua oară. Fără date de contact/reprezentanți. Revânzarea în bloc e interzisă (ToS).","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"caen","in":"query","schema":{"type":"string","pattern":"^\\d{2,6}$"},"description":"Cod CAEN sau prefix."},{"name":"county","in":"query","schema":{"type":"string"},"description":"Județ (diacriticele nu contează)."},{"name":"state","in":"query","schema":{"type":"string","enum":["active","insolvent"]}},{"name":"vat","in":"query","schema":{"type":"string","enum":["true","false"]}},{"name":"minTurnover","in":"query","schema":{"type":"number","minimum":0,"maximum":1000000000000000}},{"name":"minEmployees","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000000}},{"name":"legalForm","in":"query","schema":{"type":"string"},"description":"Forma juridică, exact (SRL, SA, PFA, II, IF, AF, PF, SNC…)."},{"name":"locality","in":"query","schema":{"type":"string"},"description":"Localitatea (ex. Cluj-Napoca) — diacriticele nu contează."},{"name":"address","in":"query","schema":{"type":"string","minLength":3},"description":"Text din adresa sediului (stradă / cod poștal). ONRC abreviază — caută partea distinctivă."},{"name":"localityType","in":"query","schema":{"type":"string","enum":["urban","rural"]},"description":"Mediul: urban (municipii, orașe, sectoare) sau rural (comune, sate). Localitățile fără prefix recunoscut nu intră în niciuna."},{"name":"finYear","in":"query","schema":{"type":"integer","minimum":2008,"maximum":2026},"description":"Anul de bilanț pe care se aplică pragurile financiare (cifră de afaceri, angajați, evoluție). Implicit: ultimul bilanț al fiecărei firme, dar numai dacă e din ultimul an fiscal publicat sau din cel dinaintea lui; firmele cu bilanț mai vechi nu trec pragurile."},{"name":"turnoverGrowthPct","in":"query","schema":{"type":"number","minimum":-10000,"maximum":10000},"description":"Evoluția cifrei de afaceri față de anul precedent, în %: pozitiv = creștere minimă, negativ = scădere minimă."},{"name":"efactura","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"Înscrisă în RO e-Factura."},{"name":"inactive","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"Declarată inactivă fiscal de ANAF."},{"name":"registeredAfter","in":"query","schema":{"type":"string","format":"date"},"description":"Înmatriculată la/după data asta (YYYY-MM-DD, între 1900 și anul viitor)."},{"name":"registeredBefore","in":"query","schema":{"type":"string","format":"date"},"description":"Înmatriculată până la data asta (YYYY-MM-DD, între 1900 și anul viitor)."},{"name":"maxTurnover","in":"query","schema":{"type":"number","minimum":0,"maximum":1000000000000000},"description":"Cifra de afaceri maximă (lei) — benzi de mărime; 0 = firme fără cifră de afaceri în bilanț."},{"name":"maxEmployees","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000000},"description":"Numărul maxim de angajați; 0 = firme fără angajați în bilanț."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":500},"description":"Câte rânduri să aibă fișierul. `limit=50` e varianta gratuită. Peste 500 = 400, nu o tăiere."}],"responses":{"200":{"description":"Fișier CSV (text/csv), max 500 firme.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Cereri permise per fereastră."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Cereri rămase în fereastra curentă."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Epoch (secunde) când se eliberează fereastra."},"X-Fs-Export-Rows":{"description":"Câte rânduri are fișierul.","schema":{"type":"integer"}},"X-Fs-Credits-Charged":{"description":"Creditele debitate (0 până la 50 de rânduri sau la re-descărcare în 24 de ore).","schema":{"type":"integer"}},"X-Fs-Credits-Remaining":{"description":"Cât a mai rămas: plafonul lunii + soldul care nu expiră.","schema":{"type":"integer"}}},"content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Plafonul lunar rămas și soldul, adunate, nu acoperă fișierul. Corpul are `cost`, `remaining` (plafon + sold), `rows` și `freeRows` (50); nu se debitează nimic. O navigare de browser primește o pagină cu varianta gratuită.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Doar pe sesiunea de cont (cookie), nu pe cheia Bearer: cererea a pornit dintr-un link de pe alt site (`Sec-Fetch-Site: cross-site`, fără `X-Fs-Session`). Nu se consumă nimic. Eroarea e `cross_site_request`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/watchlist":{"get":{"tags":["Monitorizare"],"summary":"Firmele urmărite (re-verificate zilnic)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Lista de urmărire, cu numitorul plafonului.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}},"count":{"type":"integer"},"limit":{"type":"integer","nullable":true,"description":"25 pe contul gratuit; null = cont fără plafon."},"plan":{"type":"string"}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Monitorizare"],"summary":"Adaugă o firmă în lista de urmărire","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cui"],"properties":{"cui":{"type":"string","pattern":"^\\d{1,10}$"}}}}}},"responses":{"201":{"description":"Adăugată (sau era deja în listă)."},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Lista e plină — error: watchlist_full, cu count, limit și plan. Contul gratuit urmărește până la 25 de firme; scoate una cu DELETE /api/v1/watchlist/{cui}.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/watchlist/{cui}":{"delete":{"tags":["Monitorizare"],"summary":"Scoate o firmă din lista de urmărire","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"cui","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{1,10}$"},"description":"CUI-ul firmei (doar cifre, fără prefix RO)."}],"responses":{"200":{"description":"Scoasă."},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks":{"post":{"tags":["Monitorizare"],"summary":"Creează un webhook (notificare push la schimbare de verdict)","description":"Se declanșează la re-verificarea zilnică a firmelor din watchlist, când verdictul se schimbă. Livrare semnată HMAC (header X-Firmoscop-Signature: sha256=HMAC(`${timestamp}.${body}`)), cu retry exponențial și dead-letter. Secretul e afișat o singură dată. Pune webhook-ul după confirmarea adresei contului: prima confirmare dezactivează webhook-urile făcute înainte; o acreditare care nu mai e validă la scriere primește 401 `credential_revoked`.","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"URL public http(s)."},"events":{"type":"array","items":{"type":"string","enum":["verdict.changed"]},"description":"Implicit: verdict.changed."}}}}}},"responses":{"201":{"description":"Webhook creat (secret afișat o singură dată).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreated"}}}},"400":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Tokenul OAuth (`fso_…`) al unei aplicații conectate, de ex. ChatGPT sau Claude: nu gestionează contul. Merge cu cheia API sau din cont. Eroarea e `insufficient_scope`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Monitorizare"],"summary":"Listează webhook-urile (fără secret)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"responses":{"200":{"description":"Webhook-urile tale.","content":{"application/json":{"schema":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Tokenul OAuth (`fso_…`) al unei aplicații conectate, de ex. ChatGPT sau Claude: nu gestionează contul. Merge cu cheia API sau din cont. Eroarea e `insufficient_scope`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks/{id}":{"delete":{"tags":["Monitorizare"],"summary":"Șterge un webhook","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Șters."},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Tokenul OAuth (`fso_…`) al unei aplicații conectate, de ex. ChatGPT sau Claude: nu gestionează contul. Merge cu cheia API sau din cont. Eroarea e `insufficient_scope`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"tags":["Monitorizare"],"summary":"Jurnalul de livrări al unui webhook (dashboard)","security":[{"bearerAuth":[]},{"cookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Ultimele livrări (status, încercări, cod, eroare).","content":{"application/json":{"schema":{"type":"object","properties":{"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}}}}}},"401":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Tokenul OAuth (`fso_…`) al unei aplicații conectate, de ex. ChatGPT sau Claude: nu gestionează contul. Merge cu cheia API sau din cont. Eroarea e `insufficient_scope`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/stats":{"get":{"tags":["Meta"],"summary":"Statistici publice ale indexului (semnal de acoperire/prospețime)","responses":{"200":{"description":"Numărul de firme, reprezentanți și rânduri financiare (estimate din statisticile bazei, rotunjite la trei cifre semnificative), firmele în insolvență (numărate zilnic) și verificările ANAF din ultimele 24 de ore.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}}},"503":{"description":"Eroare — corp JSON { error, message } în limbaj natural.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/mcp":{"post":{"tags":["Meta"],"summary":"Endpoint MCP (streamable HTTP, stateless)","description":"Tools: cauta_firma(query), profil_firma(cui), verifica_firma(cui), bilanturi_firma(cui), datorii_anaf(cui), contracte_publice(cui, page), istoric_firma(cui), firme_legate(cui), compara_firme(cuiuri[2–5]), cauta_cod_caen(query), prospecteaza_firme(caen/county/minTurnover/…; 1 credit la 25 de firme), urmareste_firma(cui), firme_urmarite(), opreste_urmarirea(cui), contul_meu(), despre_firmoscop(). JSON-RPC 2.0.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"JSON-RPC 2.0 / MCP."},"401":{"description":"Cheie lipsă/invalidă."},"429":{"description":"Rate limit (30/min per cheie)."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Cheia API `fk_…`."},"cookieAuth":{"type":"apiKey","in":"cookie","name":"fs_session","description":"Sesiune de browser (oameni)."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"cod scurt, ex. rate_limited"},"message":{"type":"string","description":"explicație în limbaj natural"}}},"SearchHit":{"type":"object","properties":{"cui":{"type":"string"},"name":{"type":"string"},"county":{"type":"string","nullable":true},"locality":{"type":"string","nullable":true},"registrationState":{"type":"string","nullable":true},"similarity":{"type":"number"}}},"SuggestHit":{"type":"object","properties":{"cui":{"type":"string"},"name":{"type":"string"},"county":{"type":"string","nullable":true},"locality":{"type":"string","nullable":true},"registrationState":{"type":"string","nullable":true},"similarity":{"type":"number"},"stateBadge":{"type":"object","nullable":true,"description":"Starea din registru, gata de afișat. null = firmă în funcțiune. Roșu = firma a încetat să existe (radiată, dizolvată); galben = firma există, dar are o stare care cere atenție (de ex. o procedură de insolvență).","properties":{"label":{"type":"string","example":"dizolvată prin fuziune"},"tone":{"type":"string","enum":["rosu","galben"]}}}}},"FinancialYear":{"type":"object","properties":{"year":{"type":"integer"},"turnover":{"type":"integer","nullable":true},"netResult":{"type":"integer","nullable":true},"totalDebt":{"type":"integer","nullable":true,"description":"Datorii totale (bilanțul public MF nu separă curente de termen lung)."},"equity":{"type":"integer","nullable":true},"employees":{"type":"integer","nullable":true},"currentAssets":{"type":"integer","nullable":true,"description":"Active circulante (I2). Poate lipsi pentru bilanțurile ingestate mai devreme."},"fixedAssets":{"type":"integer","nullable":true,"description":"Active imobilizate (I1)."},"grossProfit":{"type":"integer","nullable":true,"description":"Profit/pierdere brut(ă) (I16/I17)."},"subscribedCapital":{"type":"integer","nullable":true,"description":"Capital subscris vărsat (I11)."}}},"FinancialHealth":{"type":"object","description":"Scor de bonitate determinist, explicabil.","properties":{"klass":{"type":"string","enum":["Solidă","Stabilă","Fragilă","Critică"],"nullable":true},"score":{"type":"integer","nullable":true,"description":"0–100"}}},"CreditGuidance":{"type":"object","description":"Recomandare acțională de creditare, derivată din bonitate + semnale dure (insolvență, inactivitate fiscală). Orientativă, nu o garanție.","properties":{"stance":{"type":"string","enum":["termen","avans-partial","doar-avans"],"description":"Poziția recomandată față de un termen de plată."},"termDays":{"type":"integer","nullable":true,"description":"Termenul net sugerat, în zile. null = fără cont deschis (doar avans)."},"exposureRon":{"type":"integer","nullable":true,"description":"Plafonul de expunere orientativ (RON). null când nu se recomandă credit."},"summary":{"type":"string","description":"Propoziție acțională, gata de afișat."}}},"CompanyProfile":{"type":"object","properties":{"cui":{"type":"string"},"name":{"type":"string"},"registrationNumber":{"type":"string","nullable":true},"county":{"type":"string","nullable":true},"locality":{"type":"string","nullable":true},"registeredAddress":{"type":"string","nullable":true,"description":"Adresa completă a sediului social (ONRC primar, ANAF fallback)."},"registeredAt":{"type":"string","format":"date","nullable":true},"ageYears":{"type":"integer","nullable":true},"caenCode":{"type":"string","nullable":true},"caenLabel":{"type":"string","nullable":true},"registrationState":{"type":"string","nullable":true},"inInsolvency":{"type":"boolean","description":"Firma e într-o PROCEDURĂ de insolvență/faliment/reorganizare/lichidare. NU include radierea — vezi struckOff."},"struckOff":{"type":"boolean","description":"Firma e radiată din registrul comerțului, deci nu mai există juridic. Raportat separat: radierea e de obicei sfârșit normal de viață, nu o procedură în curs."},"dissolved":{"type":"boolean","description":"Firma a încetat să existe FĂRĂ insolvență — absorbită prin fuziune/divizare, ori dizolvată de drept. Distinct de insolvență și de radiere."},"stateKind":{"type":"string","enum":["radiata","dizolvata-fuziune","dizolvata","faliment","reorganizare","lichidare","insolventa","activa"],"description":"Starea reală din registru, normalizată. Sursa unică a etichetei afișate; „activa\" înseamnă fără niciun semnal de stare."},"vatRegistered":{"type":"boolean","nullable":true},"fiscallyInactive":{"type":"boolean","nullable":true},"largeTaxpayer":{"type":"boolean","nullable":true,"description":"Mare contribuabil (administrat de DGAMC) — semnal de mărime."},"ownershipForm":{"type":"string","nullable":true,"description":"Forma de proprietate ANAF (ex. capital privat autohton/străin/de stat)."},"website":{"type":"string","nullable":true},"financials":{"type":"array","items":{"$ref":"#/components/schemas/FinancialYear"}},"health":{"$ref":"#/components/schemas/FinancialHealth"},"credit":{"$ref":"#/components/schemas/CreditGuidance"},"representatives":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"role":{"type":"string","nullable":true},"otherCompanies":{"type":"integer","description":"La câte ALTE firme apare acest NUME. Potrivirea e pe șir de caractere, fără identificator de persoană — pot fi mai mulți oameni diferiți."},"otherInsolvent":{"type":"integer","description":"Câte dintre ele sunt într-o PROCEDURĂ de insolvență/faliment/reorganizare. Nu include radierile."},"otherStruckOff":{"type":"integer","description":"Câte dintre ele sunt radiate. Raportat separat: radierea e de obicei sfârșit normal de viață, nu un semnal de risc."}}}},"publicContracts":{"type":"object","nullable":true,"properties":{"count":{"type":"integer"},"totalValue":{"type":"integer","description":"Suma contractelor REALE (de sine stătătoare + subsecvente), în lei. Plafoanele de acord-cadru NU sunt incluse — sunt valoarea maximă a acordului, nu bani încasați. La contractele câștigate în asociere, valoarea contractului e împărțită egal între câștigători (sursa nu spune cât revine fiecăruia)."},"frameworkCount":{"type":"integer","description":"Câte locuri pe acorduri-cadru are firma."},"frameworkCeiling":{"type":"integer","description":"Plafonul cumulat al acordurilor-cadru, în lei. NU se însumează cu totalValue — e o limită superioară partajată, nu venit."},"sharedCount":{"type":"integer","description":"Câte dintre contracte au fost câștigate în asociere cu alte firme; la ele, partea firmei e estimată prin împărțire egală."},"lastDate":{"type":"string","nullable":true},"topAuthorities":{"type":"array","items":{"type":"string"}}}},"connections":{"type":"object","nullable":true,"description":"Firme la care apar persoane cu ACELAȘI NUME ca reprezentanții acestei firme. Nu e un grup corporativ confirmat.","properties":{"total":{"type":"integer"},"insolvent":{"type":"integer","description":"În procedură de insolvență."},"struckOff":{"type":"integer","description":"Radiate. Separat de insolvență."},"commonNameWarning":{"type":"boolean"}}},"dataAsOf":{"type":"string","format":"date-time","nullable":true,"description":"Cea mai recentă citire a firmei: anafCheckedAt dacă există, altfel data ONRC. Pentru data fiecărei surse, vezi câmpurile de mai jos."},"anafCheckedAt":{"type":"string","format":"date-time","nullable":true,"description":"Când am citit ultima oară firma la ANAF. Indexul trece prin toate firmele în aproximativ o săptămână; o verificare (GET /api/v1/verify/{cui}) care citește sursele live o aduce la zi."},"onrcAsOf":{"type":"string","format":"date","nullable":true,"description":"Data snapshotului ONRC (Registrul Comerțului) din care vin datele de registru. ONRC publică lunar. null pentru firmele pe care ONRC nu le-a publicat încă."}}},"Connections":{"type":"object","properties":{"cui":{"type":"string"},"name":{"type":"string"},"connectedCompanies":{"type":"array","items":{"type":"object","properties":{"cui":{"type":"string"},"name":{"type":"string"},"registrationState":{"type":"string","nullable":true},"insolvent":{"type":"boolean","description":"Procedură de insolvență în curs."},"struckOff":{"type":"boolean","description":"Radiată din registru."},"viaPerson":{"type":"string"},"role":{"type":"string","nullable":true}}}},"totalConnected":{"type":"integer"},"insolventCount":{"type":"integer","description":"În procedură de insolvență. NU include radierile — acestea sunt ~44% din registru și ar îneca semnalul."},"struckOffCount":{"type":"integer","description":"Radiate din registru."},"commonNameWarning":{"type":"boolean","description":"Numele apare la peste 15 firme — prag peste percentila 99 a distribuției reale, deci aproape sigur persoane diferite."}}},"VerifyReport":{"type":"object","properties":{"cui":{"type":"string"},"verdict":{"type":"string","enum":["verde","galben","rosu"]},"recommendation":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"severity":{"type":"string","enum":["critical","warning","info","positive"]},"label":{"type":"string"},"detail":{"type":"string","nullable":true},"source":{"type":"string","description":"sursa oficială"},"date":{"type":"string","nullable":true,"description":"data semnalului"}}}},"sources":{"type":"array","items":{"type":"object"},"description":"Ce surse au răspuns și cu ce dată."},"artifactUrl":{"type":"string","nullable":true,"description":"Raport uman partajabil."},"creditsRemaining":{"type":"integer"}}},"Stats":{"type":"object","properties":{"companies":{"type":"integer"},"insolvent":{"type":"integer"},"representatives":{"type":"integer"},"financialRows":{"type":"integer"},"anafFreshLast24h":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"Contract":{"type":"object","properties":{"authority":{"type":"string","nullable":true},"object":{"type":"string","nullable":true},"valueRon":{"type":"integer","nullable":true},"contractDate":{"type":"string","format":"date","nullable":true},"sourceYear":{"type":"integer"}}},"VatStatus":{"type":"object","properties":{"cui":{"type":"string"},"vatRegistered":{"type":"boolean","nullable":true},"fiscallyInactive":{"type":"boolean","nullable":true},"efacturaRegistered":{"type":"boolean","nullable":true},"asOf":{"type":"string","format":"date-time","nullable":true}}},"ViesResult":{"type":"object","properties":{"countryCode":{"type":"string"},"vatNumber":{"type":"string"},"valid":{"type":"boolean"},"requestDate":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"address":{"type":"string","nullable":true}}},"Caen":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"}}},"FiscalDebt":{"type":"object","properties":{"cui":{"type":"string"},"hasDebt":{"type":"boolean"},"category":{"type":"string","enum":["mari","mijlocii","mici"]},"totalOwed":{"type":"integer","description":"Principal + accesorii (lei), fără partea contestată."},"totalPrincipal":{"type":"integer"},"totalAccessory":{"type":"integer"},"totalContested":{"type":"integer"},"byBudget":{"type":"object","properties":{"stat":{"type":"integer"},"asigurariSociale":{"type":"integer"},"somaj":{"type":"integer"},"sanatate":{"type":"integer"}}},"asOf":{"type":"string","format":"date","nullable":true}}},"HistoryEvent":{"type":"object","properties":{"field":{"type":"string","enum":["name","registration_state","county","locality","caen_code","registration_number"]},"oldValue":{"type":"string","nullable":true},"newValue":{"type":"string","nullable":true},"oldLabel":{"type":"string","nullable":true,"description":"Denumire CAEN rezolvată (doar caen_code)."},"newLabel":{"type":"string","nullable":true},"detectedAt":{"type":"string","format":"date-time"}}},"Webhook":{"type":"object","properties":{"id":{"type":"integer"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"WebhookCreated":{"type":"object","properties":{"id":{"type":"integer"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"secret":{"type":"string","description":"Secretul de semnare HMAC — afișat o singură dată."}}},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"integer"},"eventType":{"type":"string"},"status":{"type":"string","enum":["pending","delivered","dead"]},"attempts":{"type":"integer"},"lastCode":{"type":"integer","nullable":true},"lastError":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"deliveredAt":{"type":"string","format":"date-time","nullable":true}}},"StatBucket":{"type":"object","description":"O categorie din statistica unei selecții. Valorile financiare sunt `null` când nicio firmă din categorie n-are bilanț cunoscut — „nu știm\" nu se raportează ca zero.","properties":{"key":{"type":"string","description":"Cheia stabilă a categoriei."},"label":{"type":"string","description":"Eticheta în română."},"companies":{"type":"integer"},"turnover":{"type":"integer","nullable":true,"description":"Suma cifrelor de afaceri cunoscute (lei)."},"medianTurnover":{"type":"integer","nullable":true},"employees":{"type":"integer","nullable":true},"netResult":{"type":"integer","nullable":true},"sharePct":{"type":"number","nullable":true,"description":"Ponderea în selecție."},"nationalSharePct":{"type":"number","nullable":true,"description":"Ponderea aceleiași categorii în toată baza. `null` = nemăsurată, NU zero."}}},"CompanyListRow":{"type":"object","description":"Rând de prospectare — doar date de persoană juridică.","properties":{"cui":{"type":"string"},"name":{"type":"string"},"county":{"type":"string","nullable":true},"locality":{"type":"string","nullable":true},"caenCode":{"type":"string","nullable":true},"caenLabel":{"type":"string","nullable":true},"registrationState":{"type":"string","nullable":true},"vatRegistered":{"type":"boolean","nullable":true},"registeredAt":{"type":"string","format":"date","nullable":true}}}}}}