oneapi
Sign in
Business v1 / Firme

Entity by tax ID

Everything we know about a tax ID, whether or not it is a commercial company: the official identity from the Ministry of Finance, the ONRC profile when it is a company, ANAF tax status, financial statements, resolved location, the registers it appears in and public procurement in both roles.

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

Path parameters

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

Query parameters

This route accepts no query parameters.

How it behaves

  • ⚠️ Not the same as /firme/{cui}. That route queries the Trade Register, which holds only commercial companies. There are 611,818 entities with a tax ID that are not in it — associations, hospitals, parishes, foundations, schools, city halls — for which /firme/{cui} returns 404 even though we hold their name, address and registers. This route answers a different question: what do we know about this tax ID, across every source at once.
  • For a commercial company the two overlap almost completely: the ONRC profile appears in the firma block and e_firma is true. Companies are a special case here, not an exception.
  • Every block is null when its source holds nothing about the entity, and surse states exactly which ones answered. There is no "entity type" field: an association and a foundation look identical in the data, and "public institution" is written nowhere — instead of a verdict, we say what we know and where it came from.
  • 404 only when we know nothing at all. Eight sources are checked: taxpayers, ONRC, registers, tax status, financial statements, procurement (both as supplier and as contracting authority), EU funds, LEI. An entity known only from a balance sheet or a single public contract gets an answer, not a 404.
  • ⚠️ Includes authorised natural persons (identitate.tip_contrib = "PF"), with their name and address, exactly as published by the Ministry of Finance.
  • Contact details and the filing vector come from here, not from /firme. For an entity outside the Trade Register, identitate.contact and identitate.vector_fiscal are the only place they appear: /firme/{cui}/contact reads ANAF records, which hold zero rows for them, and /firme/{cui}/vector-fiscal first requires presence in the register. Measured across the 611,818: 249,288 phone numbers and 13,529 fax numbers readable as numbers, 155,979 non-empty filing vectors.

What it is for

  • Checking a counterparty that is not a commercial company: association, foundation, religious unit, school, hospital.
  • Resolving a tax ID found on a contract or an invoice without knowing in advance what kind of entity it belongs to.
  • Obtaining the location (county, administrative unit, locality) for entities that have no registered office in the Trade Register.

Response structure

All fields below live inside data.

FieldTypeDescription
cui integer The tax ID requested.
identitate object Official identity from Ministry of Finance data; null when the entity is not in the taxpayer records.
identitate.denumire string The name, exactly as the source publishes it.
identitate.tip_contrib string Taxpayer type: PJ (legal person) or PF (authorised natural person).
identitate.tip_unitate string Head office, branch, working point, representative office…
identitate.adresa object The address, field by field; empty keys are omitted.
identitate.adresa.judet string The county the value refers to.
identitate.adresa.localitate string
identitate.adresa.strada string
identitate.adresa.numar string Number of items counted.
identitate.adresa.cod_postal string
identitate.stare string Tax registration status, exactly as the ministry writes it (e.g. INREGISTRAT).
identitate.data_stare string The date the status above took effect.
identitate.reg_com null The trade register number, where the entity has one; most non-commercial entities do not.
identitate.act_autorizare string The instrument that authorised the entity — court ruling, licence, decree. For associations and foundations it is often the only founding document we hold.
identitate.data_inregistrare string The date of tax registration.
identitate.data_radiere null The date of tax deregistration; null while the entity still exists.
identitate.cui_parinte null The parent entity's tax ID, for a subordinate unit.
identitate.tva boolean VAT-registered, according to the Ministry of Finance snapshot.
identitate.contact object The declared phone and fax in canonical form; null when neither value can be read as a number. ⚠️ For entities outside the Trade Register this is the ONLY contact we hold: /firme/{cui}/contact reads ANAF records, which hold nothing about them.
identitate.contact.telefon string
identitate.contact.fax null
identitate.vector_fiscal array Active filing obligations (e.g. IMP100, CONT412). An empty list means it has none; null means we do not hold the vector — the two are not the same.
identitate.an integer The year of the Ministry of Finance snapshot the identity comes from.
e_firma boolean true when the tax ID is in the Trade Register.
firma null The ONRC profile when it is a company; otherwise null.
fiscal null ANAF tax status (VAT, inactivity, deregistration, e-invoicing); null when missing.
financiar_sumar array The last 3 years of financial statements; empty list when there are none.
loc object | null Location resolved against Locations (county, administrative unit, locality).
registre null The registers the entity appears in, out of the 46 in the umbrella (religious units, NGOs, sanctions, food safety…).
achizitii null Public procurement where it was the SUPPLIER (won contracts).
achizitii_autoritate null Procurement where it was the CONTRACTING AUTHORITY (awarded contracts), with top suppliers.
fonduri_nr integer How many EU-funded projects it has.
lei null The LEI identifier (GLEIF), if any.
surse array The sources that actually answered: mf, onrc, anaf, registre, mf_financiar, achizitii, achizitii_autoritate, fonduri, lei.
loc.din string Where the location came from: registre (address resolved from a register) or sediu_firma.

Response examples

GEThttps://oneapi.ro/api/business/v1/entitati/1196879
{
    "data": {
        "cui": 1196879,
        "identitate": {
            "denumire": "PAROHIA UNITARIANA DIMBAU",
            "tip_contrib": "PJ",
            "tip_unitate": "Sediu central",
            "adresa": {
                "judet": "MUREŞ",
                "localitate": "Dâmbău",
                "strada": "Mică",
                "numar": "7",
                "cod_postal": "547019"
            },
            "stare": "INREGISTRAT",
            "data_stare": "1992-11-29",
            "reg_com": null,
            "act_autorizare": "DECRET 177/1948",
            "data_inregistrare": "2022-07-08",
            "data_radiere": null,
            "cui_parinte": null,
            "tva": false,
            "contact": {
                "telefon": "0740413278",
                "fax": null
            },
            "vector_fiscal": [],
            "an": 2026
        },
        "e_firma": false,
        "firma": null,
        "fiscal": null,
        "financiar_sumar": [],
        "loc": null,
        "registre": null,
        "achizitii": null,
        "achizitii_autoritate": null,
        "fonduri_nr": 0,
        "lei": null,
        "surse": [
            "mf"
        ]
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitWe hold NO information at all about the requested tax ID. "It exists but has no Trade Register profile" is NOT a 404 — it is a 200, with the missing blocks as null.
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": "negasit",
        "mesaj": "We hold NO information at all about the requested tax ID. \"It exists but has no Trade Register profile\" is NOT a 404 — it is a 200, with the missing blocks as null."
    }
}