oneapi
Sign in
Financiar v1 / RiscCredit

Debt securities holdings

Who holds paper issued by whom: debt securities by issuing and holding sector. Cells flagged zero_structural are zero by definition, not missing data.

GET
https://oneapi.ro/api/financiar/v1/titluri-datorie

Query parameters

NameTypeDescriptionAccepted values
detinatoroptional string | null Optional — fixes a row: toti, rezidenti, financiare, administratie, gospodarii, nefinanciare, nerezidenti. totirezidentifinanciareadministratiegospodariinefinanciarenerezidenti
emitentoptional string | null Optional — fixes a column, with the same values. With both parameters you get a single cell through time. totirezidentifinanciareadministratiegospodariinefinanciarenerezidenti
de_laoptional string | null Optional, YYYY-Tn or YYYY-MM. e.g. 2024-06-15
pana_laoptional string | null Optional, YYYY-Tn or YYYY-MM. e.g. 2024-06-15e.g. 2024-06-30

How it behaves

  • The matrix of debt-securities holdings: rows are the sector holding the paper, columns the sector that issued it. 55 quarters, 2012-Q4 → present, in millions of EUR, two decimals.
  • The 45 series are the filled cells of a 7×7 table, not a list. The gaps are not omissions: "all holders × all issuers" is not a meaningful cell, and non-residents' holdings of non-resident paper fall outside Romanian statistics. What exists for each holder is listed in data.sectoare[*].ca_detinator, and a non-existent pair returns 404 with the list rather than an empty response.
  • The source publishes a separate aggregate, "holdings of non-residents", with no issuer in its name. Checked across all 55 quarters, it is exactly the sum of non-resident holdings of resident paper, so the route exposes it as the nerezidenti × rezidenti cell rather than as an eighth sector — the matrix stays regular for whoever reads it.
  • The matrix closes without exception. The 23 identities that follow from its three rules — residents are the sum of the four domestic sectors, both along rows and along columns; the total is residents plus non-residents; the non-resident aggregate closes the corner — are checked on every request, at the strict class tolerance of (k+1) × 0.005. Across the whole history: every check closes, with maximum deviations of 0.01–0.02 — rounding of the second decimal, within tolerance.
  • Eight cells are zero throughout the history, and they are real zeros. Households do not issue debt securities, so the entire "issued by households" column is zero by construction, as is general government holding corporate bonds. They are returned flagged zero_structural, not omitted: leaving them out would suggest missing data where the answer is "zero, and it stays zero".
  • These are end-of-quarter balances: data_referinta is 31.03 / 30.06 / 30.09 / 31.12. The source labels the period as a quarter (2012-T4); luna_sursa is only the starting month it is stored under, not the moment of measurement.
  • External debt by maturity and debtor is at /datorie-externa. This is a different thing: who holds the paper, residents holding resident-issued securities included.

What it is for

  • How much of the Romanian state's paper non-residents hold, quarter by quarter.
  • The domestic financial sector's exposure to sovereign versus corporate debt.
  • How thin the Romanian corporate bond market is next to the government one.

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 the value refers to.
data.perioade[].data_referinta string The end of the quarter, when the balance is measured.
data.perioade[].luna_sursa string The month as the source labels it, before normalisation.
data.sectoare object Each sector's label, whether it is an aggregate or an elementary sector, and the issuers that exist for it as a holder.
data.sectoare.toti.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.toti.agregat boolean The aggregate the value belongs to.
data.sectoare.toti.ca_detinator array Values seen from the holder side of the instrument.
data.sectoare.rezidenti.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.rezidenti.agregat boolean The aggregate the value belongs to.
data.sectoare.rezidenti.ca_detinator array Values seen from the holder side of the instrument.
data.sectoare.financiare.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.financiare.agregat boolean The aggregate the value belongs to.
data.sectoare.financiare.ca_detinator array Values seen from the holder side of the instrument.
data.sectoare.administratie.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.administratie.agregat boolean The aggregate the value belongs to.
data.sectoare.administratie.ca_detinator array Values seen from the holder side of the instrument.
data.sectoare.gospodarii.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.gospodarii.agregat boolean The aggregate the value belongs to.
data.sectoare.gospodarii.ca_detinator array Values seen from the holder side of the instrument.
data.sectoare.nefinanciare.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.nefinanciare.agregat boolean The aggregate the value belongs to.
data.sectoare.nefinanciare.ca_detinator array Values seen from the holder side of the instrument.
data.sectoare.nerezidenti.eticheta string Display label for the value — the readable version of the code next to it.
data.sectoare.nerezidenti.agregat boolean The aggregate the value belongs to.
data.sectoare.nerezidenti.ca_detinator array Values seen from the holder side of the instrument.
data.celule[].cod string Code from the source code list — the key you filter on.
data.celule[].detinator string
data.celule[].detinator_eticheta string
data.celule[].emitent string The institution that issued the information.
data.celule[].emitent_eticheta string
data.celule[].unitate string Unit of measure of the values. Read it before plotting or summing them.
data.celule[].trimestre_publicate integer In how many quarters of the window the cell actually has a value.
data.celule[].zero_structural boolean The cell is zero across the whole history of the class, not just the requested window — a real zero, not a gap.
data.celule[].valori object The values of the series, by period.
data.identitati.nota string A note on how to read the data — a pitfall, a convention or a limit of the source.
data.identitati.identitati_declarate integer
data.identitati.identitati integer The identity checks run on the values in the response.
data.identitati.identitati_inchise integer How many identities closed within tolerance.
data.identitati.identitati_neverificate integer How many identities could not be checked, for lack of data on one side.
data.identitati.verificari integer How many combinations were checked.
data.identitati.verificari_inchise integer How many checks closed within tolerance.
data.identitati.detalii[] array The matrix's 23 identities, checked on every request, each with its maximum deviation.
data.identitati.detalii[].identitate string The identity being checked — which sum must equal which total.
data.identitati.detalii[].toleranta string How much deviation is accepted before the identity counts as unclosed — the source rounding, not an error.
data.identitati.detalii[].trimestre_verificate integer How many quarters entered the check.
data.identitati.detalii[].trimestre_inchise integer How many quarters closed within tolerance.
data.identitati.detalii[].abatere_maxima string Largest deviation found between the sum of components and the total.
data.identitati.neverificate array 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.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.celule_totale integer
meta.celule_returnate integer
meta.nota_matrice 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_zero string What a zero means here: a measured null value, not missing data.
meta.nota_frecventa string Which frequencies the source publishes and which of them are not comparable.
meta.nota_datorie 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.
meta.fara_date data is null and this says why. No values in the database. The interval overlaps the coverage (2012-Q4 → present) but holds no values; in_afara_acoperirii when it falls entirely outside.
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/titluri-datorie
{
    "data": {
        "de_la": "2012-T4",
        "pana_la": "2026-T2",
        "unitate": "mil. EUR",
        "filtre": [],
        "perioade": [
            {
                "trimestru": "2012-T4",
                "data_referinta": "2012-12-31",
                "luna_sursa": "2012-10"
            }
        ],
        "sectoare": {
            "toti": {
                "eticheta": "toate sectoarele",
                "agregat": true,
                "ca_detinator": [
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare"
                ]
            },
            "rezidenti": {
                "eticheta": "rezidenţi",
                "agregat": true,
                "ca_detinator": [
                    "toti",
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare",
                    "nerezidenti"
                ]
            },
            "financiare": {
                "eticheta": "societăţi financiare",
                "agregat": false,
                "ca_detinator": [
                    "toti",
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare",
                    "nerezidenti"
                ]
            },
            "administratie": {
                "eticheta": "administraţia publică",
                "agregat": false,
                "ca_detinator": [
                    "toti",
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare",
                    "nerezidenti"
                ]
            },
            "gospodarii": {
                "eticheta": "gospodării şi instituţii fără scop lucrativ în serviciul lor",
                "agregat": false,
                "ca_detinator": [
                    "toti",
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare",
                    "nerezidenti"
                ]
            },
            "nefinanciare": {
                "eticheta": "societăţi nefinanciare",
                "agregat": false,
                "ca_detinator": [
                    "toti",
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare",
                    "nerezidenti"
                ]
            },
            "nerezidenti": {
                "eticheta": "nerezidenţi",
                "agregat": true,
                "ca_detinator": [
                    "rezidenti",
                    "financiare",
                    "administratie",
                    "gospodarii",
                    "nefinanciare"
                ]
            }
        },
        "celule": [
            {
                "cod": "DSET_FB_ALL_DS_RES",
                "detinator": "toti",
                "detinator_eticheta": "toate sectoarele",
                "emitent": "rezidenti",
                "emitent_eticheta": "rezidenţi",
                "unitate": "mil. Euro",
                "trimestre_publicate": 55,
                "zero_structural": false,
                "valori": {
                    "2012-T4": "32196.32",
                    "2013-T1": "34946.77",
                    "2013-T2": "35784.87",
                    "2013-T3": "37636.41",
                    "2013-T4": "37764.24",
                    "2014-T1": "40483.69",
                    "2014-T2": "42609.06",
                    "2014-T3": "43503.63",
                    "2014-T4": "45845.75",
                    "2015-T1": "48765.34",
                    "2015-T2": "45715.97",
                    "2015-T3": "46640.82",
                    "2015-T4": "48184.95",
                    "2016-T1": "49735.57",
                    "2016-T2": "49180.99",
                    "2016-T3": "51448.75",
                    "2016-T4": "51878.91",
                    "2017-T1": "53374.59",
                    "2017-T2": "55286.10",
                    "2017-T3": "55031.01",
                    "2017-T4": "55151.48",
                    "2018-T1": "56595.27",
                    "2018-T2": "55515.36",
                    "2018-T3": "57868.82",
                    "2018-T4": "61072.46",
                    "2019-T1": "60011.44",
                    "2019-T2": "64533.27",
                    "2019-T3": "70324.99",
                    "2019-T4": "72346.85",
                    "2020-T1": "74861.39",
                    "2020-T2": "82170.82",
                    "2020-T3": "88030.74",
                    "2020-T4": "96951.38",
                    "2021-T1": "96499.23",
                    "2021-T2": "100305.96",
                    "2021-T3": "103679.41",
                    "2021-T4": "101650.39",
                    "2022-T1": "98354.18",
                    "2022-T2": "91932.42",
                    "2022-T3": "94056.28",
                    "2022-T4": "98742.37",
                    "2023-T1": "113512.04",
                    "2023-T2": "119862.98",
                    "2023-T3": "123586.55",
                    "2023-T4": "131697.27",
                    "2024-T1": "145205.92",
                    "2024-T2": "147974.65",
                    "2024-T3": "161891.15",
                    "2024-T4": "161371.51",
                    "2025-T1": "167479.84",
                    "2025-T2": "173424.77",
                    "2025-T3": "183176.39",
                    "2025-T4": "190887.82",
                    "2026-T1": "194885.35",
                    "2026-T2": "196132.84"
                }
            }
        ],
        "identitati": {
            "nota": "Matricea e guvernată de trei reguli: rezidenţii sunt suma celor patru sectoare interne, şi pe linie şi pe coloană; totalul e rezidenţi plus nerezidenţi; agregatul „deţineri ale nerezidenţilor” închide colţul nerezident. Toate identităţile care decurg din ele se verifică la fiecare cerere.",
            "identitati_declarate": 23,
            "identitati": 23,
            "identitati_inchise": 23,
            "identitati_neverificate": 0,
            "verificari": 1265,
            "verificari_inchise": 1265,
            "detalii": [
                {
                    "identitate": "titlurile rezidente ţinute de toate sectoarele = suma pe cei patru emitenţi rezidenţi",
                    "toleranta": "0.025000",
                    "trimestre_verificate": 55,
                    "trimestre_inchise": 55,
                    "abatere_maxima": "0.01"
                }
            ],
            "neverificate": []
        }
    },
    "meta": {
        "sursa": "BNR — deţineri de titluri de datorie, pe sector deţinător şi sector emitent (clasa 1447).",
        "acoperire": {
            "de_la": "2012-T4",
            "pana_la": "2026-T2"
        },
        "trimestre": 55,
        "celule_totale": 45,
        "celule_returnate": 45,
        "nota_matrice": "Cele 45 de serii sunt celulele completate ale unui tabel deţinător × emitent. Golurile nu sunt lipsuri: „toţi × toţi” n-are sens, iar deţinerile nerezidenţilor în titluri nerezidente cad în afara statisticii româneşti. Ce există pentru fiecare deţinător e în `data.sectoare[*].ca_detinator`.",
        "nota_identitati": "23 din 23 identităţi se închid pe toate trimestrele lor, pe 1265 verificări, cu toleranţa strictă de clasă.",
        "nota_zero": "8 celule sunt zero pe toată istoria, şi sunt zerouri reale: gospodăriile nu emit titluri de datorie, iar administraţia publică nu ţine obligaţiuni corporative. Se întorc marcate `zero_structural`, nu omise.",
        "nota_frecventa": "Sunt solduri trimestriale. `data_referinta` e sfârşitul trimestrului, nu luna din etichetă.",
        "nota_datorie": "Datoria faţă de străinătate pe scadenţe şi debitori e la /financiar/v1/datorie-externa; aici e cine deţine hârtia, inclusiv rezidenţi ţinând titluri rezidente.",
        "nota_null": "`null` într-un trimestru înseamnă că celula 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.
422validareA sector outside the list, or interval_prea_lung beyond 90 quarters. combinatie_indisponibila — the pair is not a cell of the matrix; the response lists the issuers that exist for that holder.
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": "A sector outside the list, or interval_prea_lung beyond 90 quarters. combinatie_indisponibila — the pair is not a cell of the matrix; the response lists the issuers that exist for that holder.",
        "detalii": {
            "detinator": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}