oneapi
Sign in
Financiar v1 / Spread

Sovereign risk premium

How much more expensively Romania borrows than the euro area, at the same maturity: the yield from the NBR fixing minus the corresponding point on the ECB curve, in basis points.

The route exists because the alignment is where the mistake happens, not the subtraction. The calendars do not coincide: 38 Romanian days have no ECB day (Orthodox Easter, 31 December), 103 ECB days have no Romanian day (2, 6 and 7 January), and the ECB publishes with a day's delay — today the NBR has 26 August, the ECB has 25. Anyone taking „the last value" from each side compares different days without knowing it. Here the day is a single one, and when the requested day has no counterpart it falls back to the last complete day, returned in ultima, with its own date.

The issuer is not chosen on the client's behalf. The ECB publishes two curves, both „euro area": AAA issuers only (aaa, the default) and all governments (toti_emitentii). At 10 years, the historical medians are 407 and 334 basis points — 73 points apart, meaning a silent choice would change the answer by a quarter.

All five fixing maturities have an exact counterpart on the ECB curve — 6M↔6M, 12M↔1Y, 3Y↔3Y, 5Y↔5Y, 10Y↔10Y — so nothing is interpolated to make the subtraction possible.

Across the 3,891 common days (since 10 January 2011), the spread has never been negative, at any maturity and for either issuer.

GET
https://oneapi.ro/api/financiar/v1/spread/suveran

Query parameters

NameTypeDescriptionAccepted values
maturitateoptional string | null Optional: 6M, 12M, 3Y, 5Y, 10Y. Defaults to 10Y — the maturity the risk premium is quoted at. 6M12M3Y5Y10Y
emitentoptional string | null Optional: aaa (default) or toti_emitentii. Which of the ECB's two curves is the benchmark. aaatoti_emitentii
datarequired string Required, YYYY-MM-DD. Cannot be in the future. e.g. 2024-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.
  • How much more expensively Romania borrows than the euro area at the same maturity: the yield from the NBR fixing minus the matching point on the ECB curve, in basis points.
  • This route exists because alignment is where the mistake happens, not the subtraction. The calendars do not coincide: 38 Romanian days have no ECB day (Orthodox Easter, 31 December) and 103 ECB days have no Romanian one (2, 6 and 7 January). On top of that, the ECB publishes one day late. Taking "the latest value" from each side compares different days without knowing it — here the day is a single one, asked for as such from the database.
  • That is why, when the requested day has no counterpart on both sources, valoare is empty and the last day on which BOTH published comes back in ultima — not the NBR's last day. No age ceiling.
  • The issuer is not chosen on the client's behalf. The ECB publishes two curves, both "euro area": AAA-rated issuers only (aaa, the default) and all central governments (toti_emitentii). At 10 years the historical medians are 407 and 334 basis points — 73 points apart, meaning a silent choice would change the answer by a quarter.
  • All five fixing maturities have an exact counterpart on the ECB curve: 6M↔6M, 12M↔1Y, 3Y↔3Y, 5Y↔5Y, 10Y↔10Y. Nothing is interpolated to make the subtraction possible; the only difference is spelling, and zona_euro.punct_curba says what the ECB calls it.
  • Across the 3,891 common days (10 January 2011 onward), the spread has never been negative, at any maturity and for either issuer. Medians against AAA: 343 bp at 6M, 359 at 12M, 404 at 3Y, 423 at 5Y, 407 at 10Y.
  • The Romanian yield is the day's mid, but bid and ask come alongside: anyone wanting the spread against a specific side has it without a second request.

What it is for

  • The risk premium the market demands on Romanian sovereign debt.
  • The benchmark for pricing a Romanian euro issue or a corporate bond.
  • Tracking convergence with, or divergence from, euro-area funding costs over time.

Response structure

FieldTypeDescription
data.data string The day BOTH yields come from.
data.valoare null The spread for the requested day. null if both sources did not publish on that day.
data.ultima object The last day on which BOTH published, on or before data: {data, valoare}. It is not the NBR's last day — the calendars do not coincide.
data.ultima.data string
data.ultima.valoare.maturitate string The maturity, as the NBR names it.
data.ultima.valoare.luni integer Number of months covered.
data.ultima.valoare.romania.randament string The mid of the NBR fixing, percent per year.
data.ultima.valoare.romania.bid string The bid side. HIGHER than ask: these are yields, not prices.
data.ultima.valoare.romania.ask string The ask side.
data.ultima.valoare.romania.sursa string
data.ultima.valoare.zona_euro.randament string The point on the ECB curve, percent per year. It can be negative — in March 2020 it was.
data.ultima.valoare.zona_euro.emitent string Which curve was used.
data.ultima.valoare.zona_euro.punct_curba string What the ECB calls the point: 1Y where the NBR writes 12M.
data.ultima.valoare.zona_euro.sursa string
data.ultima.valoare.spread.puncte_de_baza integer The difference, as a whole number of basis points — how the risk premium is quoted.
data.ultima.valoare.spread.puncte_procentuale string The same difference in percentage points, so it ties back to the yields above.
meta.surse.romania string
meta.surse.zona_euro string
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.acoperire.zile integer Number of days covered.
meta.nota_zi string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_zi_comuna string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_emitent string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_maturitati string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_istoric string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.curba_romaneasca string
meta.curba_zonei_euro string

Response examples

GEThttps://oneapi.ro/api/financiar/v1/spread/suveran?data=2024-06-15
{
    "data": {
        "data": "2024-06-15",
        "valoare": null,
        "ultima": {
            "data": "2024-06-14",
            "valoare": {
                "maturitate": "10Y",
                "luni": 120,
                "romania": {
                    "randament": "6.78",
                    "bid": "6.89",
                    "ask": "6.66",
                    "sursa": "BNR — fixing titluri de stat"
                },
                "zona_euro": {
                    "randament": "2.41",
                    "emitent": "aaa",
                    "punct_curba": "10Y",
                    "sursa": "BCE — curba randamentelor zonei euro"
                },
                "spread": {
                    "puncte_de_baza": 437,
                    "puncte_procentuale": "4.37"
                }
            }
        }
    },
    "meta": {
        "surse": {
            "romania": "BNR — fixing titluri de stat (baza de date interactivă).",
            "zona_euro": "BCE — curba randamentelor titlurilor guvernamentale din zona euro."
        },
        "acoperire": {
            "de_la": "2011-01-10",
            "pana_la": "2026-09-18",
            "zile": 3909
        },
        "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`.",
        "nota_zi_comuna": "Ambele randamente vin din ACEEAŞI zi. Calendarele nu coincid — 38 de zile româneşti n-au zi BCE, 103 zile BCE n-au zi românească — iar BCE publică cu o zi întârziere, deci ziua implicită e ultima în care au publicat amândoi, nu azi.",
        "nota_emitent": "BCE publică două curbe, ambele „zona euro\": `aaa` (doar emitenţii AAA) şi `toti_emitentii`. La 10 ani medianele istorice sunt 407 şi 334 de puncte de bază — alegerea schimbă răspunsul, deci e a clientului.",
        "nota_maturitati": "Cele cinci maturităţi ale fixing-ului au corespondent exact pe curba BCE (12M la BNR e 1Y la BCE). Nu se interpolează nimic pentru comparaţie.",
        "nota_istoric": "În cele 3.891 de zile comune din 2011 încoace, spread-ul n-a fost niciodată negativ. Medianele pe maturitate, faţă de AAA: 343 pb la 6M, 359 la 12M, 404 la 3Y, 423 la 5Y, 407 la 10Y.",
        "curba_romaneasca": "/financiar/v1/titluri-stat/fixing",
        "curba_zonei_euro": "/financiar/v1/bce/curba"
    }
}

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 maturity or issuer outside the list, or a malformed 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": "A maturity or issuer outside the list, or a malformed or future date.",
        "detalii": {
            "maturitate": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}