oneapi
Sign in
Business v1 / Achiziții publice

Authority profile

The procurement summary of a contracting authority (by tax id): contract count, total value and the top 5 suppliers. 404 if it does not appear as an authority.

GET
https://oneapi.ro/api/business/v1/autoritati/{cui}

Path parameters

NameTypeDescriptionExample
cuirequired string Tax identification number of the contracting authority, without the RO prefix.

Query parameters

This route accepts no query parameters.

How it behaves

  • "Has none" is an answer, not an error. When the company exists but has nothing the route asks for, the response is 200 with data: null and the reason in meta.fara_date. 404 only means the company (tax ID) does not exist — that way you can tell the two apart and cache the negative answer.
  • Not every contract has a declared value. Measured on 4 October 2026, across all 17.39 million rows: it is missing on 10.8% of contracts (312,587 rows), and almost never on direct awards (47 out of 13.68 million) or notices (52 out of 811,033). Any total is therefore the total of the rows that DO carry a figure, not of the whole set — for tip=contracte, of nine tenths of them. Contract counts cover all rows. The val_min/val_max filters work on the RON value, so they exclude rows without one.
  • The profile of a contracting authority by tax ID: total awarded plus top suppliers. The reverse view of a company's procurement.
  • Two names, and that is deliberate. identitate.denumire is the official one, from the Ministry of Finance; denumire_seap is the name typed into the notice. They can differ a lot: tax ID 930 appears in SEAP as „Institutul National de Cercetare Dezvoltare pentru Mecatronica si Tehnica Masurarii-INCDMTM", and officially as „INSTITUTUL NATIONAL DE CERCETARE-DEZVOLTARE PENTRU MECATRONICA SI TEHNICA MASURARII - I.N.C.D.M.T.M. BUCURESTI". For display use denumire, which picks for you.
  • 3.4% of authorities have no official identity. It is not an oversight but a real gap in the tax data, and the route says so explicitly through identitate_lipsa instead of silently leaving the address empty. Identity is returned only for legal entities: for the few authorities registered as natural persons, the personal address and phone never leave the route.

What it is for

  • Preparing a commercial approach to an institution: what it buys, and from whom.
  • Analysing an authority's dependence on a small number of suppliers.
  • The reverse perspective, when you already have the supplier's profile.

Response structure

FieldTypeDescription
data.cui integer The tax ID.
data.denumire string The name to display: the official one where we have it, otherwise the one from the notice.
data.denumire_seap string The name as it appears in SEAP notices — the most frequent variant. It often differs from the official one, sometimes a lot, because whoever publishes the notice types it by hand: 6.8% of authorities appear under more than one name, one under 23. Kept in the response so you can still find an authority by the name used in the notice.
data.identitate object The official identity, from the Ministry of Finance taxpayer records. null when the tax ID has no match there — see identitate_lipsa.
data.identitate.denumire string The official name.
data.identitate.adresa object The registered address: street, number, building, staircase, floor, flat, sector, locality, county, postcode. Fields the source leaves empty come back null.
data.identitate.adresa.strada string
data.identitate.adresa.numar string Number of items counted.
data.identitate.adresa.bloc null
data.identitate.adresa.scara null
data.identitate.adresa.etaj null
data.identitate.adresa.apartament null
data.identitate.adresa.sector null Institutional or economic sector.
data.identitate.adresa.localitate string
data.identitate.adresa.judet string The county the value refers to.
data.identitate.adresa.cod_postal string
data.identitate.stare string The tax status (INREGISTRAT, RADIAT, TRANSFER(SOSIRE) and so on).
data.identitate.data_stare string The date that status took effect.
data.identitate.reg_com null The Trade Register number, where one exists. Public institutions do not register there, so it is null for them.
data.identitate.data_inregistrare string The date of tax registration.
data.identitate.data_radiere null The date of deregistration, if it happened.
data.identitate.tip_contribuabil string Always PJ: the route returns an identity only for legal entities.
data.identitate.an integer The year of the snapshot the identity data comes from. An address you cannot date is an address you cannot read.
data.identitate_lipsa null Only when identitate is null: why it is missing. denumire is then the name from the SEAP notice, and the address is unknown.
data.are_fisa boolean true if the entity is also in the company register, so asking /firme/{cui} is worth it. For most authorities it is false: public institutions do not register with the Trade Register.
data.total.nr_contracte integer The number of contracts.
data.total.valoare_ron number The value, in RON.
data.top_furnizori[].castigator string The winning company.
data.top_furnizori[].cui integer The tax ID.
data.top_furnizori[].cui_romanesc boolean
data.top_furnizori[].nr_contracte integer The number of contracts.
data.top_furnizori[].valoare_ron number The value, in RON.
meta.fara_date string Only when the response is empty: why there is no data (for instance "Firma nu are cod LEI înregistrat la GLEIF."). Absent when data is filled in.
meta.fara_date_cod string The short, STABLE word for the reason, for clients that branch on it in code: fara_date is prose and may be rephrased, this is not.

Response examples

GEThttps://oneapi.ro/api/business/v1/autoritati/4547125
{
    "data": {
        "cui": 4547125,
        "denumire": "INSTITUTUL ONCOLOGIC PROF.DR.I.CHIRICUTA CLUJ-NAPOCA",
        "denumire_seap": "Institutul Oncologic Prof. Dr. I. Chiricuta Cluj-Napoca",
        "identitate": {
            "denumire": "INSTITUTUL ONCOLOGIC PROF.DR.I.CHIRICUTA CLUJ-NAPOCA",
            "adresa": {
                "strada": "Republicii",
                "numar": "34-36",
                "bloc": null,
                "scara": null,
                "etaj": null,
                "apartament": null,
                "sector": null,
                "localitate": "Cluj-Napoca",
                "judet": "CLUJ",
                "cod_postal": "400015"
            },
            "stare": "MODIFICARE PUBLICI",
            "data_stare": "1993-08-24",
            "reg_com": null,
            "data_inregistrare": "2013-11-21",
            "data_radiere": null,
            "tip_contribuabil": "PJ",
            "an": 2026
        },
        "identitate_lipsa": null,
        "are_fisa": false,
        "total": {
            "nr_contracte": 44401,
            "valoare_ron": 6134746820.27
        },
        "top_furnizori": [
            {
                "castigator": "ALLIANCE HEALTHCARE ROMANIA",
                "cui": 8955860,
                "cui_romanesc": true,
                "nr_contracte": 2064,
                "valoare_ron": 1296610831.62
            }
        ]
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitThe tax ID [{cui}] appears neither as a contracting authority nor as a company in the register.
422validareThe route takes no parameters apart from lang: any other parameter returns 422 instead of being ignored.
429cota_depasitaThe plan's monthly quota has been exceeded (see Retry-After).

All errors share the same shape. eroare.cod is stable and is the value you should branch on in code — not the text in mesaj, which may change.

{
    "eroare": {
        "cod": "validare",
        "mesaj": "The route takes no parameters apart from lang: any other parameter returns 422 instead of being ignored.",
        "detalii": {
            "cui": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}