oneapi
Sign in
Business v1 / Firme

Sector positioning

The company against companies with the same CAEN code, county and size, year by year: the group's quartiles and the company's place in it.

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

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

  • The company against companies like it, year by year: the same CAEN code (the one in that year's balance sheet), the same county, the same size class. pozitie.cifra_afaceri: 85 means 85% of the group has a lower turnover.
  • The group needs at least 5 companies — below that, the percentiles would describe identifiable companies. If the county is not enough, the group widens to the whole country (nivel: national), then to all size classes (grup.clasa_marime: null). Large companies have few peers: Dedeman is compared with all 2,817 companies in 4752, since only 3 are large.
  • Covers every balance-sheet form (micro-enterprises included), from 2019. Without a balance sheet with a CAEN code, the response is 200 with data: null and the reason in meta.fara_date.
  • The county is the registered office of the balance-sheet year, taken from the trade-register history (from 2020): a company that moved from Cluj to Bucharest in 2024 counts for Cluj in 2021 and for Bucharest in 2025. For 2019, the county of the first edition we have (May 2020) is used. The same figures for a whole sector: /caen/{cod}/benchmark.

What it is for

  • Positioning a client against their sector average in an analysis report.
  • Credit scoring: how far the company sits from the local pattern of its industry.
  • Backing a commercial proposal with figures from the client's sector.

Response structure

All fields below live inside data.

FieldTypeDescription
benchmark[].caen string The CAEN (NACE) code of the activity, in the series revision.
benchmark[].judet string The county the value refers to.
benchmark[].an integer The year the value refers to.
benchmark[].clasa_marime string Enterprise size class, by number of employees.
benchmark[].n integer
benchmark[].ca_p25 number | null
benchmark[].ca_p50 number | null
benchmark[].ca_p75 number | null
benchmark[].ca_medie number | null
benchmark[].profit_p50 number | null
benchmark[].salariati_p50 number | null
ani[].an integer The balance-sheet year.
ani[].caen string The CAEN code the company declared in that year's balance sheet.
ani[].clasa_marime string The company's size class that year, by employees: micro (0–9), mica (10–49), mijlocie (50–249), mare (250+).
ani[].nivel string judet if the group is from the company's county, national if it had to be widened to the whole country.
ani[].judet string The group's county; null at national level.
ani[].grup.clasa_marime string The group's size class; null if the company is compared with all classes (when companies of its size are too few).
ani[].grup.firme integer How many companies with a balance sheet the group has.
ani[].grup.cifra_afaceri object The group's turnover quartiles (p25, mediana, p75) and mean, in lei.
ani[].grup.profit_net object The group's net-profit quartiles, in lei (negative = loss).
ani[].grup.salariati object The group's median number of employees.
ani[].firma object The company's values that year: cifra_afaceri, profit_net, salariati.
ani[].pozitie object What percentage of the group has a value below the company's, per indicator (0–100); null where the company lacks the value.

Response examples

GEThttps://oneapi.ro/api/business/v1/firme/6719278/benchmark
{
    "data": {
        "ani": [
            {
                "an": 2025,
                "caen": "4711",
                "clasa_marime": "mare",
                "nivel": "judet",
                "judet": "București",
                "grup": {
                    "clasa_marime": "mare",
                    "firme": 10,
                    "cifra_afaceri": {
                        "p25": 657070580.25,
                        "mediana": 9453476915,
                        "p75": 13702177264,
                        "medie": 9501150838.7
                    },
                    "profit_net": {
                        "p25": -38482660,
                        "mediana": 77524592,
                        "p75": 203723091
                    },
                    "salariati": {
                        "mediana": 7099
                    }
                },
                "firma": {
                    "cifra_afaceri": 12256333315,
                    "profit_net": 124841094,
                    "salariati": 10171
                },
                "pozitie": {
                    "cifra_afaceri": 60,
                    "profit_net": 50,
                    "salariati": 60
                }
            }
        ]
    }
}

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 [{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."
            ]
        }
    }
}