oneapi
Sign in
Business v1 / Firme

Financial statements

The company's annual financial statements (2008–present), with the indicators decoded through a dictionary (name + value). Filter one year with ?an=. Add ?raw=true for the raw values (code→value).

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

Path parameters

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

Query parameters

NameTypeDescriptionAccepted values
anoptional integer | null Optional: a single fiscal year. Without it, the whole series. e.g. 2023e.g. 2009
rawoptional boolean | null true also adds the raw indicator codes. e.g. true

How it behaves

  • This route does not require the company to be in the trade register. The Ministry of Finance also receives filings from entities outside it — associations, foundations, institutions: 103,953 entities, with 905,993 rows. Their financial statements are served normally, but /firme/{cui} answers 404, because a trade-register profile genuinely does not exist. data.in_registru_onrc tells you which case you are in, so the 404 on the profile does not look inconsistent.
  • When a company filed twice for the same year, the specialised set (the complete one) is served, not the generic web mirror. If the two genuinely disagree on figures — 17 cases in the whole database, all in 2009 — the year carries a conflict field naming the other family and the indicators that differ. The source gives neither a filing date nor a restatement marker, so we cannot say which figure is correct; we serve the more complete one and flag that a disagreement existed.
  • The company's annual balance sheets, as filed with the Ministry of Finance, decoded from a compact storage format into a set of named indicators (turnover, profit, assets, debts, number of employees, etc.).
  • Decoding uses an indicator dictionary per family and year — the same "I1…In" code means different things across years and balance-sheet types. When a family has no dictionary of its own for a year, it falls back gracefully to the nearest available year.
  • With ?an= you request a single year; without it, you get the whole series. With ?raw=true you also get the raw codes, useful for verification.
  • See also the derived variants: /financiar/eur (converted at the year-end rate) and /financiar/real (inflation-adjusted against a base year).

What it is for

  • Financial analysis and risk scoring based on the evolution of turnover and profit.
  • Checking the size of a partner before a contract.
  • Historical series for reports and visualisations.

Response structure

All fields below live inside data.

FieldTypeDescription
cui integer The tax ID.
in_registru_onrc boolean Whether the entity also has a profile at /firme/{cui}. false for those filing with the Ministry of Finance without being in the trade register.
ani[] object[] The balance sheets by year, with each one's indicators.
ani[].conflict[].familie string The other filing submitted for the same year. Present only when the figures genuinely differ.
ani[].conflict[].indicatori[] array Codes of the indicators the two filings disagree on. Missing and zero do not count as a disagreement.

Response examples

GEThttps://oneapi.ro/api/business/v1/firme/6719278/financiar
{
    "data": {
        "cui": 6719278,
        "in_registru_onrc": true,
        "ani": [
            {
                "an": 2008,
                "tip": "SOCIETATI COMERCIALE CARE DEPUN BILANT LUNG, BILANT SCURT SI RAPORTARI ANUALE",
                "familie": "web",
                "caen": 4711,
                "decodat": true,
                "indicatori": [
                    {
                        "cod": "I1",
                        "denumire": "ACTIVE IMOBILIZATE - TOTAL",
                        "valoare": 111431788
                    }
                ]
            }
        ]
    }
}

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.
422validareAn undeclared parameter or a value that fails validation (an, raw). The offending field is in detalii.
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": "An undeclared parameter or a value that fails validation (an, raw). The offending field is in detalii.",
        "detalii": {
            "cui": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}