oneapi
Sign in
Financiar v1 / RiscCredit

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⌋.

GET
https://oneapi.ro/api/financiar/v1/comert-servicii

Query parameters

NameTypeDescriptionAccepted values
frecventaoptional string | null Optional, defaults to lunar. Or trimestrial — the same 186 codes. lunartrimestrial
fluxoptional string | null Optional: export, import, sold. exportimportsold
de_laoptional string | null Optional, YYYY-MM or YYYY-Tn. e.g. 2024-06-15
pana_laoptional string | null Optional, YYYY-MM or YYYY-Tn. At most 120 periods. e.g. 2024-06-15
nivel_maxoptional integer | null Optional, 1–5. 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: STRMP under STRM under STR under S. 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. cale is derived from the ancestors' labels, so it would lie if the prefix nesting were merely a coincidence of strings. That is why identitati.ierarhie verifies, 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 − import is 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 flux or nivel_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 k components 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

FieldTypeDescription
data.frecventa string How often the source publishes the series (daily, monthly, quarterly, yearly).
data.clasificare string The classification the values are broken down by.
data.de_la string Start of the interval the response covers.
data.pana_la string End of the interval the response covers, inclusive.
data.unitate string The unit of the values. Read it before plotting or adding them up.
data.filtre array The filters actually applied, as the route understood them — useful when a value was normalised.
data.perioade array Periods for which values exist.
data.pozitii[].cod string Code from the source code list — the key you filter on.
data.pozitii[].flux string Direction of the flow (usually import or export).
data.pozitii[].categorie string The code suffix shared by all three flows — STRM is sea transport in both exports and imports.
data.pozitii[].eticheta string Display label for the value — the readable version of the code next to it.
data.pozitii[].cale array The ancestors' labels, from "Services" downwards. Derived from the code hierarchy, validated by sums.
data.pozitii[].nivel integer Depth, 1–5.
data.pozitii[].parinte null The parent position's code. null at each flow's total.
data.pozitii[].unitate string Unit of measure of the values. Read it before plotting or summing them.
data.pozitii[].perioade_publicate integer How many periods the source actually published.
data.pozitii[].valori object The values of the series, by period.
data.identitati.ierarhie.identitate string The identity being checked — which sum must equal which total.
data.identitati.ierarhie.noduri_cu_copii integer How many nodes in the hierarchy have at least one descendant.
data.identitati.ierarhie.noduri_inchise integer How many nodes with children close against the sum of those children. If not all, abateri names them.
data.identitati.ierarhie.verificari integer How many combinations were checked.
data.identitati.ierarhie.regula_tolerantei string How each sum's tolerance is derived from its number of components.
data.identitati.ierarhie.abateri array
data.identitati.sold.identitate string The identity being checked — which sum must equal which total.
data.identitati.sold.categorii integer How many categories carry all three flows and can therefore be checked.
data.identitati.sold.verificari integer How many combinations were checked.
data.identitati.sold.verificari_inchise integer How many checks closed within tolerance.
data.identitati.sold.abatere_maxima string Largest deviation found between the sum of components and the total.
data.identitati.sold.toleranta string How much deviation is accepted before the identity counts as unclosed — the source rounding, not an error.
meta.sursa string The official source the data comes from, with its licence where one is required.
meta.acoperire.de_la string The first period we have data for.
meta.acoperire.pana_la string The last period we have data for.
meta.perioade integer Periods for which values exist.
meta.categorii integer Available categories.
meta.pozitii_totale integer How many positions match the filters, beyond the current page.
meta.pozitii_returnate integer How many positions this response actually returned.
meta.nota_balanta string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_ierarhie string How to read the classification hierarchy and which levels must not be added together.
meta.nota_toleranta string Where the tolerance comes from and why it is not zero.
meta.nota_frecvente string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_null string Why some values are missing: the source did not publish, did not compute, or suppressed them.
data.identitati.sold.unde The category and period with the largest deviation. Absent when everything closes.
meta.fara_date data is null and this says why. No values for the requested frequency. The interval falls outside the coverage (January 2010 → present).
meta.fara_date_cod The short, STABLE word for the reason, for clients that branch on it in code: fara_date is prose and may be rephrased, this is not.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/comert-servicii
{
    "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."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareinterval_prea_lung beyond 120 periods, a flow outside the list, or nivel_max outside 1–5. frecventa_necunoscuta — a value outside the list.
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": "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."
            ]
        }
    }
}