Balance of payments
The BPM6 balance of payments — 208 positions, monthly since January 2005 and quarterly, with exactly the same codes at both frequencies. The current account balance in May 2026: −2,711.0 million euro.
The structure is flow × position. Six flows — credit, debit, balance, net assets, net liabilities, net — over a tree up to five levels deep: „CURRENT ACCOUNT; Goods; Merchanting — net exports; Merchanting — goods…". 94 positions sit at level four and 57 at level five, which is why nivel_max exists, so you can ask for the upper structure only.
The identity balance = credit − debit closes on every pair, but only with a tolerance of ±1 million — and the tolerance is not chosen out of caution, it is measured. On the current account, the deviation is exactly 0 or exactly 1, never anything else — meta.nota_identitate gives the count over the whole series: the independent rounding of three figures expressed in millions. With a tolerance of 0.51 the identity would have appeared to fail in a quarter of the months. identitati.toleranta declares it, so that „every pair closes" does not sound louder than it is.
The identity check is run on every position, not on the ones returned: a filter on flux=sold must not be allowed to make the guarantee disappear.
The hierarchy comes from the name, which carries the full path. The code prefix gives the same parent in all 192 cases today, but that is a coincidence of construction, so parinte is taken from the path, without assumptions.
The positions with no value across the whole series sit at different depths — down to level four — so they are recognised by the absence of values over the WHOLE series, not by the length of the code. este_antet marks them.
Merchanting changed its sign convention: until 2012 1BM = 1BMV − 1BMA, with purchases positive; from 2013 1BM = 1BMA + 1BMV, with purchases negative. 1Z ("Goods and services") is a sibling of 1B and 1S, not their parent: summing the current account's children counts them twice.
Periods are written YYYY-MM at both frequencies; for the quarterly one, the quarter's first month.
Query parameters
lunar. Or trimestrial — the same 208 positions.
lunartrimestrial
YYYY-MM. Without it, the last published period.
e.g. 2024-06-15
YYYY-MM. At most 120 periods.
e.g. 2024-06-15
credit, debit, sold, active_nete, pasive_nete, net.
creditdebitsoldactive_netepasive_netenet
How it behaves
- The balance of payments under the BPM6 methodology — 208 positions, monthly since January 2005 and quarterly. The current account balance in May 2026: −2,711.0 million euro (credit 13,161, debit 15,872).
- Both frequencies carry EXACTLY the same codes — verified, zero differences in either direction. It is the same structure at a different granularity, so one route with a parameter rather than two that would drift apart at the first correction.
- The structure is flow × position. Six flows — credit, debit, balance, net acquisition of assets, net incurrence of liabilities, net — over a tree up to five levels deep: "CURRENT ACCOUNT; Goods; Merchanting - net exports; Merchanting - goods...". 94 positions sit at level four and 57 at level five, which is why
nivel_maxexists. - The identity
balance = credit − debitcloses across every pair, but only within ±1 million — and the tolerance is MEASURED, not chosen out of caution. On the current account, the deviation is exactly 0 or exactly 1, never anything else —meta.nota_identitategives the count over the whole series: the independent rounding of three figures expressed in millions. With a tolerance of 0.51 the identity would have looked like it failed in a quarter of the months.identitati.tolerantadeclares it, so "every pair closes" does not sound stronger than it is. - The identity is checked over ALL positions, not the returned ones. A filter of
flux=soldreturns two positions, yet the identity still reports its 32 verified pairs: it is the guarantee that the figures tie together, and it must not vanish with a filter. - The hierarchy comes from the name, which carries the full path. The code prefix gives the same parent in all 192 cases today, but that is a coincidence of construction, not a declared rule — so
parinteis resolved fromcale, without assumptions. Verified: zero unresolved parents. - Six positions have no value across the whole series and sit at different depths — down to level four: merchanting and reserve-asset income on the debit side, reserve assets on the liabilities side and so on, where BPM6 records nothing. They cannot be recognised by code length, only by the absence of values over the WHOLE series — not over the requested window, where a series starting later would look empty.
este_antetflags them. - Merchanting changed its sign convention. Until 2012
1BM = 1BMV − 1BMA, with purchases (1BMA) positive; from 20131BM = 1BMA + 1BMV, with purchases negative. A single formula does not close both periods. 1Z("Goods and services") is a sibling of1Band1S, not their parent:1Z = 1B + 1Sin every month. Do not add up all the children of the current account — goods and services would be counted twice.- Periods are written
YYYY-MMat both frequencies; for quarterly, the first month of the quarter. At most 120 periods.
What it is for
- The current account deficit, month by month, with its components.
- Exports and imports of services by category — transport, travel, IT.
- The financial account: direct investment, portfolio investment, reserve assets.
Response structure
milioane EUR.
null at roots.
true for positions with no value across the whole series (not just the window).
data is null and this says why. No values for the requested frequency. The interval falls entirely outside the coverage. It overlaps the coverage but holds no values.
fara_date is prose and may be rephrased, this is not.
Response examples
{
"data": {
"frecventa": "lunar",
"de_la": "2026-07",
"pana_la": "2026-07",
"unitate": "milioane EUR",
"filtre": [],
"perioade": [
"2026-07"
],
"pozitii": [
{
"cod": "BOP6L_N_4",
"flux": "net",
"eticheta": "ERORI ȘI OMISIUNI",
"cale": [
"ERORI ȘI OMISIUNI"
],
"nivel": 1,
"parinte": null,
"unitate": "milioane EUR",
"este_antet": false,
"luni_publicate": 1,
"valori": {
"2026-07": "1375.00"
}
}
],
"identitati": {
"identitate": "sold = credit − debit",
"perechi_verificate": 32,
"perechi_inchise": 32,
"abatere_maxima": "1.00",
"toleranta": "1"
}
},
"meta": {
"sursa": "BNR — balanţa de plăţi, metodologia BPM6.",
"acoperire": {
"de_la": "2005-01",
"pana_la": "2026-07"
},
"luni": 1,
"pozitii_totale": 202,
"pozitii_returnate": 202,
"nota_frecvente": "Lunar şi trimestrial au exact aceleaşi 208 coduri — verificat, zero diferenţe. E aceeaşi structură la altă granularitate.",
"nota_identitate": "Toleranţa de ±1 milion nu e aleasă din prudenţă, ci măsurată: pe contul curent, pe toată seria, abaterea e exact 0 în 192 perioade şi exact 1 în 67 — rotunjirea a trei cifre exprimate în milioane. Verificarea se face pe toate poziţiile, nu pe cele întoarse de filtre.",
"nota_ierarhie": "`cale` şi `parinte` vin din denumire, care poartă calea completă. Prefixul codului dă azi acelaşi părinte, dar e o coincidenţă de construcţie, nu o regulă declarată de sursă.",
"nota_antete": "6 poziţii n-au nicio valoare pe toată seria — BPM6 nu înregistrează nimic acolo (merchanting şi venituri din active de rezervă la debit, active de rezervă la pasive ş.a.) — şi stau la adâncimi diferite. `este_antet` le marchează, socotit pe toată seria, nu pe fereastra cerută.",
"nota_merchanting": "Merchanting-ul şi-a schimbat convenţia de semn: până în 2012 `1BM = 1BMV − 1BMA`, cu achiziţiile (`1BMA`) pozitive; din 2013 `1BM = 1BMA + 1BMV`, cu achiziţiile negative. Aceeaşi formulă nu închide ambele perioade.",
"nota_1z": "`1Z` („Bunuri şi servicii\") e frate cu `1B` şi `1S` sub contul curent, nu părintele lor: `1Z = 1B + 1S`. Nu aduna toţi copiii contului curent — bunurile şi serviciile s-ar număra de două ori.",
"nota_null": "`null` într-o perioadă înseamnă că poziţia n-a fost publicată atunci, nu zero."
}
}
{
"data": {
"frecventa": "lunar",
"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": "BOP6L_N_4",
"flux": "net",
"eticheta": "ERORI ȘI OMISIUNI",
"cale": [
"ERORI ȘI OMISIUNI"
],
"nivel": 1,
"parinte": null,
"unitate": "milioane EUR",
"este_antet": false,
"luni_publicate": 26,
"valori": {
"2024-06": "1043.00",
"2024-07": "-868.00",
"2024-08": "1363.00",
"2024-09": "446.00",
"2024-10": "370.00",
"2024-11": "964.00",
"2024-12": "574.00",
"2025-01": "559.00",
"2025-02": "-1260.00",
"2025-03": "-888.00",
"2025-04": "714.00",
"2025-05": "-502.00",
"2025-06": "-535.00",
"2025-07": "-32.00",
"2025-08": "760.00",
"2025-09": "-922.00",
"2025-10": "1561.00",
"2025-11": "492.00",
"2025-12": "255.00",
"2026-01": "399.00",
"2026-02": "-575.00",
"2026-03": "603.00",
"2026-04": "1637.00",
"2026-05": "426.00",
"2026-06": "-301.00",
"2026-07": "1375.00"
}
}
],
"identitati": {
"identitate": "sold = credit − debit",
"perechi_verificate": 828,
"perechi_inchise": 828,
"abatere_maxima": "1.00",
"toleranta": "1"
}
},
"meta": {
"sursa": "BNR — balanţa de plăţi, metodologia BPM6.",
"acoperire": {
"de_la": "2005-01",
"pana_la": "2026-07"
},
"luni": 26,
"pozitii_totale": 202,
"pozitii_returnate": 202,
"nota_frecvente": "Lunar şi trimestrial au exact aceleaşi 208 coduri — verificat, zero diferenţe. E aceeaşi structură la altă granularitate.",
"nota_identitate": "Toleranţa de ±1 milion nu e aleasă din prudenţă, ci măsurată: pe contul curent, pe toată seria, abaterea e exact 0 în 192 perioade şi exact 1 în 67 — rotunjirea a trei cifre exprimate în milioane. Verificarea se face pe toate poziţiile, nu pe cele întoarse de filtre.",
"nota_ierarhie": "`cale` şi `parinte` vin din denumire, care poartă calea completă. Prefixul codului dă azi acelaşi părinte, dar e o coincidenţă de construcţie, nu o regulă declarată de sursă.",
"nota_antete": "6 poziţii n-au nicio valoare pe toată seria — BPM6 nu înregistrează nimic acolo (merchanting şi venituri din active de rezervă la debit, active de rezervă la pasive ş.a.) — şi stau la adâncimi diferite. `este_antet` le marchează, socotit pe toată seria, nu pe fereastra cerută.",
"nota_merchanting": "Merchanting-ul şi-a schimbat convenţia de semn: până în 2012 `1BM = 1BMV − 1BMA`, cu achiziţiile (`1BMA`) pozitive; din 2013 `1BM = 1BMA + 1BMV`, cu achiziţiile negative. Aceeaşi formulă nu închide ambele perioade.",
"nota_1z": "`1Z` („Bunuri şi servicii\") e frate cu `1B` şi `1S` sub contul curent, nu părintele lor: `1Z = 1B + 1S`. Nu aduna toţi copiii contului curent — bunurile şi serviciile s-ar număra de două ori.",
"nota_null": "`null` într-o perioadă înseamnă că poziţia n-a fost publicată atunci, nu zero."
}
}
{
"data": {
"frecventa": "lunar",
"de_la": "2024-06",
"pana_la": "2024-06",
"unitate": "milioane EUR",
"filtre": [],
"perioade": [
"2024-06"
],
"pozitii": [
{
"cod": "BOP6L_N_4",
"flux": "net",
"eticheta": "ERORI ȘI OMISIUNI",
"cale": [
"ERORI ȘI OMISIUNI"
],
"nivel": 1,
"parinte": null,
"unitate": "milioane EUR",
"este_antet": false,
"luni_publicate": 1,
"valori": {
"2024-06": "1043.00"
}
}
],
"identitati": {
"identitate": "sold = credit − debit",
"perechi_verificate": 32,
"perechi_inchise": 32,
"abatere_maxima": "1.00",
"toleranta": "1"
}
},
"meta": {
"sursa": "BNR — balanţa de plăţi, metodologia BPM6.",
"acoperire": {
"de_la": "2005-01",
"pana_la": "2026-07"
},
"luni": 1,
"pozitii_totale": 202,
"pozitii_returnate": 202,
"nota_frecvente": "Lunar şi trimestrial au exact aceleaşi 208 coduri — verificat, zero diferenţe. E aceeaşi structură la altă granularitate.",
"nota_identitate": "Toleranţa de ±1 milion nu e aleasă din prudenţă, ci măsurată: pe contul curent, pe toată seria, abaterea e exact 0 în 192 perioade şi exact 1 în 67 — rotunjirea a trei cifre exprimate în milioane. Verificarea se face pe toate poziţiile, nu pe cele întoarse de filtre.",
"nota_ierarhie": "`cale` şi `parinte` vin din denumire, care poartă calea completă. Prefixul codului dă azi acelaşi părinte, dar e o coincidenţă de construcţie, nu o regulă declarată de sursă.",
"nota_antete": "6 poziţii n-au nicio valoare pe toată seria — BPM6 nu înregistrează nimic acolo (merchanting şi venituri din active de rezervă la debit, active de rezervă la pasive ş.a.) — şi stau la adâncimi diferite. `este_antet` le marchează, socotit pe toată seria, nu pe fereastra cerută.",
"nota_merchanting": "Merchanting-ul şi-a schimbat convenţia de semn: până în 2012 `1BM = 1BMV − 1BMA`, cu achiziţiile (`1BMA`) pozitive; din 2013 `1BM = 1BMA + 1BMV`, cu achiziţiile negative. Aceeaşi formulă nu închide ambele perioade.",
"nota_1z": "`1Z` („Bunuri şi servicii\") e frate cu `1B` şi `1S` sub contul curent, nu părintele lor: `1Z = 1B + 1S`. Nu aduna toţi copiii contului curent — bunurile şi serviciile s-ar număra de două ori.",
"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."
]
}
}
}