oneapi
Sign in
Business v1 / Firme

Tax status

A company's complete tax status (ANAF): VAT (standard / on collection / split, with their periods), tax inactivation, e-invoicing enrolment, striking off, registration dates, NACE code, tax office and contact details.

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

Path parameters

NameTypeDescriptionExample
cuirequired string The company tax identification number, without the RO prefix (e.g. 6719278).

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.
  • The tax status from ANAF, grouped by theme: VAT (payer, cash-basis, split), fiscal inactivity, e-Invoicing, deregistration. The source is the official ANAF API.
  • The history of tax-status changes is at /firme/{cui}/fiscal/istoric; the tax-vector declarations at /firme/{cui}/vector-fiscal.

What it is for

  • Deciding whether to invoice with or without VAT, based on the partner's official status.
  • Checking tax inactivity before deducting an expense.
  • Finding out whether the partner is enrolled in e-Invoicing before sending documents.

Response structure

FieldTypeDescription
data.cui integer The tax ID.
data.tva.platitor boolean VAT-registered.
data.tva.de_la string | null Since when it is registered for VAT.
data.tva.pana_la string | null Until when it was registered for VAT.
data.tva.la_incasare.activ boolean Is active.
data.tva.la_incasare.de_la string | null Since when VAT on collection applies.
data.tva.la_incasare.pana_la string | null Until when VAT on collection applied.
data.tva.la_incasare.tip string | null The type.
data.tva.split.activ boolean Is active.
data.tva.split.de_la string | null Since when split VAT applies.
data.tva.split.anulare string | null The date split VAT was cancelled.
data.inactiv.este_inactiv boolean Declared fiscally inactive.
data.inactiv.data_inactivare string | null The date inactivity was declared.
data.inactiv.data_reactivare string | null The reactivation date.
data.inactiv.data_publicare string | null The date of publication in the inactive taxpayers register.
data.e_factura.inrolat boolean Enrolled in e-Invoicing.
data.e_factura.de_la string | null Since when it is enrolled in e-Invoicing.
data.radiere.radiata boolean The company is struck off.
data.radiere.data string | null The strike-off date.
data.caen.cod string The code.
data.caen.denumire string | null The name.
data.caen.versiune string The nomenclature revision.
data.organ_fiscal string | null The tax office the company belongs to.
data.domiciliu_fiscal string | null The fiscal domicile, in the form ANAF publishes.
data.contact.telefon string The phone number in the ANAF record.opțional
data.contact.fax string The fax number in the ANAF record.opțional
data.verificat_anaf_la string | null When we last checked the status at ANAF.
meta.fara_date 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 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/firme/6719278/fiscal
{
    "data": {
        "cui": 6719278,
        "tva": {
            "platitor": true,
            "de_la": "1995-01-04",
            "pana_la": null,
            "la_incasare": {
                "activ": false,
                "de_la": null,
                "pana_la": null,
                "tip": null
            },
            "split": {
                "activ": false,
                "de_la": null,
                "anulare": null
            }
        },
        "inactiv": {
            "este_inactiv": false,
            "data_inactivare": null,
            "data_reactivare": null,
            "data_publicare": null
        },
        "e_factura": {
            "inrolat": false,
            "de_la": null
        },
        "radiere": {
            "radiata": false,
            "data": null
        },
        "inregistrare": {
            "data": "1995-01-05",
            "stare": "TRANSFER(SOSIRE) din data 19.08.2016",
            "forma_juridica": "SOCIETATE COMERCIALĂ CU RĂSPUNDERE LIMITATĂ",
            "forma_proprietate": "PROPR.PRIVATA-CAPITAL PRIVAT STRAIN",
            "forma_organizare": "PERSOANA JURIDICA"
        },
        "cod_caen": {
            "cod": "4711",
            "denumire": "Comerț cu amănuntul în magazine nespecializate, cu vânzare predominantă de produse alimentare, băuturi și tutun",
            "versiune": "CAEN Rev.2"
        },
        "organ_fiscal": "Direcţia Generală de Administrare a Marilor Contribuabili",
        "domiciliu_fiscal": "MUNICIPIUL BUCUREŞTI, Sector 6 Mun. Bucureşti, Bld. Timişoara, nr. 26",
        "contact": {
            "telefon": "0212246677"
        },
        "verificat_anaf_la": "2026-08-16 00: 00: 00"
    }
}

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 company with tax ID [{cui}] was not found.
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."
            ]
        }
    }
}