oneapi
Autentificare
Business v1 / Achiziții publice

Achiziţii după obiect (semantic)

Descrii în text liber ce se cumpără (ex. „servicii de curățenie") și primești contractele din CPV-ul
potrivit ca SENS. Sub capotă: text potrivit semantic la codul CPV (vezi /cpv/potriveste), apoi se
listează contractele cu acel cod. Răspunsul arată CPV-ul detectat + alternativele. Filtre opționale:
?an=, ?autoritate_cui=, ?castigator_cui=, ?val_min=, ?val_max=. Paginat.

GET
https://oneapi.ro/api/business/v1/achizitii/dupa-obiect

Parametri de interogare

NumeTipDescriereValori acceptate
anopțional integer | null Filtru opţional pe anul contractului. ex. 2024
autoritate_cuiopțional integer | null CUI-ul autorităţii contractante, ca filtru peste potrivirea semantică. 1
castigator_cuiopțional integer | null CUI-ul câştigătorului, ca filtru peste potrivirea semantică. 1
textopțional string | null Descrierea obiectului contractului (obligatoriu). Ex.: „servicii de curăţenie". ex. servicii de curatenieex. reparatii drumuriex. servicii medicale
tipopțional string | null Tipul procedurii: contracte, directe sau notificari. contractedirectenotificari
val_maxopțional number | null Valoarea maximă a contractului, în lei (valoare_ron). 0
val_minopțional number | null Valoarea minimă a contractului, în lei (valoare_ron). 0

Cum se comportă

  • Nu toate contractele au valoare declarată. Măsurat pe 4 octombrie 2026, pe toate cele 17,39 milioane de rânduri: lipseşte la 10,8% din contracte (312.587 rânduri), şi aproape niciodată la achiziţii directe (47 din 13,68 milioane) sau la notificări (52 din 811.033). Orice sumă e deci a rândurilor care AU cifră, nu a întregului — la tip=contracte, a nouă zecimi din ele. Numărul de contracte le acoperă pe toate. Filtrele val_min/val_max lucrează pe valoarea în lei, deci exclud rândurile fără valoare.
  • Descrii în text liber obiectul contractului (ex. „servicii de curăţenie") şi primeşti contractele din CPV-ul potrivit ca sens — nu pe cuvinte. Compune potrivirea semantică text→CPV (vezi /cpv/potriveste) cu listarea contractelor pe acel cod.
  • Răspunsul arată explicit CPV-ul detectat (cu scor) şi alternativele. Se pot adăuga filtre: ?an=, ?autoritate_cui=, ?castigator_cui=, ?tip=, ?val_min=, ?val_max=. ?text= e obligatoriu.
  • Se filtrează pe CPV-ul cu scorul cel mai mare. Pentru control fin, foloseşte /cpv/potriveste şi apoi /achizitii/cauta?cpv=.
  • Fiecare contract apare o dată: publicările mai vechi ale unui contract republicat de SEAP şi valoarea contractului repetată pe alte loturi nu se listează (le deschide /achizitii/{id}). valoare.ron e valoarea declarată; valoare.atribuita_ron, partea acestui câştigător, e cea din sume.
  • Sumele numără fiecare contract o singură dată şi cu partea fiecărui câştigător. SEAP republică anunţul de atribuire la fiecare actualizare (1,19 M de rânduri de contracte sunt republicări), repetă valoarea contractului pe fiecare lot (0,52 M) şi pune valoarea ÎNTREGULUI acord-cadru pe fiecare câştigător (228.000 de rânduri). Citite brut, contractele 2021–2026 însumau 7.059 de miliarde de lei, iar Farmexim 248 de miliarde; corectat, 1.212 miliarde şi 14,6. Valorile imposibile (un simulator de trafic aerian de 125,9 miliarde, lactate de 1,59 miliarde la un DGASPC) nu intră în sume.

La ce folosește

  • Găsirea contractelor pe un tip de achiziţie descris în cuvinte.
  • Analiză de piaţă pe o categorie de achiziţii.
  • Monitorizarea unui domeniu de contracte publice.

Structura răspunsului

CâmpTipDescriere
data[].id integer Identificatorul contractului. Deschide-l cu /achizitii/{id}, unde e anunţul SEAP întreg (număr anunţ, criteriu de atribuire, finanţare din fonduri UE).
data[].an integer | null Anul de referinţă.
data[].data_contract string | null Data contractului.
data[].autoritate.nume string | null Denumirea autorităţii contractante.
data[].autoritate.cui integer | null Codul fiscal al autorităţii contractante.
data[].castigator.nume string | null Denumirea firmei câştigătoare.
data[].castigator.cui integer | null Codul fiscal al câştigătorului. ⚠️ SEAP scrie în acelaşi câmp şi identificatori străini: din 179.814 identificatori distincţi, 8.656 (4,8%) nu sunt CUI-uri româneşti valide — vezi cui_romanesc.
data[].obiect string | null Obiectul contractului, aşa cum a fost publicat.
data[].cpv string | null Codul CPV al obiectului.
data[].cpv_denumire string | null Denumirea oficială a codului CPV, din nomenclator. E descrierea de rezervă când autoritatea n-a scris nimic folositor în obiect — 4.582 de achiziţii directe au acolo chiar cuvântul „directa". null la cele 11 coduri (din 8.628) care nu există în nomenclatorul CPV 2008.
data[].valoare.ron number | null Valoarea contractului, în lei.
data[].valoare.eur number | null Valoarea contractului, în euro.
data[].valoare.moneda_originala string | null Moneda în care a fost publicat contractul.
data[].valoare.atribuita_ron number | null Ce-i revine acestui câştigător: valoarea declarată împărţită la câştigătorii aceluiaşi acord-cadru; null dacă valoarea declarată e imposibilă. Pe ea se fac toate sumele.
data[].valoare.castigatori integer Câţi câştigători împart acelaşi contract (acord-cadru); 1 de obicei.
data[].valoare.suspecta boolean true dacă valoarea declarată e imposibilă (de peste 10 ori estimarea procedurii ori de mii de ori peste contractele obişnuite ale autorităţii); rămâne afişată, dar nu intră în sume.
data[].tip string | null Tipul.
data[].procedura string | null Tipul procedurii de atribuire.
meta.paginare.pagina integer Pagina curentă.
meta.paginare.per_pagina integer Rezultate pe pagină.
meta.paginare.total integer Total rezultate.
meta.paginare.pagini integer Număr de pagini.
data[].castigator.cui_romanesc boolean true dacă valoarea validează ca CUI românesc (inclusiv cifra de control). false înseamnă doar că NU e un CUI românesc — de regulă un identificator străin (1.257 au peste 10 cifre) sau un cod cu cifra de control greşită (7.392). Nu pretindem că ştim a cui e. Util înainte de /firme/{cui}: cu false, firma nu va fi găsită acolo.

Exemple de răspuns

GEThttps://oneapi.ro/api/business/v1/achizitii/dupa-obiect?text=servicii+de+curatenie&per_pagina=3
{
    "data": [
        {
            "id": 57979911,
            "an": 2026,
            "data_contract": "2026-03-31",
            "autoritate": {
                "nume": "LICEUL TEORETIC GH.SINCAI",
                "cui": 4736434
            },
            "castigator": {
                "nume": "TRANSILVANIA CLEANING SOLUTIONS S.R.L.",
                "cui": 48188732,
                "cui_romanesc": true
            },
            "obiect": "Servicii de curatenie perioada 01.01.2026-31.03.2026",
            "cpv": "90910000-9",
            "cpv_denumire": "Servicii de curăţenie",
            "valoare": {
                "ron": 112352.52,
                "eur": null,
                "moneda_originala": null,
                "atribuita_ron": 112352.52,
                "castigatori": 1,
                "suspecta": false
            },
            "tip": "notificari",
            "procedura": "Servicii"
        }
    ],
    "meta": {
        "obiect": {
            "text": "servicii de curatenie",
            "cpv": {
                "cod": "90910000-9",
                "denumire": "Servicii de curăţenie",
                "scor": 0.8729719519615173
            },
            "alternative": [
                {
                    "cod": "90911100-7",
                    "denumire": "Servicii de curăţare a locuinţelor",
                    "scor": 0.7943454025490706
                }
            ]
        },
        "paginare": {
            "pagina": 1,
            "per_pagina": 3,
            "total": 16962,
            "pagini": 5654
        }
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422validareLipseşte parametrul text.
429cota_depasitaCota lunară a planului a fost depăşită (vezi Retry-After).
503mentenantaIndexul semantic CPV nu e construit, sau serviciul de embeddings e temporar indisponibil.

Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.

{
    "eroare": {
        "cod": "validare",
        "mesaj": "Lipseşte parametrul text.",
        "detalii": {
            "an": [
                "Valoarea trimisă nu respectă regula parametrului."
            ]
        }
    }
}