oneapi
Sign in
Financiar v1 / TitluriStat

Secondary market trading

How many government securities trades took place and at what value, on securities denominated in lei and in euro. A daily series since September 1999, a monthly series since November 1999.

The monthly series published by the NBR is NOT the month's total, it is the DAILY AVERAGE. The source's note says so, and it checks out against the data: July 2026 gives 7,438.8 monthly and exactly 7,438.8 as the average of the 23 published days — a 92.8% match on lei and 96.2% on euro, and the differences come from days missing from the daily series, not from a different definition. Anyone adding the twelve monthly values to get the year's volume obtains a meaningless number.

That is why the monthly response gives both figures side by side: valoare_medie_zilnica, published by the NBR, and valoare_totala, computed by us from the daily series, with the zile it follows from.

Zero means zero, not missing data. In euro there is no trade at all in 1999–2002 and 2005–2008, while in 2003, 2004 and 2009 only 16–22% of days have trades; since 2021, between 11% and 26% of each year's days have no euro trade (19% over 2022–2026). A day without trades is one with numar 0: a valoare of 0 with numar above zero (2024-06-27 in euro: one trade, 0.00) is an amount below the rounding threshold, not zero trades. A day with no publication is a different thing: it does not appear in the response at all, and meta says how many working days the interval held.

Lei and euro are not additive. They are different currencies, each with its own unit — million RON and million EUR — and a combined total would be a lie.

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

Query parameters

NameTypeDescriptionAccepted values
frecventaoptional string | null Optional: zilnic (default) or lunar. It also changes the format of the bounds. zilniclunar
de_larequired string Required. YYYY-MM-DD for daily, YYYY-MM for monthly. e.g. 2024-06-15e.g. 2024-01-02
pana_laoptional string | null Optional. Defaults to the latest published period. Same format as de_la. e.g. 2024-06-30e.g. 2024-06-28e.g. 2024-06-15

How it behaves

  • How many government-bond trades took place and for what value, for securities denominated in lei and in euro. Daily series from September 1999, monthly series from November 1999.
  • The monthly series the NBR publishes is NOT the month's total — it is the DAILY AVERAGE. The source note says so, and the data confirms it: July 2026 shows 7,438.8 monthly and exactly 7,438.8 as the average of its 23 published days. Anyone who adds up twelve monthly figures to get a year's volume gets a meaningless number — which is why the response also carries valoare_totala, computed by us from the daily series, with the zile (days) it is built from.
  • The two averages — the published one and valoare_medie_zilnica_calculata — agree in 292 of 319 months for the lei value, within 0.1%. Five months differ by more than 10%: the exact divisor the NBR used cannot be reconstructed from the published data. We give both; the published figure remains the official one.
  • Zero means zero, not missing data. In euro there is no trade at all in 1999–2002 and 2005–2008, while in 2003, 2004 and 2009 only 16–22% of days have trades; since 2021, between 11% and 26% of each year's days have no euro trade (19% over 2022–2026). A day without trades is one with numar 0: a valoare of 0 with numar above zero (2024-06-27 in euro: one trade, 0.00) is an amount below the rounding threshold, not zero trades. A day without a publication is a different thing: it does not appear in the response, and meta.zile_lucratoare says what the returned day count should be read against.
  • Lei and euro are never added together. They are different currencies, each with its own unit — millions RON and millions EUR — and a combined total would be a lie. That is also why rezumat has no "grand total" line.
  • The bounds are written according to the frequency: YYYY-MM-DD for daily, YYYY-MM for monthly. A single day in a monthly request would not say whether the whole month or just that day was meant, so it is refused.
  • Bounds outside the coverage are silently clamped to it, and meta.ajustat says what moved and from where. Caps: 366 days for daily, 120 months for monthly.

What it is for

  • Secondary-market liquidity: how much actually trades, not only at what yield.
  • The real volume of a month or a year, with the total computed correctly from the daily series.
  • The weight of the euro-denominated market against the lei one, tracked over time.

Response structure

FieldTypeDescription
data.frecventa string How often the source publishes the series (daily, monthly, quarterly, yearly).
data.de_la string Start of the interval the response covers.
data.pana_la string End of the interval the response covers, inclusive.
data.rezumat object The interval aggregate, per denomination separately: total, daily average, peak day or month. varf is null when the interval is flat zero.
data.rezumat.lei.zile integer Number of days covered.
data.rezumat.lei.zile_fara_tranzactii integer How many days in the interval had no transaction at all.
data.rezumat.lei.numar_total integer
data.rezumat.lei.valoare_totala string
data.rezumat.lei.valoare_medie_zilnica string
data.rezumat.lei.varf.data string
data.rezumat.lei.varf.valoare string The value published by the source for the combination above.
data.rezumat.lei.varf.numar integer Number of items counted.
data.rezumat.lei.unitate string Unit of measure of the values. Read it before plotting or summing them.
data.rezumat.euro.zile integer Number of days covered.
data.rezumat.euro.zile_fara_tranzactii integer How many days in the interval had no transaction at all.
data.rezumat.euro.numar_total integer
data.rezumat.euro.valoare_totala string
data.rezumat.euro.valoare_medie_zilnica string
data.rezumat.euro.varf.data string
data.rezumat.euro.varf.valoare string The value published by the source for the combination above.
data.rezumat.euro.varf.numar integer Number of items counted.
data.rezumat.euro.unitate string Unit of measure of the values. Read it before plotting or summing them.
data.perioade[].data string The day, at daily frequency.
data.perioade[].lei object Lei-denominated securities. null if the period has no value for them.
data.perioade[].lei.numar integer Number of items counted.
data.perioade[].lei.valoare string The value published by the source for the combination above.
data.perioade[].lei.unitate string Unit of measure of the values. Read it before plotting or summing them.
data.perioade[].euro object Euro-denominated securities.
data.perioade[].euro.numar integer Number of items counted.
data.perioade[].euro.valoare string The value published by the source for the combination above.
data.perioade[].euro.unitate string Unit of measure of the values. Read it before plotting or summing them.
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_publicate integer How many periods the source actually published.
meta.zile_interval integer How many calendar days the requested interval spans.
meta.zile_lucratoare integer Working days in the interval. Not identical to the trading calendar: the NBR has published on six Saturdays (in 2002, 2010 and 2011).
meta.nota_zero string What a zero means here: a measured null value, not missing data.
meta.nota_lipsa string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_monede string A note on how to read the response: a caveat, a convention or a limit of the source.
data.perioade[].perioada string The month, YYYY-MM, at monthly frequency.
data.perioade[].zile_lucratoare integer How many working days the month had — the reference for zile. Monthly only.
data.perioade[].total_partial boolean true when the month's total is built from fewer days than the month had, so it understates reality. Monthly only.
data.perioade[].*.numar The day's trade count. Daily only.
data.perioade[].*.valoare The day's traded value, in the declared unit. Daily only.
data.perioade[].*.numar_mediu_zilnic The daily average trade count as published by the NBR. Monthly only.
data.perioade[].*.valoare_medie_zilnica The daily average value as published by the NBR. Monthly only.
data.perioade[].*.numar_total The month's total, computed by us from the daily series.
data.perioade[].*.valoare_totala The month's total value, computed by us from the daily series.
data.perioade[].*.zile How many days the total is built from.
data.perioade[].*.valoare_medie_zilnica_calculata The average that follows from the daily series, to compare with the published one.
data.perioade[].*.unitate milioane_ron or milioane_eur.
data.rezumat.*.zile_fara_tranzactii How many published days had no trades. Daily only.
meta.fara_date string data is null and this says why. The interval falls entirely outside the series; the response gives the coverage.
meta.fara_date_cod string 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/piata-secundara?de_la=2024-06-15&pana_la=2024-06-30
{
    "data": {
        "frecventa": "zilnic",
        "de_la": "2024-06-15",
        "pana_la": "2024-06-30",
        "rezumat": {
            "lei": {
                "zile": 9,
                "zile_fara_tranzactii": 0,
                "numar_total": 2163,
                "valoare_totala": "27948.30",
                "valoare_medie_zilnica": "3105.37",
                "varf": {
                    "data": "2024-06-25",
                    "valoare": "8448.90",
                    "numar": 306
                },
                "unitate": "milioane_ron"
            },
            "euro": {
                "zile": 9,
                "zile_fara_tranzactii": 1,
                "numar_total": 16,
                "valoare_totala": "222.50",
                "valoare_medie_zilnica": "24.72",
                "varf": {
                    "data": "2024-06-26",
                    "valoare": "101.00",
                    "numar": 2
                },
                "unitate": "milioane_eur"
            }
        },
        "perioade": [
            {
                "data": "2024-06-17",
                "lei": {
                    "numar": 163,
                    "valoare": "2048.20",
                    "unitate": "milioane_ron"
                },
                "euro": {
                    "numar": 0,
                    "valoare": "0.00",
                    "unitate": "milioane_eur"
                }
            }
        ]
    },
    "meta": {
        "sursa": "BNR — tranzacţii pe piaţa secundară (baza de date interactivă).",
        "acoperire": {
            "de_la": "1999-09-01",
            "pana_la": "2026-09-21"
        },
        "perioade_publicate": 9,
        "zile_interval": 16,
        "zile_lucratoare": 9,
        "nota_zero": "Zero înseamnă zero, nu date lipsă. În euro nu există nicio tranzacţie în 1999–2002 şi 2005–2008, iar în 2003, 2004 şi 2009 doar 16–22% din zile au tranzacţii; din 2021, între 11% şi 26% din zilele fiecărui an n-au nicio tranzacţie în euro (19% pe 2022–2026). Ziua fără tranzacţii e cea cu `numar` 0: o `valoare` 0 cu `numar` peste zero (2024-06-27 în euro: o tranzacţie, 0,00) e o sumă sub pragul de rotunjire, nu zero tranzacţii.",
        "nota_lipsa": "Zilele fără publicare nu apar în răspuns. `zile_lucratoare` e reperul faţă de care se citeşte `perioade_publicate` — nu e identic cu calendarul de tranzacţionare: BNR a publicat şi în şase zile de sâmbătă (2002-01-19, 2002-01-26, 2010-02-06, 2010-02-20, 2010-06-26, 2011-05-14).",
        "nota_monede": "Lei şi euro nu se adună: sunt monede diferite, fiecare cu unitatea ei (`milioane_ron`, `milioane_eur`)."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareWrong format for the requested frequency, pana_la before de_la, an interval in the future, or interval_prea_lung — over 366 days or 120 months.
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": "Wrong format for the requested frequency, pana_la before de_la, an interval in the future, or interval_prea_lung — over 366 days or 120 months.",
        "detalii": {
            "frecventa": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}