oneapi
Sign in
Financiar v1 / RiscCredit

Foreign direct investment

18 positions across five levels, on the directional principle — as transactions (monthly since 2013 or quarterly) or as stocks (quarterly). The source's three classes have exactly the same codes.

The total means something different for stocks than for transactions, and the name does not warn you: both total series are called „Direct investment". Measured, on stocks total = abroad − Romania closes across all quarters, while on transactions total = abroad + Romania closes across all periods — each assumption fails on the other class, with deviations of hundreds of billions. On stocks the total is the net position, on transactions the net flow. The response says which identity it checked.

The figures do not match the international investment position, and that is correct. The difference is the same amount on both sides — 16,442.50 and 16,442.54 million in 2026-Q1 — across all quarters: it is the directional principle, with reverse investment offset, against the asset/liability principle of the IIP.

The quarterly transactions are exactly the sum of the monthly ones (every quarter, maximum deviation 0.01), so it is a verified aggregation, not independent data. The two series end aligned (2026-06 monthly, 2026-Q2 quarterly).

Mind the sign: on transactions R (residents' investment abroad) carries an INVERTED sign relative to stocks and to the balance of payments — an outflow is negative — so T = R + N is the net inflow.

Stocks carry data_referinta, transactions do not — a quarterly stock is measured at the end of the quarter, a flow covers the period.

GET
https://oneapi.ro/api/financiar/v1/investitii-directe

Query parameters

NameTypeDescriptionAccepted values
tipoptional string | null Optional, defaults to tranzactii. Or stocuri — note that the total changes meaning. tranzactiistocuri
frecventaoptional string | null Optional; defaults to the finest the source publishes for the requested type — lunar for transactions, trimestrial for stocks. Stocks × monthly does not exist. lunartrimestrial
de_laoptional string | null Optional, YYYY-MM or YYYY-Tn. At quarterly frequency a month is rounded to the quarter containing it. e.g. 2024-06-15
pana_laoptional string | null Optional, YYYY-MM or YYYY-Tn. e.g. 2024-06-15
nivel_maxoptional integer | null Optional, 1–5. Limits the depth of the tree. 1 – 5

How it behaves

  • Foreign direct investment on the directional principle — 18 positions across five levels, as transactions (monthly since January 2013, or quarterly) or as stocks (quarterly). The source's three classes carry exactly the same 18 codes, so this is one route with tip and frecventa.
  • The total means something different for stocks than for transactions, and the name gives no warning: both total series are called "Investiţii directe". Measured, for stocks total = abroad − in Romania closes across all quarters — it is the net position, −126,547 million euro in 2026-Q1. For transactions total = abroad + in Romania closes across all periods, because R — residents' investment abroad — carries an INVERTED sign relative to stocks and to the balance of payments: an outflow is negative, and T = R + N is the net inflow. Anyone comparing R with balance-of-payments assets flips its sign; the response also says so in meta.avertisment_semn. Each hypothesis fails on the other class, by hundreds of billions; applying one rule to both is off by 270 billion. The response states which was checked, in identitati[].operatie.
  • These figures do not match the ones in the international investment position, and that is correct. FDI in the IIP is 24,718 / 151,265; here it is 8,275 / 134,822. The gap is the same amount on both sides — 16,442.50 and 16,442.54 million — across all quarters: the directional principle nets out reverse investment, against the asset/liability principle of the IIP. This is not an inference: the NBR's own class name says "principiul direcţional".
  • Quarterly transactions are exactly the sum of the monthly ones — every quarter, maximum deviation 0.01. They are offered as a frequency for convenience, but they are a verified aggregation, not independent data; the two series end aligned (2026-06 monthly, 2026-Q2 quarterly).
  • Stocks carry data_referinta, transactions do not. A quarterly stock is measured at the end of the quarter, though the source labels it with the first month; a flow really does cover the period.
  • The tolerance is measured directly, not derived. In the investment position every value is a whole million, so the rounding error follows from the number of components. Here 4,301 of 4,730 values carry decimals (measured 15 Sep), up to six, so that rule does not apply — but the maximum deviation observed across the eight identities × three classes is 0.01, against a tolerance of 0.05.
  • The tree is asymmetric: the "in Romania" branch splits into loans, trade credit and other claims; the "abroad" branch does not. The path-versus-code check finds zero disagreements in all three classes.
  • No direction filter: the whole class is 18 positions and fits in one response.

What it is for

  • The monthly flow of foreign investment into Romania, four months fresher than the quarterly series.
  • The stock of FDI by sector — deposit-taking corporations against the rest of the economy.
  • Equity against debt instruments, that is, how much of FDI is intragroup lending.

Response structure

FieldTypeDescription
data.tip string intreprinderi or unitati_locale — two different concepts, never summed.
data.frecventa string How often the source publishes the series (daily, monthly, quarterly, yearly).
data.principiu string Always direcţional. It is why these figures differ from the investment position.
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[].perioada string The period the value refers to.
data.perioade[].luna_sursa string The month the source labels the period with, for joining back to the raw series.
data.pozitii[].cod string Code from the source code list — the key you filter on.
data.pozitii[].sufix string The code fragment shared by all three classes — NXDI is the same position in stocks and in transactions.
data.pozitii[].eticheta string Display label for the value — the readable version of the code next to it.
data.pozitii[].cale array Path through the hierarchy, from the root down to the current item.
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 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[].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[].operatie string diferenţă for the stock total, sumă everywhere else. It is the marker of the two meanings of the total.
data.identitati[].toleranta string Measured on the class, not derived from rounding — these values carry decimals.
data.identitati[].perioade_verificate integer
data.identitati[].perioade_inchise integer
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.perioade integer Periods 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_total string What the total includes and what stays outside it.
meta.avertisment_semn string
meta.nota_principiu string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_frecvente string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_toleranta string Where the tolerance comes from and why it is not zero.
meta.nota_null string Why some values are missing: the source did not publish, did not compute, or suppressed them.
data.perioade[].data_referinta Only for tip=stocuri: the end of the quarter, when the stock is measured.
data.identitati[].unde The period exceeding the tolerance. 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 values in the database for the requested combination. The interval falls entirely outside the coverage. It overlaps the coverage 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/investitii-directe
{
    "data": {
        "tip": "tranzactii",
        "frecventa": "lunar",
        "principiu": "direcţional",
        "de_la": "2013-01",
        "pana_la": "2026-07",
        "unitate": "milioane EUR",
        "filtre": [],
        "perioade": [
            {
                "perioada": "2013-01",
                "luna_sursa": "2013-01"
            }
        ],
        "pozitii": [
            {
                "cod": "IDT6L_T",
                "sufix": "T",
                "eticheta": "Investiţii directe",
                "cale": [
                    "Investiţii directe"
                ],
                "nivel": 1,
                "parinte": null,
                "unitate": "milioane EUR",
                "perioade_publicate": 163,
                "valori": {
                    "2013-01": "300.39",
                    "2013-02": "97.60",
                    "2013-03": "659.58",
                    "2013-04": "-344.28",
                    "2013-05": "258.93",
                    "2013-06": "-151.23",
                    "2013-07": "57.99",
                    "2013-08": "322.00",
                    "2013-09": "351.49",
                    "2013-10": "110.43",
                    "2013-11": "215.10",
                    "2013-12": "1045.94",
                    "2014-01": "318.33",
                    "2014-02": "312.73",
                    "2014-03": "58.32",
                    "2014-04": "110.24",
                    "2014-05": "345.12",
                    "2014-06": "161.94",
                    "2014-07": "637.45",
                    "2014-08": "22.08",
                    "2014-09": "201.54",
                    "2014-10": "293.25",
                    "2014-11": "281.13",
                    "2014-12": "-40.08",
                    "2015-01": "383.87",
                    "2015-02": "-152.42",
                    "2015-03": "757.40",
                    "2015-04": "-79.46",
                    "2015-05": "56.82",
                    "2015-06": "647.95",
                    "2015-07": "222.99",
                    "2015-08": "55.39",
                    "2015-09": "546.79",
                    "2015-10": "617.26",
                    "2015-11": "-315.37",
                    "2015-12": "213.28",
                    "2016-01": "60.01",
                    "2016-02": "722.53",
                    "2016-03": "68.29",
                    "2016-04": "343.23",
                    "2016-05": "323.45",
                    "2016-06": "560.29",
                    "2016-07": "712.29",
                    "2016-08": "248.02",
                    "2016-09": "243.47",
                    "2016-10": "177.76",
                    "2016-11": "172.12",
                    "2016-12": "881.81",
                    "2017-01": "285.80",
                    "2017-02": "569.06",
                    "2017-03": "244.47",
                    "2017-04": "134.29",
                    "2017-05": "332.41",
                    "2017-06": "110.80",
                    "2017-07": "647.34",
                    "2017-08": "683.06",
                    "2017-09": "782.94",
                    "2017-10": "434.10",
                    "2017-11": "312.49",
                    "2017-12": "346.13",
                    "2018-01": "305.15",
                    "2018-02": "477.92",
                    "2018-03": "661.52",
                    "2018-04": "108.45",
                    "2018-05": "25.75",
                    "2018-06": "15.03",
                    "2018-07": "646.34",
                    "2018-08": "1021.55",
                    "2018-09": "1022.36",
                    "2018-10": "220.28",
                    "2018-11": "220.25",
                    "2018-12": "220.38",
                    "2019-01": "648.06",
                    "2019-02": "814.41",
                    "2019-03": "-258.65",
                    "2019-04": "784.55",
                    "2019-05": "-130.58",
                    "2019-06": "832.17",
                    "2019-07": "659.56",
                    "2019-08": "931.99",
                    "2019-09": "95.09",
                    "2019-10": "24.88",
                    "2019-11": "40.89",
                    "2019-12": "406.67",
                    "2020-01": "916.22",
                    "2020-02": "-242.13",
                    "2020-03": "-1074.74",
                    "2020-04": "355.99",
                    "2020-05": "800.07",
                    "2020-06": "236.68",
                    "2020-07": "223.53",
                    "2020-08": "256.51",
                    "2020-09": "196.29",
                    "2020-10": "439.74",
                    "2020-11": "254.66",
                    "2020-12": "595.47",
                    "2021-01": "625.81",
                    "2021-02": "432.13",
                    "2021-03": "975.05",
                    "2021-04": "243.23",
                    "2021-05": "92.44",
                    "2021-06": "1166.30",
                    "2021-07": "210.91",
                    "2021-08": "595.21",
                    "2021-09": "1919.88",
                    "2021-10": "1459.36",
                    "2021-11": "200.34",
                    "2021-12": "927.62",
                    "2022-01": "849.42",
                    "2022-02": "1014.65",
                    "2022-03": "970.64",
                    "2022-04": "436.76",
                    "2022-05": "434.73",
                    "2022-06": "659.20",
                    "2022-07": "1528.39",
                    "2022-08": "239.03",
                    "2022-09": "1248.34",
                    "2022-10": "1054.76",
                    "2022-11": "217.94",
                    "2022-12": "701.18",
                    "2023-01": "512.45",
                    "2023-02": "686.55",
                    "2023-03": "750.60",
                    "2023-04": "163.30",
                    "2023-05": "27.42",
                    "2023-06": "314.29",
                    "2023-07": "1109.51",
                    "2023-08": "643.93",
                    "2023-09": "639.04",
                    "2023-10": "718.51",
                    "2023-11": "693.78",
                    "2023-12": "105.95",
                    "2024-01": "961.25",
                    "2024-02": "324.71",
                    "2024-03": "632.08",
                    "2024-04": "-249.92",
                    "2024-05": "-221.70",
                    "2024-06": "290.14",
                    "2024-07": "800.78",
                    "2024-08": "951.35",
                    "2024-09": "711.86",
                    "2024-10": "627.85",
                    "2024-11": "-298.37",
                    "2024-12": "211.39",
                    "2025-01": "365.30",
                    "2025-02": "393.30",
                    "2025-03": "736.16",
                    "2025-04": "547.08",
                    "2025-05": "631.07",
                    "2025-06": "737.39",
                    "2025-07": "1181.85",
                    "2025-08": "633.70",
                    "2025-09": "1142.53",
                    "2025-10": "124.96",
                    "2025-11": "511.87",
                    "2025-12": "541.62",
                    "2026-01": "343.82",
                    "2026-02": "641.44",
                    "2026-03": "203.74",
                    "2026-04": "-284.92",
                    "2026-05": "-213.77",
                    "2026-06": "-180.71",
                    "2026-07": "446.70"
                }
            }
        ],
        "identitati": [
            {
                "identitate": "total = investiţii în străinătate + investiţii în România (fluxul net)",
                "total": "IDT6L_T",
                "componente": [
                    "IDT6L_R",
                    "IDT6L_N"
                ],
                "operatie": "sumă",
                "toleranta": "0.05",
                "perioade_verificate": 163,
                "perioade_inchise": 163,
                "abatere_maxima": "0.01"
            }
        ],
        "identitati_neverificate": []
    },
    "meta": {
        "sursa": "BNR — investiţii directe, principiul direcţional (clasa 1367).",
        "acoperire": {
            "de_la": "2013-01",
            "pana_la": "2026-07"
        },
        "perioade": 163,
        "pozitii_totale": 18,
        "pozitii_returnate": 18,
        "identitati_verificate": 8,
        "identitati_inchise": 8,
        "nota_total": "La tranzacţii totalul e intrarea netă: `total = străinătate + România`, verificat pe toate perioadele, fiindcă `R` (investiţiile rezidenţilor în străinătate) vine cu semn INVERSAT faţă de stocuri şi de balanţa de plăţi — o ieşire de capital e negativă. Ipoteza diferenţei pică în toate.",
        "avertisment_semn": "`R` are aici semn inversat faţă de `tip=stocuri` şi faţă de activele de investiţii directe din /financiar/v1/balanta-plati: o investiţie a rezidenţilor în străinătate apare NEGATIVĂ. `T = R + N` e intrarea netă. Schimbă semnul lui `R` înainte să-l compari cu balanţa de plăţi.",
        "nota_principiu": "Principiul direcţional compensează investiţia inversă, deci cifrele sunt mai mici decât investiţiile directe din poziţia investiţională, care e pe principiul activ/pasiv. Diferenţa e aceeaşi sumă pe ambele laturi în toate trimestrele — 16.442,50 şi 16.442,54 milioane în 2026-T1.",
        "nota_frecvente": "Tranzacţiile trimestriale sunt exact suma celor lunare (toate trimestrele, abatere maximă 0,01) — o agregare verificată, nu date independente. Cele două serii se opresc aliniat: ultima lună e ultima lună a ultimului trimestru.",
        "nota_toleranta": "Toleranţa de ±0.05 e măsurată direct, nu derivată: aici circa nouă valori din zece au zecimale, deci regula de rotunjire folosită la poziţia investiţională nu se aplică. Abaterea maximă observată pe cele opt identităţi × trei clase e 0,01.",
        "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 180 periods, a type or frequency outside the list, nivel_max outside 1–5. combinatie_inexistenta — stocks at monthly frequency; the response lists the published combinations.
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 180 periods, a type or frequency outside the list, nivel_max outside 1–5. combinatie_inexistenta — stocks at monthly frequency; the response lists the published combinations.",
        "detalii": {
            "tip": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}