oneapi
Sign in
Financiar v1 / RiscCredit

International investment position

The stock of Romania's external assets and liabilities, quarterly since 2007 — 51 positions across four levels. In the latest quarter: assets 166,182, liabilities 333,943, net position −167,761 million euro.

The periods are quarters, with an explicit reference date. The source labels the quarter with its first month, but the value is the stock at its end. Verified on reserve assets against the monthly reserves: compared on their own label, no quarter matches, with deviations of up to 5,274 million euro; shifted by two months, all of them match. Every period carries data_referinta and luna_sursa, and the keys in valori are quarters.

Assets and liabilities are not symmetric — 22 common positions, three assets-only (reserve assets, monetary gold, foreign exchange reserves) and one liabilities-only (SDR allocations). It is not a side × position matrix as in the balance of payments.

Each identity's tolerance is derived, not chosen. The source publishes whole millions, so an identity with k components has its rounding error bounded by ⌊(k+1)/2⌋. Under that rule 17 of 18 identities close on every quarter; the liabilities decomposition comes out at 3 in a single quarter, reported in unde rather than papered over by widening the tolerance.

GET
https://oneapi.ro/api/financiar/v1/pozitie-investitionala

Query parameters

NameTypeDescriptionAccepted values
de_laoptional string | null Optional, YYYY-Tn or YYYY-MM. A month is rounded to the quarter containing it, and perioade shows exactly what came back. e.g. 2024-06-15
pana_laoptional string | null Optional, YYYY-Tn or YYYY-MM. e.g. 2024-06-15e.g. 2024-06-30
laturaoptional string | null Optional: net, active, pasive. netactivepasive
nivel_maxoptional integer | null Optional, 1–4. Limits the depth of the tree. 1 – 4

How it behaves

  • The stock of Romania's external assets and liabilities, quarterly since 2007 — 51 positions across four levels. In 2026-Q1: assets 166,182, liabilities 333,943, net position −167,761 million euro.
  • Periods are quarters, with an explicit reference date — and this matters. The source labels a quarter with its first month, but the value is the stock at the end of it. Verified against the monthly reserves: compared on the source label, no quarter matches, with discrepancies of up to 5,274 million euro; shifted by two months, all of them match, with a maximum deviation of 0.5 — rounding, since these values are whole millions while the reserves carry decimals.
  • So the keys in valori are quarters (2025-T3), and every period carries data_referinta (2025-09-30) and luna_sursa (2025-07) for anyone joining back to the raw series. A live check: reserve assets in 2025-Q3 are 75,786, and the reserves on 30 September 2025 are 75,785.94.
  • The quarterly balance of payments has no such problem: those are flows, and the period really is the quarter. This is a stock.
  • Assets and liabilities are not symmetric — 22 shared positions, three only on the asset side (reserve assets, monetary gold, the foreign exchange reserve) and one only on the liability side (SDR allocations). It is not a side × position matrix like the balance of payments, so each side carries its own tree.
  • Each identity's tolerance is derived, not chosen. All 3,450 values in the class are whole millions — verified, none with decimals — so every figure carries at most half a million of rounding error, and an identity with k components is bounded by ⌊(k+1)/2⌋.
  • On that rule, 18 identities are checked: net = assets − liabilities, the breakdown of each side by instrument, and short-term / long-term on each. Seventeen close across all quarters. The eighteenth does not: liabilities in 2011-Q3 are 136,750 against a component sum of 136,753 — a deviation of 3 against a tolerance of ±2. The tolerance is not raised to 3 to make it pass; the deviation is reported in unde.
  • Identities are checked over all positions and all quarters in the window, regardless of latura or nivel_max — a filter must not make the guarantee disappear.
  • The whole history fits in a single request.

What it is for

  • Romania's net position against the rest of the world, quarter by quarter.
  • The stock of foreign direct investment in Romania, split into equity and debt.
  • Short-term external debt against reserves — the coverage indicator.

Response structure

FieldTypeDescription
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[].trimestru string The quarter label, as it also appears in the keys of valori.
data.perioade[].data_referinta string The moment the stock refers to — the last day of the quarter. This is where you join to monthly data.
data.perioade[].luna_sursa string The month the source labels the quarter with. It is not the moment of measurement; it is given for joining back to the raw series.
data.pozitii[].cod string Code from the source code list — the key you filter on.
data.pozitii[].latura string net, active or pasive.
data.pozitii[].eticheta string Display label for the value — the readable version of the code next to it.
data.pozitii[].cale array The full hierarchical path, including the side segment.
data.pozitii[].nivel integer Level in the classification hierarchy — the deeper, the more detailed.
data.pozitii[].parinte null The parent position's code. null at the three roots.
data.pozitii[].unitate string Unit of measure of the values. Read it before plotting or summing them.
data.pozitii[].trimestre_publicate integer How many quarters the source actually published.
data.pozitii[].valori object The values of the series, by period.
data.identitati[].identitate string The identity being checked — which sum must equal which total.
data.identitati[].total string
data.identitati[].componente array The components that add up to the total.
data.identitati[].toleranta string Derived from the number of components, as ⌊(k+1)/2⌋.
data.identitati[].trimestre_verificate integer How many quarters entered the check.
data.identitati[].trimestre_inchise integer How many quarters closed within tolerance.
data.identitati[].abatere_maxima string Largest deviation found between the sum of components and the total.
data.identitati_neverificate array How many identities could not be checked, for lack of data on one side.
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.trimestre integer Quarters for which values exist.
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.identitati_verificate integer
meta.identitati_inchise integer How many identities closed within tolerance.
meta.nota_datare string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_laturi string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_identitati string How to read the identity checks in the response.
meta.nota_ierarhie string How to read the classification hierarchy and which levels must not be added together.
meta.nota_null string Why some values are missing: the source did not publish, did not compute, or suppressed them.
data.pozitii[].parinte_corectat Present only where the source name contradicts the code and the code was followed.
data.identitati[].unde The quarter that exceeds the tolerance, with the total and the component sum. Absent when the identity closes everywhere.
data.identitati.neverificate The declared identities the requested window could not check, each with its reason: serie_inexistenta (the source never publishes that component), nepublicata_in_fereastra (it exists, but not in this interval) or fara_perioada_completa (the components exist but never in the same period). The verified count changes with the window, and this says why.
meta.fara_date data is null and this says why. No investment position values in the database. The interval falls entirely outside the coverage (2007-Q1 → present). It overlaps but holds no values.
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/pozitie-investitionala
{
    "data": {
        "de_la": "2007-T1",
        "pana_la": "2026-T2",
        "unitate": "milioane EUR",
        "filtre": [],
        "perioade": [
            {
                "trimestru": "2007-T1",
                "data_referinta": "2007-03-31",
                "luna_sursa": "2007-01"
            }
        ],
        "pozitii": [
            {
                "cod": "PII6T_N",
                "latura": "net",
                "eticheta": "Poziţia netă",
                "cale": [
                    "Poziţia netă"
                ],
                "nivel": 1,
                "parinte": null,
                "unitate": "milioane EUR",
                "trimestre_publicate": 78,
                "valori": {
                    "2007-T1": "-42281",
                    "2007-T2": "-49074",
                    "2007-T3": "-54971",
                    "2007-T4": "-54305",
                    "2008-T1": "-57521",
                    "2008-T2": "-65081",
                    "2008-T3": "-68727",
                    "2008-T4": "-69090",
                    "2009-T1": "-69360",
                    "2009-T2": "-71797",
                    "2009-T3": "-73871",
                    "2009-T4": "-74814",
                    "2010-T1": "-77013",
                    "2010-T2": "-76388",
                    "2010-T3": "-78410",
                    "2010-T4": "-78995",
                    "2011-T1": "-83059",
                    "2011-T2": "-83314",
                    "2011-T3": "-82579",
                    "2011-T4": "-85558",
                    "2012-T1": "-85591",
                    "2012-T2": "-86012",
                    "2012-T3": "-86287",
                    "2012-T4": "-90628",
                    "2013-T1": "-89549",
                    "2013-T2": "-89642",
                    "2013-T3": "-89969",
                    "2013-T4": "-90640",
                    "2014-T1": "-88496",
                    "2014-T2": "-89960",
                    "2014-T3": "-88718",
                    "2014-T4": "-85967",
                    "2015-T1": "-86314",
                    "2015-T2": "-85772",
                    "2015-T3": "-85162",
                    "2015-T4": "-86480",
                    "2016-T1": "-85720",
                    "2016-T2": "-85304",
                    "2016-T3": "-88273",
                    "2016-T4": "-85989",
                    "2017-T1": "-88333",
                    "2017-T2": "-90647",
                    "2017-T3": "-90559",
                    "2017-T4": "-91177",
                    "2018-T1": "-93182",
                    "2018-T2": "-93679",
                    "2018-T3": "-96231",
                    "2018-T4": "-93335",
                    "2019-T1": "-93775",
                    "2019-T2": "-97596",
                    "2019-T3": "-99115",
                    "2019-T4": "-98940",
                    "2020-T1": "-92857",
                    "2020-T2": "-97341",
                    "2020-T3": "-100549",
                    "2020-T4": "-106419",
                    "2021-T1": "-105498",
                    "2021-T2": "-109358",
                    "2021-T3": "-109538",
                    "2021-T4": "-113368",
                    "2022-T1": "-114762",
                    "2022-T2": "-112430",
                    "2022-T3": "-110957",
                    "2022-T4": "-119327",
                    "2023-T1": "-119844",
                    "2023-T2": "-126557",
                    "2023-T3": "-127142",
                    "2023-T4": "-133106",
                    "2024-T1": "-134527",
                    "2024-T2": "-139450",
                    "2024-T3": "-147364",
                    "2024-T4": "-146006",
                    "2025-T1": "-149579",
                    "2025-T2": "-156146",
                    "2025-T3": "-162914",
                    "2025-T4": "-169560",
                    "2026-T1": "-167761",
                    "2026-T2": "-168202"
                }
            }
        ],
        "identitati": [
            {
                "identitate": "active = poziţia netă + pasive",
                "total": "PII6T_A",
                "componente": [
                    "PII6T_N",
                    "PII6T_P"
                ],
                "toleranta": "1",
                "trimestre_verificate": 78,
                "trimestre_inchise": 78,
                "abatere_maxima": "1"
            }
        ],
        "identitati_neverificate": []
    },
    "meta": {
        "sursa": "BNR — poziţia investiţională internaţională, metodologia BPM6.",
        "acoperire": {
            "de_la": "2007-T1",
            "pana_la": "2026-T2"
        },
        "trimestre": 78,
        "pozitii_totale": 51,
        "pozitii_returnate": 51,
        "identitati_verificate": 18,
        "identitati_inchise": 17,
        "nota_datare": "Valorile sunt stocuri la `data_referinta`, adică sfârşitul trimestrului — nu la `luna_sursa`, care e doar eticheta din sursă. Comparate pe etichetă cu date lunare, activele de rezervă ies cu până la 5.274 milioane de euro alături; decalate corect, se potrivesc pe toate trimestrele.",
        "nota_laturi": "Activele şi pasivele nu au aceleaşi poziţii: 22 comune, trei doar pe active (activele de rezervă, aurul monetar, rezerva valutară), una doar pe pasive (alocările de DST).",
        "nota_identitati": "17 din 18 identităţi se închid pe toate trimestrele. Toleranţa fiecăreia e derivată din numărul de componente — sursa publică milioane întregi, deci eroarea de rotunjire e mărginită de ⌊(k+1)/2⌋. Ce depăşeşte se raportează în `unde`, nu se acoperă lărgind toleranţa.",
        "nota_ierarhie": "`cale` şi `parinte` vin din denumire, verificate faţă de mnemonicul codului: 0 poziţii corectate. Mnemonicele se cuibăresc pe prefix de caractere (`IXNS` sub `IXN`), nu pe segmente despărţite de liniuţe.",
        "nota_null": "`null` într-un trimestru î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 80 quarters, a side outside the list, or nivel_max outside 1–4.
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 80 quarters, a side outside the list, or nivel_max outside 1–4.",
        "detalii": {
            "de_la": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}