Trade in services (EBOPS)
62 service categories × 3 flows — export, import, balance — monthly since January 2010 or quarterly. Both frequencies have exactly the same 186 codes.
The total is identical to the „Services" line in the current account of the balance of payments: 197 of 197 months, deviation 0. In May 2026: exports 3,640, imports 2,634, balance 1,007 — the same figures in both routes. This is that line broken into 62 positions, not a parallel dataset.
The hierarchy is in the code, and the name is flat — the opposite of the reserves. All 186 names sit at the same level, so the structure is taken from the code suffix, which nests character by character: STRMP under STRM under STR under S. cale is composed from the ancestors' labels, so it is derived, not read from a field.
The code is not taken on trust: identitati.ierarhie checks every node with children against the sum of its direct children, on every request. If the prefix nesting were a coincidence of strings, the sums would not come out. Across the whole history, all 48 nodes close.
balance = exports − imports is checked on all 62 categories, not just on the total — 10,609 checks at monthly frequency, all within ±1.
The tolerance on the sums is derived: all 31,827 values in the class are whole millions, so a sum of k components is bounded by ⌊(k+1)/2⌋.
Query parameters
lunar. Or trimestrial — the same 186 codes.
lunartrimestrial
export, import, sold.
exportimportsold
YYYY-MM or YYYY-Tn.
e.g. 2024-06-15
YYYY-MM or YYYY-Tn. At most 120 periods.
e.g. 2024-06-15
nivel_max=2 gives the 12 chapters without subdivisions.
1 – 5
How it behaves
- International trade in services under the extended EBOPS classification — 62 categories × 3 flows (export, import, balance), monthly since January 2010 or quarterly. Both frequencies carry exactly the same 186 codes.
- The total is identical to the "Services" line of the current account in the balance of payments — verified across 197 of 197 months, deviation 0. In May 2026: exports 3,640, imports 2,634, balance 1,007, the same figures in both routes. This route breaks that single line into 62 positions; it is not a parallel dataset.
- The hierarchy lives in the code, and the name is flat — exactly the reverse of the reserves. All 186 names sit at the same level ("EXPORT; Sea passenger transport services"), so the path in the name says nothing. The structure lives in the code suffix, which nests by characters:
STRMPunderSTRMunderSTRunderS. The path-versus-code check, run on every class, is what catches the difference — for the reserves the verdict went the other way. - The code is not taken on trust.
caleis derived from the ancestors' labels, so it would lie if the prefix nesting were merely a coincidence of strings. That is whyidentitati.ierarhieverifies, on every request, each node with children against the sum of its direct children: 48 nodes, all of them close, across 7,989 node-periods monthly and 2,637 quarterly. sold = export − importis checked across all 62 categories, not just the total — 10,609 checks monthly and 3,497 quarterly, all within ±1.- Both checks run over all 186 positions regardless of
fluxornivel_max: a filter must not make the guarantee disappear. - The tolerance of the sums is derived, since all 31,827 values in the class are whole millions — verified, none with decimals — so a sum of
kcomponents is bounded by⌊(k+1)/2⌋. For foreign direct investment the rule does not apply; there the values carry decimals. - The quarterly series is the sum of the three months (65 of 65, maximum deviation 1). The monthly series runs four months further.
- The window is capped at 120 periods, as in the balance of payments — there are 186 positions.
What it is for
- Exports of computer services, Romania's largest category after transport.
- The travel balance: what foreigners spend here against what Romanians spend abroad.
- Road freight transport, separated from the rest of transport.
Response structure
STRM is sea transport in both exports and imports.
null at each flow's total.
abateri names them.
data is null and this says why. No values for the requested frequency. The interval falls outside the coverage (January 2010 → present).
fara_date is prose and may be rephrased, this is not.
Response examples
{
"data": {
"frecventa": "lunar",
"clasificare": "EBOPS",
"de_la": "2026-07",
"pana_la": "2026-07",
"unitate": "milioane EUR",
"filtre": [],
"perioade": [
"2026-07"
],
"pozitii": [
{
"cod": "CIS6L_E_S",
"flux": "export",
"categorie": "S",
"eticheta": "Servicii",
"cale": [
"Servicii"
],
"nivel": 1,
"parinte": null,
"unitate": "milioane EUR",
"perioade_publicate": 1,
"valori": {
"2026-07": "4013"
}
}
],
"identitati": {
"ierarhie": {
"identitate": "fiecare poziţie = suma copiilor ei direcţi",
"noduri_cu_copii": 48,
"noduri_inchise": 48,
"verificari": 48,
"regula_tolerantei": "⌊(k+1)/2⌋ milioane pentru k componente — valorile clasei sunt milioane întregi",
"abateri": []
},
"sold": {
"identitate": "sold = export − import",
"categorii": 62,
"verificari": 62,
"verificari_inchise": 62,
"abatere_maxima": "1",
"toleranta": "1"
}
}
},
"meta": {
"sursa": "BNR — comerţul cu servicii, clasificarea extinsă EBOPS (clasa 1267).",
"acoperire": {
"de_la": "2010-01",
"pana_la": "2026-07"
},
"perioade": 1,
"categorii": 62,
"pozitii_totale": 186,
"pozitii_returnate": 186,
"nota_balanta": "Totalul de servicii e identic cu linia „Servicii\" din contul curent al balanţei de plăţi — verificat pe 197 din 197 de luni, abatere 0. Ruta desface acea linie în 62 de poziţii.",
"nota_ierarhie": "Denumirile sunt plate, toate la acelaşi nivel, deci ierarhia se ia din sufixul codului, care se cuibăreşte pe caractere. `cale` e derivată din etichetele strămoşilor, nu citită. Validarea nu e opţională: 48 din 48 noduri se închid faţă de suma copiilor, pe 48 verificări.",
"nota_toleranta": "Toleranţa sumelor e derivată — toate valorile clasei sunt milioane întregi, deci o sumă de k componente e mărginită de ⌊(k+1)/2⌋. La investiţiile directe regula nu se aplică, fiindcă acolo valorile au zecimale.",
"nota_frecvente": "Lunar şi trimestrial au aceleaşi 186 de coduri, iar trimestrialul e suma celor trei luni (65 din 65, abatere maximă 1). Seria lunară merge cu patru luni mai departe.",
"nota_null": "`null` într-o perioadă înseamnă că poziţia n-a fost publicată atunci, nu zero."
}
}
{
"data": {
"frecventa": "lunar",
"clasificare": "EBOPS",
"de_la": "2024-06",
"pana_la": "2026-07",
"unitate": "milioane EUR",
"filtre": [],
"perioade": [
"2024-06",
"2024-07",
"2024-08",
"2024-09",
"2024-10",
"2024-11",
"2024-12",
"2025-01",
"2025-02",
"2025-03",
"2025-04",
"2025-05",
"2025-06",
"2025-07",
"2025-08",
"2025-09",
"2025-10",
"2025-11",
"2025-12",
"2026-01",
"2026-02",
"2026-03",
"2026-04",
"2026-05",
"2026-06",
"2026-07"
],
"pozitii": [
{
"cod": "CIS6L_E_S",
"flux": "export",
"categorie": "S",
"eticheta": "Servicii",
"cale": [
"Servicii"
],
"nivel": 1,
"parinte": null,
"unitate": "milioane EUR",
"perioade_publicate": 26,
"valori": {
"2024-06": "3300",
"2024-07": "3608",
"2024-08": "3300",
"2024-09": "3373",
"2024-10": "3434",
"2024-11": "3359",
"2024-12": "3738",
"2025-01": "3426",
"2025-02": "3391",
"2025-03": "3729",
"2025-04": "3512",
"2025-05": "3476",
"2025-06": "3742",
"2025-07": "3985",
"2025-08": "3512",
"2025-09": "3878",
"2025-10": "3823",
"2025-11": "3630",
"2025-12": "4161",
"2026-01": "3349",
"2026-02": "3481",
"2026-03": "4090",
"2026-04": "3766",
"2026-05": "3774",
"2026-06": "4330",
"2026-07": "4013"
}
}
],
"identitati": {
"ierarhie": {
"identitate": "fiecare poziţie = suma copiilor ei direcţi",
"noduri_cu_copii": 48,
"noduri_inchise": 48,
"verificari": 1248,
"regula_tolerantei": "⌊(k+1)/2⌋ milioane pentru k componente — valorile clasei sunt milioane întregi",
"abateri": []
},
"sold": {
"identitate": "sold = export − import",
"categorii": 62,
"verificari": 1612,
"verificari_inchise": 1612,
"abatere_maxima": "1",
"toleranta": "1"
}
}
},
"meta": {
"sursa": "BNR — comerţul cu servicii, clasificarea extinsă EBOPS (clasa 1267).",
"acoperire": {
"de_la": "2010-01",
"pana_la": "2026-07"
},
"perioade": 26,
"categorii": 62,
"pozitii_totale": 186,
"pozitii_returnate": 186,
"nota_balanta": "Totalul de servicii e identic cu linia „Servicii\" din contul curent al balanţei de plăţi — verificat pe 197 din 197 de luni, abatere 0. Ruta desface acea linie în 62 de poziţii.",
"nota_ierarhie": "Denumirile sunt plate, toate la acelaşi nivel, deci ierarhia se ia din sufixul codului, care se cuibăreşte pe caractere. `cale` e derivată din etichetele strămoşilor, nu citită. Validarea nu e opţională: 48 din 48 noduri se închid faţă de suma copiilor, pe 1248 verificări.",
"nota_toleranta": "Toleranţa sumelor e derivată — toate valorile clasei sunt milioane întregi, deci o sumă de k componente e mărginită de ⌊(k+1)/2⌋. La investiţiile directe regula nu se aplică, fiindcă acolo valorile au zecimale.",
"nota_frecvente": "Lunar şi trimestrial au aceleaşi 186 de coduri, iar trimestrialul e suma celor trei luni (65 din 65, abatere maximă 1). Seria lunară merge cu patru luni mai departe.",
"nota_null": "`null` într-o perioadă înseamnă că poziţia n-a fost publicată atunci, nu zero."
}
}
{
"data": {
"frecventa": "lunar",
"clasificare": "EBOPS",
"de_la": "2024-06",
"pana_la": "2024-06",
"unitate": "milioane EUR",
"filtre": [],
"perioade": [
"2024-06"
],
"pozitii": [
{
"cod": "CIS6L_E_S",
"flux": "export",
"categorie": "S",
"eticheta": "Servicii",
"cale": [
"Servicii"
],
"nivel": 1,
"parinte": null,
"unitate": "milioane EUR",
"perioade_publicate": 1,
"valori": {
"2024-06": "3300"
}
}
],
"identitati": {
"ierarhie": {
"identitate": "fiecare poziţie = suma copiilor ei direcţi",
"noduri_cu_copii": 48,
"noduri_inchise": 48,
"verificari": 48,
"regula_tolerantei": "⌊(k+1)/2⌋ milioane pentru k componente — valorile clasei sunt milioane întregi",
"abateri": []
},
"sold": {
"identitate": "sold = export − import",
"categorii": 62,
"verificari": 62,
"verificari_inchise": 62,
"abatere_maxima": "1",
"toleranta": "1"
}
}
},
"meta": {
"sursa": "BNR — comerţul cu servicii, clasificarea extinsă EBOPS (clasa 1267).",
"acoperire": {
"de_la": "2010-01",
"pana_la": "2026-07"
},
"perioade": 1,
"categorii": 62,
"pozitii_totale": 186,
"pozitii_returnate": 186,
"nota_balanta": "Totalul de servicii e identic cu linia „Servicii\" din contul curent al balanţei de plăţi — verificat pe 197 din 197 de luni, abatere 0. Ruta desface acea linie în 62 de poziţii.",
"nota_ierarhie": "Denumirile sunt plate, toate la acelaşi nivel, deci ierarhia se ia din sufixul codului, care se cuibăreşte pe caractere. `cale` e derivată din etichetele strămoşilor, nu citită. Validarea nu e opţională: 48 din 48 noduri se închid faţă de suma copiilor, pe 48 verificări.",
"nota_toleranta": "Toleranţa sumelor e derivată — toate valorile clasei sunt milioane întregi, deci o sumă de k componente e mărginită de ⌊(k+1)/2⌋. La investiţiile directe regula nu se aplică, fiindcă acolo valorile au zecimale.",
"nota_frecvente": "Lunar şi trimestrial au aceleaşi 186 de coduri, iar trimestrialul e suma celor trei luni (65 din 65, abatere maximă 1). Seria lunară merge cu patru luni mai departe.",
"nota_null": "`null` într-o perioadă înseamnă că poziţia n-a fost publicată atunci, nu zero."
}
}
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. |
| 422 | validare | interval_prea_lung beyond 120 periods, a flow outside the list, or nivel_max outside 1–5. frecventa_necunoscuta — a value outside the list. |
| 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": "interval_prea_lung beyond 120 periods, a flow outside the list, or nivel_max outside 1–5. frecventa_necunoscuta — a value outside the list.",
"detalii": {
"frecventa": [
"The value sent does not satisfy the parameter rule."
]
}
}
}