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: 85means 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
200withdata: nulland the reason inmeta.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
}
}
]
}
}
GEThttps://oneapi.ro/api/business/v1/firme/14399840/benchmark
{
"data": {
"ani": [
{
"an": 2025,
"caen": "4754",
"clasa_marime": "mare",
"nivel": "national",
"judet": null,
"grup": {
"clasa_marime": null,
"firme": 604,
"cifra_afaceri": {
"p25": 95756.5,
"mediana": 331134,
"p75": 1339076,
"medie": 39005322.22
},
"profit_net": {
"p25": -9609.5,
"mediana": 1098,
"p75": 44614
},
"salariati": {
"mediana": 1
}
},
"firma": {
"cifra_afaceri": 8706154345,
"profit_net": -370680444,
"salariati": 2889
},
"pozitie": {
"cifra_afaceri": 99.8,
"profit_net": 0,
"salariati": 99.5
}
}
]
}
}
GEThttps://oneapi.ro/api/business/v1/firme/2054341/benchmark
{
"data": {
"ani": [
{
"an": 2025,
"caen": "1410",
"clasa_marime": "micro",
"nivel": "judet",
"judet": "Neamț",
"grup": {
"clasa_marime": "micro",
"firme": 9,
"cifra_afaceri": {
"p25": 153668,
"mediana": 197186,
"p75": 437239,
"medie": 780424.33
},
"profit_net": {
"p25": 4974,
"mediana": 5385,
"p75": 27338
},
"salariati": {
"mediana": 1
}
},
"firma": {
"cifra_afaceri": 1177675,
"profit_net": 4974,
"salariati": 3
},
"pozitie": {
"cifra_afaceri": 77.8,
"profit_net": 22.2,
"salariati": 75
}
}
]
}
}
GEThttps://oneapi.ro/api/business/v1/firme/24890577/benchmark
{
"data": {
"ani": [
{
"an": 2024,
"caen": "4619",
"clasa_marime": "mica",
"nivel": "judet",
"judet": "Harghita",
"grup": {
"clasa_marime": "mica",
"firme": 8,
"cifra_afaceri": {
"p25": 5125247.75,
"mediana": 9374226.5,
"p75": 18279877.5,
"medie": 13045882.75
},
"profit_net": {
"p25": 340815.5,
"mediana": 474439.5,
"p75": 795157.25
},
"salariati": {
"mediana": 12
}
},
"firma": {
"cifra_afaceri": 10805214,
"profit_net": 440964,
"salariati": 10
},
"pozitie": {
"cifra_afaceri": 50,
"profit_net": 25,
"salariati": 0
}
}
]
}
}
Error codes
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Token missing, invalid, expired or revoked. |
| 403 | feature_indisponibil | The current plan does not include the feature the route depends on. |
| 404 | negasit | The company [{cui}] was not found. |
| 422 | validare | The route takes no parameters apart from lang: any other parameter returns 422 instead of being ignored. |
| 429 | cota_depasita | The 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."
]
}
}
}