{
  "manifestVersion": 1,
  "dataset": {
    "id": "bnr-exchange-rates",
    "name": "BNR exchange rates",
    "description": "Daily RON reference exchange rates for roughly 35 foreign currencies, gold (XAU) and the IMF's Special Drawing Right (XDR), published each banking day by the National Bank of Romania (BNR). One row per (rate_date, currency); rate_per_unit is the RON value of a single unit of the currency, already divided by the source's multiplier so currencies compare directly.",
    "descriptions": {
      "ro": "Cursurile de schimb de referință ale leului (RON), stabilite în fiecare zi bancară de Banca Națională a României pentru aproximativ 35 de valute străine, plus aur (XAU) și drepturi speciale de tragere ale FMI (XDR). Există câte un rând pentru fiecare pereche dată-valută, iar coloana rate_per_unit arată direct valoarea în lei a unei singure unități din acea valută, calculată ținând cont de multiplicatorul folosit de sursă.",
      "en": "Daily RON reference exchange rates for roughly 35 foreign currencies, gold (XAU) and the IMF's Special Drawing Right (XDR), published each banking day by the National Bank of Romania (BNR). One row per (rate_date, currency); rate_per_unit is the RON value of a single unit of the currency, already divided by the source's multiplier so currencies compare directly."
    },
    "names": {
      "ro": "Cursuri de schimb BNR",
      "en": "BNR exchange rates"
    },
    "sourceUrl": "https://curs.bnr.ro/nbrfxrates10days.xml",
    "license": {
      "id": "bnr-terms",
      "name": "BNR Termeni și condiții — redistribution permitted with attribution",
      "url": "https://www.bnr.ro/2281-termeni-si-conditii",
      "attribution": "Exchange rates: Banca Națională a României (BNR).",
      "notes": "BNR's terms permit redistributing this information in any form and by any means, provided the source is indicated; if the data is used within a paid service, the terms specifically require that end clients be told the figures originate from BNR's own website, where they are published free of charge. If the published figures are altered in any way — converted, rounded, interpolated, recombined — the terms require that alteration to be stated explicitly; do not present a derived number as BNR's own reported rate without saying so. The XML feeds this connector reads moved from the www.bnr.ro domain to the curs.bnr.ro subdomain on 6 August 2026 — the old www.bnr.ro/nbrfxrates.xml address no longer serves them. One caveat worth stating plainly, without taking a side: curs.bnr.ro/robots.txt disallows crawling the entire subdomain (\"User-agent: * / Disallow: /\"), which sits in tension with BNR's own published instruction that software applications fetch these rates from this same subdomain. Reusers should be aware of that conflict and form their own judgment about it."
    },
    "cadence": "daily",
    "tags": [
      "exchange-rates",
      "currency",
      "finance",
      "romania",
      "bnr",
      "fx",
      "macroeconomics"
    ],
    "sources": []
  },
  "ingest": {
    "id": "01M5GV4RK9ZHGWAJRS8JVFYF1S",
    "startedAt": "2026-10-22T03:40:42.985Z",
    "snapshotDate": "2026-10-22",
    "catalogSnapshotId": 10,
    "params": {
      "feed": "10days",
      "years": "all"
    }
  },
  "baseUrl": "https://data-directory.fsn1.your-objectstorage.com/public/bnr-exchange-rates",
  "catalog": {
    "url": "https://data-directory.fsn1.your-objectstorage.com/catalog/bnr-exchange-rates/v/01M5GV4RK9ZHGWAJRS8JVFYF1S/catalog.ducklake",
    "latestUrl": "https://data-directory.fsn1.your-objectstorage.com/catalog/bnr-exchange-rates/catalog.ducklake",
    "sha256": "1fc6a8cf2a0bbdfc6558a2373a8ffcd64fb7deaf13e3d3dcdbc8c51a5a5a27e4",
    "duckdbVersion": "v1.5.5",
    "attachExample": "ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/bnr-exchange-rates/catalog.ducklake' AS lake (READ_ONLY); SELECT * FROM lake.main.rates LIMIT 5;"
  },
  "queryHints": {
    "examples": [
      {
        "title": "EUR/RON over the last 90 days",
        "sql": "SELECT rate_date, rate_per_unit\nFROM rates\nWHERE currency = 'EUR' AND rate_date >= current_date - INTERVAL 90 DAY\nORDER BY rate_date",
        "description": "The date filter comes first because rate_date is the leading sort column."
      },
      {
        "title": "The currencies that moved the most this month",
        "sql": "WITH bounds AS (\n  SELECT currency,\n         arg_min(rate_per_unit, rate_date) AS first_rate,\n         arg_max(rate_per_unit, rate_date) AS last_rate\n  FROM rates\n  WHERE rate_date >= date_trunc('month', current_date)\n  GROUP BY currency\n)\nSELECT currency, first_rate, last_rate,\n       round(100.0 * (last_rate - first_rate) / first_rate, 2) AS pct_change\nFROM bounds\nORDER BY abs(pct_change) DESC\nLIMIT 10",
        "description": "First vs. last available rate_per_unit so far this month, ranked by absolute percentage change."
      },
      {
        "title": "The rate of one currency between two dates",
        "sql": "SELECT rate_date, rate, multiplier, rate_per_unit\nFROM rates\nWHERE currency = 'USD' AND rate_date BETWEEN '2026-08-01' AND '2026-08-31'\nORDER BY rate_date",
        "description": "rate and multiplier are shown alongside rate_per_unit for full context."
      }
    ]
  },
  "tables": [
    {
      "name": "rates",
      "description": "One row per (rate_date, currency): the RON reference rate the National Bank of Romania (BNR) published for that currency on that banking day. BNR publishes a rate once per banking day and does not revise it afterwards, so a row here never changes once written.",
      "descriptions": {
        "ro": "Câte un rând pentru fiecare pereche (rate_date, currency): cursul de referință în lei publicat de Banca Națională a României (BNR) pentru acea valută, în acea zi bancară. BNR publică fiecare curs o singură dată, în ziua respectivă, și nu îl mai modifică ulterior — așadar un rând din acest tabel nu se schimbă niciodată după ce a fost scris.",
        "en": "One row per (rate_date, currency): the RON reference rate the National Bank of Romania (BNR) published for that currency on that banking day. BNR publishes a rate once per banking day and does not revise it afterwards, so a row here never changes once written."
      },
      "rowCount": 160161,
      "lastRunRows": 370,
      "totalBytes": 857063,
      "sortBy": [
        "rate_date",
        "currency"
      ],
      "searchColumns": [],
      "primaryKey": [
        "rate_date",
        "currency"
      ],
      "writeMode": "append",
      "storage": "lake",
      "columns": [
        {
          "name": "rate_date",
          "type": "DATE",
          "nullable": false,
          "description": "The banking day this rate applies to — the source feed's Cube/@date — as a UTC calendar date. This is the day the rate was VALID for, not the day it was fetched.",
          "descriptions": {
            "ro": "Ziua bancară pentru care este valabil acest curs — atributul Cube/@date din fluxul sursă — ca dată calendaristică UTC. Este ziua pentru care cursul a fost VALABIL, nu ziua în care a fost preluat de acest sistem.",
            "en": "The banking day this rate applies to — the source feed's Cube/@date — as a UTC calendar date. This is the day the rate was VALID for, not the day it was fetched."
          },
          "min": "2005-01-03",
          "max": "2026-10-21",
          "distinctApprox": 4770
        },
        {
          "name": "currency",
          "type": "VARCHAR",
          "nullable": false,
          "description": "ISO 4217 code of the foreign currency being priced against RON, e.g. \"EUR\", \"USD\", \"JPY\". BNR also publishes two non-ISO-4217 codes this way: \"XAU\" (one troy ounce of gold) and \"XDR\" (the IMF Special Drawing Right).",
          "descriptions": {
            "ro": "Codul ISO 4217 al valutei străine cotate față de RON, de exemplu \"EUR\", \"USD\", \"JPY\". BNR publică în același fel și două coduri care nu sunt ISO 4217: \"XAU\" (o uncie de aur) și \"XDR\" (dreptul special de tragere al FMI).",
            "en": "ISO 4217 code of the foreign currency being priced against RON, e.g. \"EUR\", \"USD\", \"JPY\". BNR also publishes two non-ISO-4217 codes this way: \"XAU\" (one troy ounce of gold) and \"XDR\" (the IMF Special Drawing Right)."
          },
          "min": "AED",
          "max": "ZAR",
          "distinctApprox": 35
        },
        {
          "name": "rate",
          "type": "DECIMAL(12,4)",
          "nullable": false,
          "description": "The figure BNR published, verbatim: how many RON equal `multiplier` units of `currency` — NOT the price of one unit. For most currencies multiplier is 1 and this already is the per-unit price, but for HUF, JPY, KRW and a few others it is priced per 100 units. Use rate_per_unit to compare currencies against each other; use this column only when you specifically want the number exactly as BNR printed it.",
          "descriptions": {
            "ro": "Cifra publicată de BNR, exact așa cum a fost tipărită: câți RON valorează `multiplier` unități din `currency` — NU prețul unei singure unități. Pentru majoritatea valutelor multiplicatorul este 1 și această coloană este deja prețul pe unitate, dar pentru HUF, JPY, KRW și alte câteva, cursul este cotat la 100 de unități. Folosește rate_per_unit pentru a compara valute între ele; folosește această coloană doar când ai nevoie de cifra exact așa cum a fost tipărită de BNR.",
            "en": "The figure BNR published, verbatim: how many RON equal `multiplier` units of `currency` — NOT the price of one unit. For most currencies multiplier is 1 and this already is the per-unit price, but for HUF, JPY, KRW and a few others it is priced per 100 units. Use rate_per_unit to compare currencies against each other; use this column only when you specifically want the number exactly as BNR printed it."
          },
          "unit": "RON"
        },
        {
          "name": "multiplier",
          "type": "INTEGER",
          "nullable": false,
          "description": "How many units of `currency` the `rate` column prices — 100 for HUF, IDR, ISK, JPY, KRW; 1 for almost everything else. The source XML omits this attribute for a multiplier of 1 rather than writing it out; this column is never left null for that — an absent attribute is normalised here to the value 1, so every row states its multiplier explicitly rather than leaving a reader to assume one.",
          "descriptions": {
            "ro": "Câte unități din `currency` cotează coloana `rate` — 100 pentru HUF, IDR, ISK, JPY, KRW; 1 pentru aproape toate celelalte. Fluxul sursă omite acest atribut atunci când multiplicatorul este 1, în loc să îl scrie explicit; această coloană nu este niciodată lăsată necompletată din acest motiv — un atribut absent este normalizat aici la valoarea 1, astfel încât fiecare rând își declară explicit multiplicatorul, fără ca cititorul să trebuiască să presupună unul.",
            "en": "How many units of `currency` the `rate` column prices — 100 for HUF, IDR, ISK, JPY, KRW; 1 for almost everything else. The source XML omits this attribute for a multiplier of 1 rather than writing it out; this column is never left null for that — an absent attribute is normalised here to the value 1, so every row states its multiplier explicitly rather than leaving a reader to assume one."
          },
          "unit": "units"
        },
        {
          "name": "rate_per_unit",
          "type": "DECIMAL(18,10)",
          "nullable": false,
          "description": "RON for exactly ONE unit of `currency` (rate / multiplier). This is the number almost everyone actually wants, and the only one that is safe to compare directly across currencies — comparing raw `rate` values mixes units, since a JPY rate is priced per 100 yen and a EUR rate per 1 euro.",
          "descriptions": {
            "ro": "Valoarea în RON a UNEI singure unități din `currency` (rate / multiplier). Este cifra pe care o caută aproape oricine, și singura care se poate compara direct între valute diferite — compararea directă a coloanei `rate` amestecă unități, pentru că un curs JPY este cotat la 100 de yeni, iar unul EUR la 1 euro.",
            "en": "RON for exactly ONE unit of `currency` (rate / multiplier). This is the number almost everyone actually wants, and the only one that is safe to compare directly across currencies — comparing raw `rate` values mixes units, since a JPY rate is priced per 100 yen and a EUR rate per 1 euro."
          },
          "unit": "RON"
        },
        {
          "name": "publishing_date",
          "type": "DATE",
          "nullable": true,
          "description": "The date BNR stamped on the whole document (Header/PublishingDate) — the Europe/Bucharest business day the feed itself was issued (BNR publishes once, around midday Bucharest time). In practice this equals the most recent rate_date carried in the same payload, but it is kept as its own column because it is a property of the document, not of any individual currency's rate.",
          "descriptions": {
            "ro": "Data pe care BNR o înscrie pe întregul document (Header/PublishingDate) — ziua bancară Europe/Bucharest în care a fost emis fluxul propriu-zis (BNR publică o singură dată, în jurul prânzului, ora României). În practică este egală cu cea mai recentă rate_date din același document, dar este păstrată ca o coloană separată pentru că este o proprietate a documentului, nu a cursului unei anumite valute.",
            "en": "The date BNR stamped on the whole document (Header/PublishingDate) — the Europe/Bucharest business day the feed itself was issued (BNR publishes once, around midday Bucharest time). In practice this equals the most recent rate_date carried in the same payload, but it is kept as its own column because it is a property of the document, not of any individual currency's rate."
          }
        },
        {
          "name": "base_currency",
          "type": "VARCHAR",
          "nullable": true,
          "description": "The currency every rate in this row is expressed against (Body/OrigCurrency in the source). Always \"RON\" in practice, but read from the feed on every run rather than hardcoded, in case BNR ever changes it.",
          "descriptions": {
            "ro": "Valuta față de care este exprimat fiecare curs din acest rând (Body/OrigCurrency în sursă). În practică este mereu \"RON\", dar este citită din flux la fiecare rulare, nu este fixată în cod, în cazul în care BNR ar schimba-o vreodată.",
            "en": "The currency every rate in this row is expressed against (Body/OrigCurrency in the source). Always \"RON\" in practice, but read from the feed on every run rather than hardcoded, in case BNR ever changes it."
          }
        }
      ],
      "files": [
        {
          "url": "https://data-directory.fsn1.your-objectstorage.com/public/bnr-exchange-rates/v/01M5GV4RK9ZHGWAJRS8JVFYF1S/rates.parquet",
          "sizeBytes": 857063,
          "rowCount": 160161,
          "etag": "\"d7fee44c0ec50a7a9fc9762ba8d13d37\"",
          "stats": {
            "rate_date": {
              "min": "2005-01-03",
              "max": "2026-10-21"
            },
            "currency": {
              "min": "AED",
              "max": "ZAR"
            }
          }
        }
      ],
      "example": [
        {
          "rate_date": "2005-01-03T00:00:00.000Z",
          "currency": "AUD",
          "rate": 2.2593,
          "multiplier": 1,
          "rate_per_unit": 2.2593,
          "publishing_date": "2011-10-31T00:00:00.000Z",
          "base_currency": "RON"
        },
        {
          "rate_date": "2005-01-03T00:00:00.000Z",
          "currency": "CAD",
          "rate": 2.4095,
          "multiplier": 1,
          "rate_per_unit": 2.4095,
          "publishing_date": "2011-10-31T00:00:00.000Z",
          "base_currency": "RON"
        }
      ]
    }
  ],
  "generatedAt": "2026-10-22T03:40:49.745Z"
}
