oneapi
Sign in
Financiar v1 / TitluriStat

Government securities fixing

The bid and ask yields of Romanian government securities, at the five published maturities: 6 months, 12 months, 3, 5 and 10 years. A daily series since January 2011.

These are YIELDS, not prices, and the bid/ask relationship inverts. You buy at the ask price, which is higher, so the corresponding yield is LOWER. Verified across all 19,710 pairs since 2011: bid > ask in 100% of cases, without a single exception.

That is why spread comes already computed as bid − ask, positive. Anyone computing it the other way round, out of price reflex, gets a negative number and concludes the data is broken. The historical mean is 0.28 percentage points, between 0.14 and 0.51 — so it is also a liquidity benchmark.

The points come ordered by actual maturity, not alphabetically: sorted as text they would come out 10Y, 12M, 3Y, 5Y, 6M. luni gives the order and serves the interpolation.

A day with no publication has valoare empty, and the last preceding fixing comes back in ultima.

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

Query parameters

NameTypeDescriptionAccepted values
datarequired string Required, YYYY-MM-DD. Cannot be in the future. e.g. 2024-06-15e.g. 2024-01-15e.g. 2023-06-15

How it behaves

  • ?data= is required, and the response always has the same shape: data (the day you asked for), valoare (filled ONLY if we have that exact day) and ultima (the last day published on or before it, with its value). valoare stays empty DELIBERATELY when the requested day has no publication — a figure from another day sits separately, under ultima, so it cannot be used by mistake in a calculation. Missing data is no longer an error: the response is 200, and comparing data with ultima.data tells you everything.
  • Bid and ask yields on Romanian government securities, across the five maturities published by NBR: 6 months, 12 months, 3, 5 and 10 years. Daily series since January 2011.
  • These are YIELDS, not prices, and the bid/ask relationship inverts. You buy at the ask price, which is higher, so the corresponding yield is LOWER. Verified across all 19,710 pairs since 2011: bid > ask in 100% of cases, without a single exception.
  • That is why spread is returned already computed as bid − ask, positive. Anyone computing it the other way, from the reflex of prices, gets a negative number and concludes the data is broken. The unit is percentage points of yield.
  • The spread also serves as a liquidity gauge. The historical average is 0.28 points, between 0.14 and 0.51 — but on 19 March 2020, at the height of the crisis, it ran between 0.33 and 0.46 across all maturities, against 0.17–0.30 in calm periods.
  • Points come ordered by REAL maturity, not alphabetically. Sorted as text they would read 10Y, 12M, 3Y, 5Y, 6M — a curve drawn that way looks like noise. luni gives the ordering and serves for interpolation.
  • A day without publication has valoare empty, and the last preceding fixing comes back in ultima. No age ceiling. All maturities come from the SAME day: a curve that mixes market moments is not a curve.
  • This is the Romanian sovereign curve. For the euro area one, across 11 maturities and two issuer variants, see /bce/curba — they are different markets and should not be read together without knowing that.

What it is for

  • The yield the market demands on Romanian sovereign debt.
  • Discounting a leu-denominated cash flow at market yields.
  • Tracking market liquidity through the evolution of the spread.

Response structure

FieldTypeDescription
data.data string The day you asked for, exactly as you sent it.
data.valoare null The fixing for the requested day: {unitate, puncte[]}. null if that day has no publication.
data.ultima object The last day published on or before data, with its fixing: {data, valoare}. null only if nothing exists before the requested day.
data.ultima.data string
data.ultima.valoare.unitate string Always procent_pe_an.
data.ultima.valoare.puncte[].maturitate string The maturity label (6M, 12M, 3Y, 5Y, 10Y).
data.ultima.valoare.puncte[].denumire string The name, exactly as the source publishes it.
data.ultima.valoare.puncte[].luni integer The maturity in months — the real ordering and the basis for interpolation.
data.ultima.valoare.puncte[].bid string The bid yield. HIGHER than ask, because these are yields.
data.ultima.valoare.puncte[].ask string The ask yield.
data.ultima.valoare.puncte[].mid string The midpoint between bid and ask — the value to chart.
data.ultima.valoare.puncte[].spread string bid − ask, in percentage points. Already positive.
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.nota_randamente string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_spread string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_ordine string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_zi string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.fara_valori Maturities with no quote that day. Appears only when something is missing.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/titluri-stat/fixing?data=2024-06-15
{
    "data": {
        "data": "2024-06-15",
        "valoare": null,
        "ultima": {
            "data": "2024-06-14",
            "valoare": {
                "unitate": "procent_pe_an",
                "puncte": [
                    {
                        "maturitate": "6M",
                        "denumire": "şase luni",
                        "luni": 6,
                        "bid": "6.09",
                        "ask": "5.79",
                        "mid": "5.94",
                        "spread": "0.30"
                    }
                ]
            }
        }
    },
    "meta": {
        "sursa": "BNR — fixing titluri de stat (baza de date interactivă).",
        "acoperire": {
            "de_la": "2011-01-10",
            "pana_la": "2026-09-21"
        },
        "nota_randamente": "Valorile sunt RANDAMENTE, nu preţuri. De aceea `bid` e mai mare decât `ask`: cumperi la preţul ask, care e mai mare, deci randamentul e mai mic. Verificat pe 19.710 perechi din 2011: bid > ask în 100% din cazuri.",
        "nota_spread": "`spread` e `bid − ask`, în puncte procentuale de randament, deja pozitiv. Calculat invers ar da un număr negativ. Media istorică: 0,28 puncte, între 0,14 şi 0,51.",
        "nota_ordine": "Punctele sunt ordonate pe maturitate reală. Sortate alfabetic ar ieşi `10Y, 12M, 3Y, 5Y, 6M` — o curbă desenată aşa arată ca zgomot.",
        "nota_zi": "Ziua cerută nu are publicare. `valoare` e gol DELIBERAT, ca să nu fie folosită o cifră care nu e a zilei cerute; ultima publicată înainte de ea e în `ultima`."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareMalformed or future date.
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": "Malformed or future date.",
        "detalii": {
            "data": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}