# Romanian public budget execution (ANAF Forexebug) > Budget execution and budget commitments for every public institution in Romania, report by report, from the Forexebug reports ANAF publishes. One fact row is one classification line of one report — a funding source, a functional code, an economic code and a budget programme — with the amount realised year-to-date. Execution is monthly, commitments are quarterly, and the history starts in January 2016. The source publishes no monthly column: a month's own movement is the year-to-date figure minus the previous month's. - Dataset id: `anaf-forexebug` - Update cadence: monthly - Upstream source: https://mfinante.gov.ro/apps/transparenta-bugetara/index.htm - Tags: budget, public-finance, government-spending, romania, anaf, forexebug, transparency, fiscal - Current version: ingest `01M26DHWNRRD3ZKGG2NKMV7ESE`, snapshot 2026-09-10, generated 2026-09-11T03:08:54.944Z ## Licence and attribution - Licence: Licența pentru o Guvernare Deschisă v1.0 (Open Government Licence Romania) (`OGL-ROU-1.0`) - Licence text: https://static.anaf.ro/static/copyright/OGLROU10_14032016.pdf - Required attribution: Conține informații publice în baza Licenței pentru Guvernare Deschisă v1.0. Sursa: Ministerul Finanțelor / Agenția Națională de Administrare Fiscală — sistemul național de raportare Forexebug, https://mfinante.gov.ro/transparenta-bugetara - Notes: The controlling statement is ANAF's own copyright page at https://static.anaf.ro/static/copyright/copyright.html, which every budget-execution page links to in its footer: reuse of the content, in whole or in part, in original or modified form, as well as storage and transmission by any means, is permitted only under the Open Government Licence, and use in articles, studies and books requires the source to be indicated clearly. The licence (Secretariatul General al Guvernului, v1.0, 14 March 2016 — the same one data.gov.ro uses) permits copying, publishing, distributing and adapting the information for commercial and non-commercial purposes, and states that where the number of items makes item-by-item attribution impractical the reuser must instead display exactly the sentence in the attribution field above. It was written for interoperability with Creative Commons Attribution 3.0 and the Open Data Commons Attribution License. Conditions a reuser must meet: do not suggest an official status or a privileged relationship with a public body, do not distort or misleadingly present the information, and do not use it in breach of data-protection or confidentiality law. The portal footer separately forbids UNAUTHORISED MODIFICATION OF THE WEBSITE (defacement, under Legea 8/1996 and Legea 161/2003 Titlul 3); that is a computer-misuse notice, not a restriction on reusing the data, and it sits alongside the licence grant rather than against it. What this dataset republishes: the numbers, codes, classification names and institution identifiers from the XML rendition of each report. What it deliberately does not: the PDF and XLSX renditions (referenced by URL only) and the ministry logo embedded in every XML file, which is discarded before parsing. Figures published here are the ones ANAF published; ANAF states that published reports are subject to continuous reconciliation against the quarterly returns institutions file, so a period can be restated after the fact — reports.xml_sha256 and report_files.file_seq are what make a restatement visible. Reproduce the attribution line verbatim anywhere you republish this data. ## Manifest - Start here for how this directory works: https://data.bunnytech.app/llms.txt - This dataset: https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/manifest.json - All datasets: https://data-directory.fsn1.your-objectstorage.com/public/index.json - Human page: https://data.bunnytech.app/datasets/anaf-forexebug The manifest is the contract: file URLs, row counts, column types, min/max statistics and example queries all live there. Re-read it to discover a new version. ## Fastest path — Parquet exports Immutable, physically sorted snapshot exports. No catalog fetch, best row-group pruning, safe to cache forever. Register one view per table: ```sql INSTALL httpfs; LOAD httpfs; CREATE OR REPLACE VIEW report_files AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/report_files.parquet'); CREATE OR REPLACE VIEW reports AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/reports.parquet'); CREATE OR REPLACE VIEW execution_line_items AS SELECT * FROM read_parquet([ 'https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/execution_line_items/part-00000.parquet', 'https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/execution_line_items/part-00001.parquet', 'https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/execution_line_items/part-00002.parquet' ]); CREATE OR REPLACE VIEW commitment_line_items AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/commitment_line_items.parquet'); CREATE OR REPLACE VIEW entities AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/entities.parquet'); CREATE OR REPLACE VIEW budget_sectors AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/budget_sectors.parquet'); CREATE OR REPLACE VIEW funding_sources AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/funding_sources.parquet'); CREATE OR REPLACE VIEW functional_classifications AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/functional_classifications.parquet'); CREATE OR REPLACE VIEW economic_classifications AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/economic_classifications.parquet'); CREATE OR REPLACE VIEW budget_programs AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/budget_programs.parquet'); ``` Example queries: -- A city hall’s year-to-date revenue and spending, month by month: reports carries the source’s own totals, so this needs no aggregation at all. The figures are cumulative from 1 January. ```sql ATTACH IF NOT EXISTS 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/catalog.ducklake' AS "datadirectory" (READ_ONLY); SELECT reporting_month, total_income, total_expense, budget_balance FROM datadirectory.anaf_forexebug.reports WHERE entity_cif = '4270740' AND report_code = '901' AND reporting_year = 2024 AND parse_status = 'ok' ORDER BY reporting_month ``` -- Turning the year-to-date column into a real monthly figure: The source publishes no monthly amount. This is the derivation: subtract the previous month’s cumulative figure over the full dimension key, partitioned by year so January resets instead of continuing December. ```sql ATTACH IF NOT EXISTS 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/catalog.ducklake' AS "datadirectory" (READ_ONLY); SELECT reporting_year, reporting_month, entity_cif, functional_code, economic_code, ytd_amount, ytd_amount - lag(ytd_amount, 1, 0) OVER ( PARTITION BY reporting_year, report_code, entity_cif, budget_sector_code, funding_source_code, account_category, functional_code, economic_code, program_code ORDER BY reporting_month ) AS monthly_amount FROM datadirectory.anaf_forexebug.execution_line_items WHERE report_code = '901' AND reporting_year = 2024 AND entity_cif = '4270740' ORDER BY reporting_month, functional_code, economic_code ``` ## Live lake — DuckLake catalog with time travel Attach the published catalog read-only over plain https. This works in native DuckDB AND in duckdb-wasm in the browser — the reader catalog resolves its data files through public https URLs, so no credentials and no backend are involved. ```sql INSTALL ducklake; LOAD ducklake; ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/anaf-forexebug/catalog.ducklake' AS anaf_forexebug (READ_ONLY); SELECT * FROM anaf_forexebug.main.report_files LIMIT 5; USE anaf_forexebug; ``` - Latest catalog: https://data-directory.fsn1.your-objectstorage.com/catalog/anaf-forexebug/catalog.ducklake - This exact version: https://data-directory.fsn1.your-objectstorage.com/catalog/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/catalog.ducklake (sha256 dba4d4f52baa8c9372eb169e28395ab32b680f8e2d490ab1f39e5bb14ccd76af) - Written by DuckDB v1.5.5 - Time travel: this ingest is snapshot 23 — e.g. `SELECT * FROM anaf_forexebug.report_files AT (VERSION => 23)` ## Wholesale — S3 access For bulk downloads, read the bucket prefix directly over S3 with httpfs: ```sql INSTALL httpfs; LOAD httpfs; CREATE SECRET hetzner ( TYPE s3, ENDPOINT 'fsn1.your-objectstorage.com', URL_STYLE 'path', KEY_ID '', SECRET '' ); SELECT * FROM read_parquet('s3://data-directory/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/**/*.parquet'); ``` ## Schema ### report_files One row per published Forexebug report: the entity, the month, the budget sector and the direct URLs of its three renditions (XML, XLSX, PDF), exactly as the ANAF portal index lists them. This is the discovery catalogue — it is written whether or not the report was read, so a file that failed to download is still known to exist. The numbers themselves live in execution_line_items and commitment_line_items. - 372.8K rows · 6.2 MB · write mode `snapshot_history` - Physically sorted by: `reporting_year`, `reporting_month`, `report_code`, `entity_cif` - Primary key: `report_id` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/report_files.parquet (372.8K rows) Columns: - `report_id` VARCHAR NOT NULL — Stable identity of the report, built from the parts of its file name: "-----", e.g. "901-20240131-4270740-4270740-02-576". Join key for reports, execution_line_items and commitment_line_items. It deliberately excludes the file sequence number, so a republished month lands on the same row rather than beside it. (~365479 distinct) - `report_code` VARCHAR NOT NULL — The FXB-EXB report code: "900" detailed execution, "901" execution aggregated at principal authorising officer level, "905" aggregated at secondary level, "902" detailed commitments, "903"/"904" commitments aggregated at principal/secondary level. (range: "901" … "901") (~1 distinct) - `report_type_ro` VARCHAR — The report type's official Romanian label, verbatim from the portal's own search form. - `reporting_year` INTEGER NOT NULL — Calendar year of the reported period. (range: 2016 … 2026) (~11 distinct) - `reporting_month` INTEGER NOT NULL — Month of the reported period, 1-12. (range: 1 … 12) (~13 distinct) - `period_end_date` DATE NOT NULL — Last calendar day of the reported month — the period the report covers, not the day it was published. Taken from the file name, which is the one spelling identical across all three renditions, and stored as the UTC calendar day: the file name carries a bare yyyymmdd date with no time-of-day or zone of its own to convert from. - `entity_cif` VARCHAR NOT NULL — CIF/CUI of the reporting public entity. A string, not a number: leading zeros and the occasional non-numeric register are both real. (range: "10464660" … "9766550") - `entity_name` VARCHAR — Official name of the entity as the portal index prints it. - `county_name` VARCHAR — County the entity is registered in, as the index prints it ("Sibiu", "Bucuresti"). Not a code; the portal search takes a two-letter code but the result table shows the name. - `budget_sector_code` VARCHAR NOT NULL — Two-digit budget sector: "01" state budget, "02" local budget, "03" state social insurance, "04" unemployment fund, "05" health fund (FNUASS). - `budget_sector_name` VARCHAR — The sector label as ANAF writes it. Whitespace is preserved verbatim — the local-budget label really does contain three consecutive spaces ("Bugetul local (administratie locala)") and normalising it would break a join against any other copy of ANAF data. - `main_creditor_cif` VARCHAR NOT NULL — CIF of the ordonator principal de credite (the principal authorising officer) this entity reports under. Equal to entity_cif when the entity is its own principal, which is the case for every municipality and most central institutions. - `main_creditor_name` VARCHAR — Name of the principal authorising officer. - `treasury_code` VARCHAR — Treasury (trezorerie) unit code the entity files through, from the TREZ… segment of the file name. ANAF publishes no lookup table for these codes. - `lot` VARCHAR — The publication batch the file was placed in ("LOT450"). Monotonic over time and useful only for tracing a file back to its publication run. - `xml_url` VARCHAR — Direct URL of the XML rendition — the only rendition with a machine grammar, and the one this connector reads. - `xlsx_url` VARCHAR — Direct URL of the spreadsheet rendition. Kept as a reference: it holds the same numbers as the XML, laid out for printing. - `pdf_url` VARCHAR — Direct URL of the PDF rendition. Kept as a reference only — a PDF is not machine-readable tabular data, so nothing is materialised from it. - `file_seq` BIGINT — The file's global sequence number, from the last segment of its name. It is opaque and not derivable, which is why report URLs must be discovered rather than constructed. It changes when ANAF republishes a month, so a changed value on an unchanged report_id is the signal that a period was restated. - `source_period_label` VARCHAR — The period exactly as the index prints it, in Romanian month abbreviations ("Mar 2024"). - `discovered_at` DATE NOT NULL — The ingest run's snapshot date (ctx.snapshotDate) — when this row was last refreshed, recorded as the UTC calendar day the run started. ### reports One row per report this connector actually opened: what its own header said, what its own stated totals were, and whether it parsed. Read it before trusting a sum — a report with parse_status other than "ok" contributed no line items, and total_income / total_expense are the source's own totals, so comparing them against a SUM over execution_line_items is a free reconciliation check. - 372.8K rows · 18 MB · write mode `snapshot_history` - Physically sorted by: `reporting_year`, `reporting_month`, `report_code`, `entity_cif` - Primary key: `report_id` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/reports.parquet (372.8K rows) Columns: - `report_id` VARCHAR NOT NULL — Same identity as report_files.report_id. (~365479 distinct) - `report_code` VARCHAR NOT NULL — The FXB-EXB report code, "900" … "905". (range: "901" … "901") (~1 distinct) - `report_family` VARCHAR NOT NULL — Which fact table this report feeds: "execution" (codes 900, 901, 905) or "commitments" (codes 902, 903, 904). The two carry completely different measures and must never be added together. - `reporting_year` INTEGER NOT NULL — Calendar year of the reported period. (range: 2016 … 2026) (~11 distinct) - `reporting_month` INTEGER NOT NULL — Month of the reported period, 1-12. (range: 1 … 12) (~13 distinct) - `period_end_date` DATE NOT NULL — Last calendar day of the reported month, stored as the UTC calendar day — see report_files.period_end_date for how it is taken from the file name. - `entity_cif` VARCHAR NOT NULL — CIF/CUI of the reporting entity. (range: "10464660" … "9766550") - `entity_name` VARCHAR — The entity's name as the report's own header states it, which can differ in spelling from the portal index. - `budget_sector_code` VARCHAR NOT NULL — Two-digit budget sector code. - `main_creditor_cif` VARCHAR — CIF of the principal authorising officer. - `treasury_code` VARCHAR — Treasury unit code from the file name. - `xml_url` VARCHAR — The XML rendition that was read to produce this row. - `xml_sha256` VARCHAR — SHA-256 of the XML bytes as downloaded. Two runs that see the same hash saw the same file; a changed hash on an unchanged report_id means ANAF restated the period. - `xml_bytes` BIGINT — Size of the downloaded XML in bytes. - `source_period_label` VARCHAR — The report's own P_ZI field, verbatim and Oracle-formatted — "31-JAN-24" on the execution reports, "31-MAR-2024" on the commitments ones. Kept because the two families disagree about it and that disagreement is itself worth being able to see. - `report_state` VARCHAR — The report's P_STARE field — "Final" on every report observed. Only the commitments reports carry it; it is null on the execution ones. - `detail_level` INTEGER — The NIVEL the line items were taken from. Every report repeats its content once per level: 0 is an empty placeholder, 1 is aggregated over budget programmes, 2 is broken down by programme. This connector keeps the deepest level with rows, which is lossless — summing level 2 over program_code reproduces level 1 to the cent. - `source_row_count` INTEGER — The report's own CONTOR field: how many detail rows the source says it wrote. Compare it against line_item_count to detect a partial read. - `line_item_count` INTEGER — How many line items this connector actually published for it. - `total_income` DECIMAL(18,2) [RON] — The report's own "TOTAL VENITURI:" line, year-to-date. Execution reports only; null for commitments. It equals the sum of the revenue line items to the cent, and that is worth asserting rather than assuming. - `total_expense` DECIMAL(18,2) [RON] — The report's own "TOTAL CHELTUIELI:" line, year-to-date. Execution reports only. - `budget_balance` DECIMAL(18,2) [RON] — total_income minus total_expense, year-to-date. Positive is a surplus. Derived here because it is the single number most readers open this dataset for; it is not a figure ANAF prints. - `parse_status` VARCHAR NOT NULL — "ok" when the report was downloaded and read, "fetch_failed" when the file could not be downloaded, "parse_failed" when it downloaded but could not be read, "not_fetched" when the run deliberately did not download it (downloadReports=false, or a maxReports cap). A row exists either way — losing the knowledge that a report exists is worse than losing its contents. - `parse_error` VARCHAR — Why parse_status is not "ok", in the words of the failure. - `ingested_at` TIMESTAMPTZ NOT NULL — The ingest run's timestamp (ctx.runAt), stated in UTC. ### execution_line_items The budget execution fact table: one row per classification line of one report — a funding source, a functional code, an economic code and a budget programme — with the amount realised YEAR-TO-DATE. Fed by report codes 900, 901 and 905. Read the note on ytd_amount before summing anything: this column is cumulative, so adding twelve months of it counts January twelve times. - 11.1M rows · 78 MB · write mode `snapshot_history` - Physically sorted by: `reporting_year`, `reporting_month`, `entity_cif`, `account_category`, `functional_code` - Primary key: `report_id`, `account_category`, `funding_source_code`, `functional_code`, `economic_code`, `program_code` - Files: 3 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/execution_line_items/part-00000.parquet (4.1M rows) - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/execution_line_items/part-00001.parquet (4.7M rows) - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/execution_line_items/part-00002.parquet (2.2M rows) Columns: - `report_id` VARCHAR NOT NULL — The report this line came from; joins to reports and report_files. (~107270 distinct) - `report_code` VARCHAR NOT NULL — The report code the line came from: "900" detailed, "901" aggregated at principal level, "905" aggregated at secondary level. THE THREE OVERLAP — an entity that files both a 900 and a 901 appears in both, so always filter on one code before summing across entities. (~1 distinct) - `reporting_year` INTEGER NOT NULL — Calendar year of the reported period. (range: 2023 … 2026) (~3 distinct) - `reporting_month` INTEGER NOT NULL — Month of the reported period, 1-12. (range: 1 … 12) (~13 distinct) - `period_end_date` DATE NOT NULL — Last calendar day of the reported month, stored as the UTC calendar day — see report_files.period_end_date for how it is taken from the file name. - `entity_cif` VARCHAR NOT NULL — CIF/CUI of the reporting entity. (range: "10464660" … "9766550") - `main_creditor_cif` VARCHAR — CIF of the principal authorising officer. - `budget_sector_code` VARCHAR NOT NULL — Two-digit budget sector code. - `account_category` VARCHAR NOT NULL — "vn" for venituri (revenue) or "ch" for cheltuieli (expenditure). It also decides what functional_code means — see that column. (range: "ch" … "vn") (~2 distinct) - `funding_source_code` VARCHAR — Single-letter funding source: A integral de la buget, B credite externe, C credite interne, D fonduri externe nerambursabile, E activitati finantate integral din venituri proprii, F integral venituri proprii, G venituri proprii si subventii. The letter is the source's own key; join to funding_sources for the full label. (~10 distinct) - `functional_code` VARCHAR NOT NULL — Functional classification code, six digits exactly as the file writes them ("031800", "510103"). ITS MEANING DEPENDS ON account_category: for "ch" it is the COFOG-style chapter/subchapter/paragraph of what the money was spent on; for "vn" it is the revenue indicator classification, a different code system in the same column. (range: "010100" … "875000") (~1125 distinct) - `functional_code_dotted` VARCHAR — The same code punctuated the way Romanian budget documents write it — "51.01.03" — so it matches a code read off a printed budget or a ministry order without reformatting. - `functional_chapter` VARCHAR — First two digits of functional_code: the chapter (capitol), e.g. "51" for general public services or "65" for education. The level almost every summary groups by. - `functional_name` VARCHAR — The code's name, taken from the report itself — the Forexebug file carries its own code dictionary, which is why no separate classification download exists. - `economic_code` VARCHAR — Economic classification code, six digits ("100101" = salarii de baza). Null on revenue lines, where it does not apply; present on essentially every expenditure line. (~595 distinct) - `economic_code_dotted` VARCHAR — The economic code punctuated as "10.01.01". - `economic_title` VARCHAR — First two digits of economic_code: the title/group (titlu), e.g. "10" personnel, "20" goods and services, "51" transfers between public administration units, "71" capital expenditure. Codes "51" and "42" are the ones normally excluded to avoid double counting when consolidating across institutions. - `economic_name` VARCHAR — The economic code's name as the report states it. - `program_code` VARCHAR — Budget programme code from the report's PROGRAM_BUGETAR group, e.g. "0000000000" for "no programme" or "0000002510" for pre-university education. Most entities report a single placeholder programme; a few break their spending down by programme, and for those the same classification line appears once per programme. (~248 distinct) - `program_name` VARCHAR — The programme name as the report states it. - `classification_type` VARCHAR — The report's own TIP_CLASIF label for the line — "Venit" or "Cheltuiala". Carried through verbatim; it is redundant with account_category in every file seen, and it is kept so that a future divergence is visible rather than silently normalised away. - `is_deduction` BOOLEAN NOT NULL — True when the functional name marks the line as subtractive — "(se scad)" / "(se scade)". THE AMOUNT IS STILL POSITIVE: the source neither signs these rows nor flags them, and its own TOTAL VENITURI adds them like any other line, so this connector does not negate them either. The flag exists so a reader who needs the netting can do it deliberately. Derived here by matching the name, so it is never null. - `ytd_amount` DECIMAL(18,2) NOT NULL [RON] — The amount, CUMULATIVE FROM 1 JANUARY of reporting_year, in lei. This is the source's only measure — Forexebug publishes no monthly column, verified by comparing the same entity's January and March reports. A month's own movement is ytd_amount minus the previous month's over the same dimension key: see the README's "monthly_amount" example. Negative values are legitimate (corrections and reversals) and are never filtered out. ### commitment_line_items The budget commitments (angajamente bugetare) fact table: one row per classification line of one commitments report, with thirteen year-to-date measures covering the whole chain from a commitment ceiling to a payment made. Fed by report codes 902, 903 and 904. PUBLISHED QUARTERLY, not monthly — only months 3, 6, 9 and 12 exist, which was measured, not assumed. - 0 rows · 1.2 KB · write mode `snapshot_history` - Physically sorted by: `reporting_year`, `reporting_month`, `entity_cif`, `functional_code` - Primary key: `report_id`, `funding_source_code`, `functional_code`, `economic_code`, `program_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/commitment_line_items.parquet (0 rows) Columns: - `report_id` VARCHAR NOT NULL — The report this line came from; joins to reports and report_files. (~0 distinct) - `report_code` VARCHAR NOT NULL — The commitments report code: "902" detailed, "903" aggregated at principal authorising officer level, "904" aggregated at secondary level. They overlap the same way the execution codes do — filter to one before summing across entities. (~0 distinct) - `reporting_year` INTEGER NOT NULL — Calendar year of the reported period. (range: null … null) (~0 distinct) - `reporting_month` INTEGER NOT NULL — Month of the reported period. Always 3, 6, 9 or 12. (range: null … null) (~0 distinct) - `reporting_quarter` INTEGER — Quarter of the reported period, 1-4. Derived from reporting_month, and unambiguous here precisely because commitments are only ever published at a quarter end. - `period_end_date` DATE NOT NULL — Last calendar day of the reported month, stored as the UTC calendar day — see report_files.period_end_date for how it is taken from the file name. - `entity_cif` VARCHAR NOT NULL — CIF/CUI of the reporting entity. (range: null … null) - `main_creditor_cif` VARCHAR — CIF of the principal authorising officer. - `budget_sector_code` VARCHAR NOT NULL — Two-digit budget sector code. - `funding_source_code` VARCHAR — Single-letter funding source, as in execution_line_items. (~0 distinct) - `functional_code` VARCHAR NOT NULL — Functional classification code, six digits. Commitments cover expenditure only, so this is always the spending classification — there is no revenue variant to disambiguate. (range: null … null) (~0 distinct) - `functional_code_dotted` VARCHAR — The functional code punctuated as "51.01.03". - `functional_chapter` VARCHAR — First two digits of functional_code: the chapter (capitol). - `functional_name` VARCHAR — The code's name as the report states it. - `economic_code` VARCHAR — Economic classification code, six digits. (~0 distinct) - `economic_code_dotted` VARCHAR — The economic code punctuated as "10.01.01". - `economic_title` VARCHAR — First two digits of economic_code: the title/group (titlu). - `economic_name` VARCHAR — The economic code's name as the report states it. - `program_code` VARCHAR — Budget programme code from the PROGRAM_BUGETAR group. (~0 distinct) - `program_name` VARCHAR — The programme name as the report states it. - `credite_angajament` DECIMAL(18,2) [RON] — Credite de angajament: the commitment appropriation for the line — how much the entity is authorised to commit to, year-to-date. Never add this to a credite_bugetare figure; they are two parallel measures of two different things and Romanian budget law reports them side by side for exactly that reason. - `limita_credit_angajament` DECIMAL(18,2) [RON] — Limita creditelor de angajament: the ceiling placed on the commitment appropriation. - `credite_bugetare` DECIMAL(18,2) [RON] — Credite bugetare: the budget appropriation — how much may actually be PAID this year, as opposed to committed. This is the measure that lines up with execution spending. - `credite_angajament_initiale` DECIMAL(18,2) [RON] — The commitment appropriation as first approved, before any in-year amendment. - `credite_bugetare_initiale` DECIMAL(18,2) [RON] — The budget appropriation as first approved, before any in-year amendment. Comparing it against credite_bugetare_definitive is how you see a budget being rectified mid-year. - `credite_angajament_definitive` DECIMAL(18,2) [RON] — The commitment appropriation after every in-year amendment — the definitive figure. - `credite_bugetare_definitive` DECIMAL(18,2) [RON] — The budget appropriation after every in-year amendment — the definitive figure. - `credite_angajament_disponibile` DECIMAL(18,2) [RON] — Commitment appropriation still unused: the definitive figure less what has been committed. - `credite_bugetare_disponibile` DECIMAL(18,2) [RON] — Budget appropriation still unused: the definitive figure less what has been consumed. - `receptii_totale` DECIMAL(18,2) [RON] — Recepții totale: goods and services actually received — the point at which an obligation to pay arises, whether or not the payment has been made. - `plati_trezor` DECIMAL(18,2) [RON] — Plăți efectuate prin trezorerie: payments made through the State Treasury, year-to-date. - `plati_non_trezor` DECIMAL(18,2) [RON] — Payments made outside the State Treasury (commercial bank accounts, mainly EU-funded project accounts), year-to-date. - `receptii_neplatite` DECIMAL(18,2) [RON] — Recepții neplătite: received but not yet paid — arrears in the making. The measure to watch when asking whether an institution is running up unpaid bills. ### entities The public-institution register, built from the portal index itself: one row per (entity, budget sector) pair that has ever filed a report. An entity that reports in two sectors appears twice, because its principal authorising officer can differ between them. - 3,320 rows · 56 KB · write mode `append` - Physically sorted by: `entity_cif`, `budget_sector_code` - Primary key: `entity_cif`, `budget_sector_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/entities.parquet (3,320 rows) Columns: - `entity_cif` VARCHAR NOT NULL — CIF/CUI of the public entity. (range: "10464660" … "9766550") (~2625 distinct) - `budget_sector_code` VARCHAR NOT NULL — Two-digit budget sector code it files under. (range: "01" … "05") (~5 distinct) - `entity_name` VARCHAR — Official name, as first seen in the portal index. - `county_name` VARCHAR — County it is registered in, as the index prints it. - `main_creditor_cif` VARCHAR — CIF of the ordonator principal de credite it reports under, which is the parent edge of the Romanian budget hierarchy (principal to secondary to tertiary). - `main_creditor_name` VARCHAR — Name of that principal authorising officer. - `is_own_main_creditor` BOOLEAN — True when the entity is its own principal authorising officer — i.e. it sits at the top of its own budget hierarchy. True for municipalities, county councils and ministries. - `first_seen_period_end` DATE — The reporting period of the report this row was first built from. Not a registration date: it says when this dataset first saw the entity, which is bounded by the periods that have been ingested. Stored as the UTC calendar day, like report_files.period_end_date. ### budget_sectors The five budget sectors ("sectoare bugetare") a Romanian public entity can report under, with the label ANAF prints for each. Harvested from the reports themselves. - 5 rows · 850 B · write mode `append` - Physically sorted by: `budget_sector_code` - Primary key: `budget_sector_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/budget_sectors.parquet (5 rows) Columns: - `budget_sector_code` VARCHAR NOT NULL — Two-digit code: "01" state budget, "02" local budget, "03" state social insurance, "04" unemployment fund, "05" health fund (FNUASS). (range: "01" … "05") (~5 distinct) - `budget_sector_name` VARCHAR — The label verbatim, whitespace included — "Bugetul local (administratie locala)" really does carry three consecutive spaces in ANAF's own output. - `first_seen_period_end` DATE — The reporting period this label was first read from, stored as the UTC calendar day. ### funding_sources The funding sources ("surse de finanțare") a budget line can be financed from, keyed by the single letter ANAF uses as the code. Harvested from the reports' own SURSA_FINANTARE field. - 10 rows · 946 B · write mode `append` - Physically sorted by: `funding_source_code` - Primary key: `funding_source_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/funding_sources.parquet (10 rows) Columns: - `funding_source_code` VARCHAR NOT NULL — The single-letter code, A through J. The letter is the natural key the source itself uses; there is no numeric id in the files. (range: "A" … "J") (~10 distinct) - `funding_source_name` VARCHAR — The label, e.g. "Integral de la buget", "Credite externe", "Venituri proprii si subventii". - `first_seen_period_end` DATE — The reporting period this label was first read from, stored as the UTC calendar day. ### functional_classifications The functional classification dictionary — code to name — as the report files themselves carry it. Keyed by (account_category, functional_code) because the same six digits mean different things on a revenue line and on an expenditure line: for "ch" the code is the COFOG-style chapter of what the money was spent on, for "vn" it is the revenue indicator. - 948 rows · 19 KB · write mode `append` - Physically sorted by: `account_category`, `functional_code` - Primary key: `account_category`, `functional_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/functional_classifications.parquet (948 rows) Columns: - `account_category` VARCHAR NOT NULL — "vn" (revenue) or "ch" (expenditure) — which of the two code systems this row belongs to. (range: "ch" … "vn") (~2 distinct) - `functional_code` VARCHAR NOT NULL — The six-digit code as the file writes it. (range: "010100" … "875000") (~1125 distinct) - `functional_code_dotted` VARCHAR — The same code punctuated as "51.01.03". - `functional_chapter` VARCHAR — First two digits: the chapter (capitol). - `functional_name` VARCHAR — The name the source gives the code. - `is_deduction` BOOLEAN — True when the name marks the indicator as subtractive — "(se scad)" / "(se scade)". Amounts carrying it are still published positive; see execution_line_items.is_deduction. - `first_seen_period_end` DATE — The reporting period this name was first read from, stored as the UTC calendar day. ### economic_classifications The economic classification dictionary — code to name — as the report files carry it. Economic codes describe WHAT was bought (salaries, goods, transfers, capital), as opposed to the functional code, which describes what it was FOR. - 589 rows · 11 KB · write mode `append` - Physically sorted by: `economic_code` - Primary key: `economic_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/economic_classifications.parquet (589 rows) Columns: - `economic_code` VARCHAR NOT NULL — The six-digit code as the file writes it. (range: "100000" … "850105") (~595 distinct) - `economic_code_dotted` VARCHAR — The same code punctuated as "10.01.01". - `economic_title` VARCHAR — First two digits: the title/group (titlu), e.g. "10" personnel, "20" goods and services, "51" transfers between public administration units, "71" capital expenditure. - `economic_name` VARCHAR — The name the source gives the code. - `first_seen_period_end` DATE — The reporting period this name was first read from, stored as the UTC calendar day. ### budget_programs The budget programmes ("programe bugetare") reports break their spending down by. Most entities report one placeholder programme ("0000000000"); some, such as school inspectorates, split their spending across real programmes, and it is those rows that make the programme dimension worth carrying. - 267 rows · 8.9 KB · write mode `append` - Physically sorted by: `program_code` - Primary key: `program_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/anaf-forexebug/v/01M26DHWNRRD3ZKGG2NKMV7ESE/budget_programs.parquet (267 rows) Columns: - `program_code` VARCHAR NOT NULL — The ten-digit programme code as the file writes it. (range: "0000000000" … "0000002891") (~248 distinct) - `program_name` VARCHAR — The programme name. For the placeholder programme the source writes "0000", which is a name in the sense that the source gives no other. - `is_placeholder` BOOLEAN — True for the all-zeros programme code, which means "this report is not broken down by programme" rather than naming a real programme. - `first_seen_period_end` DATE — The reporting period this name was first read from, stored as the UTC calendar day. ## Performance notes - There are no indexes in a lakehouse. The physical sort order plus Parquet row-group min/max statistics ARE the index. Predicates on the leading sort columns prune whole row groups; everything else is a full column scan. - `report_files` prunes on `reporting_year` → `reporting_month` → `report_code` → `entity_cif`. - `reports` prunes on `reporting_year` → `reporting_month` → `report_code` → `entity_cif`. - `execution_line_items` prunes on `reporting_year` → `reporting_month` → `entity_cif` → `account_category` → `functional_code`. - `commitment_line_items` prunes on `reporting_year` → `reporting_month` → `entity_cif` → `functional_code`. - `entities` prunes on `entity_cif` → `budget_sector_code`. - `budget_sectors` prunes on `budget_sector_code`. - `funding_sources` prunes on `funding_source_code`. - `functional_classifications` prunes on `account_category` → `functional_code`. - `economic_classifications` prunes on `economic_code`. - `budget_programs` prunes on `program_code`. - `ILIKE '%needle%'` cannot prune: it decompresses that whole column. Prefer prefix predicates on the lowercased search companion columns where they exist. - Every file URL under `/v//` is immutable. Cache it as aggressively as you like. - Files are never rewritten in place — a new ingest writes a new version path. Re-read the manifest to pick up updates rather than polling the file URLs. - Pull only the columns you need. Parquet is columnar and the reader range-GETs what it reads. ## Do not - Do not scrape https://data.bunnytech.app HTML. Every number on those pages comes from the manifest above. - Do not hit the upstream source (https://mfinante.gov.ro/apps/transparenta-bugetara/index.htm) in bulk. This mirror exists so you do not have to. - Do not read DuckLake internal data files with a plain Parquet reader. They come with positional delete files, and ignoring those silently returns deleted rows. Use the ducklake extension, or use the published exports above. - Do not republish without the attribution line, and do not imply endorsement.