oneapi
Sign in
Business v1 / Firme

Compare companies

The financial statements of 2–5 companies side by side, on the same years and the same indicators aligned by name.

GET
https://oneapi.ro/api/business/v1/firme/compara

Query parameters

NameTypeDescriptionAccepted values
de_laoptional integer | null Optional: the first year included, YYYY. 1990 – 2100
pana_laoptional integer | null Optional: the last year included, YYYY. 1990 – 2100
cuilistrequired text Required: 2–5 tax IDs, comma-separated, with or without RO. e.g. 6719278,14399840e.g. 5022670,2054341e.g. 6719278,14399840,2054341

How it behaves

  • ⭐ The financial statements of 2–5 companies on the same years, with the indicators aligned: for each year, one row per company, in the order requested.
  • Indicators are aligned by name, not by code. The Ministry of Finance codes (I1…I38) are not stable: net profit has 13 different codes depending on the reporting family (long, short, IFRS, micro-enterprise). The name, brought to a common form, is the only key linking two companies from different families.
  • Not every family reports every indicator: where an indicator is missing for a company, the value is null, not zero. A year with no filed statement appears with depus: false, so the gap is visible.
  • rezultat_net puts profit and loss on a single axis (negative for a loss) — the figure to compare between companies that had different years.
  • Values are in lei, as filed; for euro or prices comparable over time, see /firme/{cui}/financiar/eur and /financiar/real. The full detail, with every indicator of the family, is at /firme/{cui}/financiar.

What it is for

  • Put a customer and its competitors side by side: turnover, profit, employees, debt, on the same years.
  • Choose between two suppliers on financial strength, not on the pitch.
  • Build a benchmark table for a report without aligning indicator codes by hand.

Response structure

All fields below live inside data.

FieldTypeDescription
firme[] array The companies compared, in the order requested: {cui, denumire, in_registru_onrc}.
firme[].cui integer Tax identification number, without the RO prefix.
firme[].denumire string The name, exactly as the source publishes it.
firme[].in_registru_onrc boolean
negasite array The requested tax IDs that have no financial statements filed.
indicatori[] array The indicators compared: {cheie, denumire}, in the order they appear on each company.
indicatori[].cheie string
indicatori[].denumire string The name, exactly as the source publishes it.
ani[].an integer The financial year.
ani[].firme[].cui integer The tax ID.
ani[].firme[].caen integer The CAEN code declared in that year's statement.
ani[].firme[].depus boolean false when the company filed no statement for that year — the indicators are then missing as well.
ani[].firme[].cifra_afaceri_neta integer Net turnover, in lei.
ani[].firme[].venituri_totale integer
ani[].firme[].cheltuieli_totale integer
ani[].firme[].profit_brut integer
ani[].firme[].pierdere_bruta integer
ani[].firme[].profit_net integer
ani[].firme[].pierdere_neta integer
ani[].firme[].salariati integer The average number of employees.
ani[].firme[].active_imobilizate integer
ani[].firme[].active_circulante integer
ani[].firme[].stocuri integer
ani[].firme[].creante integer
ani[].firme[].casa_si_conturi integer
ani[].firme[].datorii integer
ani[].firme[].capitaluri_proprii integer
ani[].firme[].rezultat_net integer Net profit minus net loss, in lei; negative for a loss.
observatie string How the indicators are aligned and what a null means.

Response examples

GEThttps://oneapi.ro/api/business/v1/firme/compara?cui=6719278,14399840&de_la=2020
{
    "data": {
        "firme": [
            {
                "cui": 6719278,
                "denumire": "MEGA IMAGE SRL",
                "in_registru_onrc": true
            }
        ],
        "negasite": [],
        "indicatori": [
            {
                "cheie": "cifra_afaceri_neta",
                "denumire": "Cifra de afaceri netă"
            }
        ],
        "ani": [
            {
                "an": 2025,
                "firme": [
                    {
                        "cui": 6719278,
                        "caen": 4711,
                        "depus": true,
                        "cifra_afaceri_neta": 12256333315,
                        "venituri_totale": 12310207852,
                        "cheltuieli_totale": 12073174928,
                        "profit_brut": 237032924,
                        "pierdere_bruta": 0,
                        "profit_net": 124841094,
                        "pierdere_neta": 0,
                        "salariati": 10171,
                        "active_imobilizate": 2489044532,
                        "active_circulante": 2181618267,
                        "stocuri": 1039070952,
                        "creante": 502664799,
                        "casa_si_conturi": 639882516,
                        "datorii": 1981326855,
                        "capitaluri_proprii": 2669472085,
                        "rezultat_net": 124841094
                    }
                ]
            }
        ],
        "observatie": "Indicatorii sunt aliniaţi după DENUMIRE, nu după cod: codurile MF (`I1`…`I38`) diferă între familiile de raportare. `rezultat_net` = profitul net minus pierderea netă. Firmele din familii diferite (bilanţ lung, scurt, IFRS, microîntreprinderi) nu raportează toţi indicatorii — unde un indicator lipseşte, e `null`. Un an în care o firmă n-a depus bilanţ apare cu `depus: false`."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitFewer than two of the requested companies have filed financial statements.
422validareAn undeclared parameter or a value that fails validation (cui, de_la, pana_la). 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 (cui, de_la, pana_la). The offending field is in detalii.",
        "detalii": {
            "de_la": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}