oneapi
Sign in
Financiar v1 / TitluriStat

Fixing series over an interval

Government securities yields between two dates, grouped by maturity, with bid, ask, mid and spread on each day.

Something other than /titluri-stat/fixing: there the question is „what is the curve today", and the answer is a table of five rows. Here it is „how did it move", and the answer is a series. The same distinction as between /curs and /curs/interval.

rezumat answers directly the question actually being asked. In February 2020 the mean spread was 0.221 points; in March, 0.304 — with the maximum rising from 0.33 to 0.46, and the ten-year yield from about 4.2% to about 5.9%. Those figures come out of one request, without walking through hundreds of points. It is an aggregation /serii/{cod}/valori cannot do: the spread is born of TWO series.

Every point carries all four values, with no „mid only" variant: mid serves the chart, the spread serves liquidity, and a route that changes its shape depending on a parameter is harder to use. A whole year with every maturity means around 1,250 points; with a filter, far fewer.

The interval is capped at 366 days, the same bounds as at /curs/interval and /robor/interval.

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

Query parameters

NameTypeDescriptionAccepted values
de_larequired string Required, YYYY-MM-DD. Cannot be in the future; aligns to coverage. e.g. 2024-06-15e.g. 2024-06-17e.g. 2024-01-02
pana_laoptional string | null Optional, defaults to the last published day — not the current day, so an import delay does not produce an empty tail. e.g. 2024-06-30e.g. 2024-06-28e.g. 2024-01-31
maturitatelistoptional text Optional, 1–5: ?maturitate=10Y or ?maturitate=6M,10Y. Without it, all five. 6M12M3Y5Y10Y

How it behaves

  • Government securities yields between two dates, grouped by maturity, with bid, ask, mid and spread for each day.
  • Different from /titluri-stat/fixing: there the question is "what is the curve today", and the answer is a five-row table. Here it is "how did it move", and the answer is a series. The same distinction as between /curs and /curs/interval.
  • rezumat answers the question actually being asked, without walking the series: the minimum, maximum and average for mid and for spread, plus the endpoints. In March 2020 the ten-year yield rose from 4.04% to 5.02% — but it touched 5.92% mid-month, a peak the endpoints hide entirely. The maximum spread jumped from 0.21 points in February to 0.46 in March.
  • This is an aggregation /serii/{cod}/valori CANNOT do: the spread is born from TWO series, bid and ask, not from one.
  • Every point carries all four values, with no "mid only" variant. Mid serves the chart, the spread serves liquidity, and a route that changes shape depending on a parameter is harder to use than one slightly larger. A full year with all maturities is around 1,250 points; with a filter, far fewer.
  • maturitate is OPTIONAL here, unlike /curs/interval where the currency is required: the maturities are five, fixed and known, and all five at once is a natural request for a curve. With currencies, "all" would mean forty series.
  • The order of the series comes from the maturity table, not from the order the client wrote them: ?maturitate=10Y,6M still returns 6M before 10Y, so a curve drawn from the response does not come out scrambled.
  • Days without publication do not appear in the series, and rezumat.puncte says how many days actually have a quote. The bounds align to coverage — which starts on 2011-01-10 — and whatever was adjusted appears in meta.ajustat. The cap is 366 days, checked AFTER alignment.

What it is for

  • Charting the evolution of the Romanian sovereign curve.
  • Measuring liquidity stress through the widening of the spread.
  • Comparing two periods — a calm month against a crisis month.

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.serii[].maturitate string The money-market convention key (ON, 3M, 12M).
data.serii[].denumire string The name, exactly as the source publishes it.
data.serii[].luni integer Number of months covered.
data.serii[].rezumat.puncte integer How many days actually have a quote in the interval.
data.serii[].rezumat.prima_zi string
data.serii[].rezumat.ultima_zi string
data.serii[].rezumat.mid object First, last, minimum, maximum and average mid yield over the interval.
data.serii[].rezumat.mid.primul string
data.serii[].rezumat.mid.ultimul string
data.serii[].rezumat.mid.minim string Smallest value in the interval.
data.serii[].rezumat.mid.maxim string Largest value in the interval.
data.serii[].rezumat.mid.mediu string Area of residence (urban or rural).
data.serii[].rezumat.spread object Minimum, maximum and average spread — the liquidity gauge.
data.serii[].rezumat.spread.minim string Smallest value in the interval.
data.serii[].rezumat.spread.maxim string Largest value in the interval.
data.serii[].rezumat.spread.mediu string Area of residence (urban or rural).
data.serii[].valori[].data string
data.serii[].valori[].bid string
data.serii[].valori[].ask string
data.serii[].valori[].mid string The midpoint between bid and ask for that day.
data.serii[].valori[].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.puncte integer Number of data points.
meta.zile_interval integer How many calendar days the requested interval spans.
meta.nota_randamente string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_rezumat string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_zile string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.ajustat Bounds aligned to coverage. Absent when nothing was adjusted.
meta.fara_valori Requested maturities with no value at all in the interval.
meta.fara_date data is null and this says why. The interval lies entirely before 2011-01-10.
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-stat/fixing/interval?de_la=2024-06-15&pana_la=2024-06-30&maturitate=6M,10Y
{
    "data": {
        "de_la": "2024-06-15",
        "pana_la": "2024-06-30",
        "unitate": "procent_pe_an",
        "serii": [
            {
                "maturitate": "6M",
                "denumire": "şase luni",
                "luni": 6,
                "rezumat": {
                    "puncte": 9,
                    "prima_zi": "2024-06-17",
                    "ultima_zi": "2024-06-28",
                    "mid": {
                        "primul": "5.95",
                        "ultimul": "5.92",
                        "minim": "5.92",
                        "maxim": "5.95",
                        "mediu": "5.94"
                    },
                    "spread": {
                        "minim": "0.30",
                        "maxim": "0.31",
                        "mediu": "0.30"
                    }
                },
                "valori": [
                    {
                        "data": "2024-06-17",
                        "bid": "6.10",
                        "ask": "5.80",
                        "mid": "5.95",
                        "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"
        },
        "puncte": 18,
        "zile_interval": 16,
        "nota_randamente": "Valorile sunt RANDAMENTE: `bid` e mai mare decât `ask`, iar `spread` e `bid − ask`, deja pozitiv.",
        "nota_rezumat": "`rezumat` dă minimul, maximul şi media pentru mid şi pentru spread, plus capetele — ca „cât s-a lărgit spread-ul\" să nu ceară parcurgerea seriei.",
        "nota_zile": "Zilele fără publicare nu apar în serie; `rezumat.puncte` spune câte zile au efectiv cotaţie."
    }
}

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 (over 366 days, checked after alignment); non-existent maturity; de_la missing or in the future; pana_la before de_la.
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 (over 366 days, checked after alignment); non-existent maturity; de_la missing or in the future; pana_la before de_la.",
        "detalii": {
            "de_la": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}