# SUMAL timber-transport permits > Timber-transport permits ("avize") tracked by SUMAL 2.0, Romania's national wood-traceability system operated by the Ministerul Mediului, Apelor și Pădurilor via STS, as exposed by the public Inspectorul Pădurii lookup. Two tables: permits, one row per authorisation with its detail (issuer, transporter, declared volume and species, validity window), and permit_locations, one row per permit with where it is currently plotted on the public map. Photographs attached to a permit ('poze') are deliberately not republished — only their count is kept. - Dataset id: `sumal-timber-permits` - Update cadence: daily - Upstream source: https://inspectorulpadurii.ro/ - Tags: forestry, timber, romania, transport, sumal, permits, environment - Current version: ingest `01M1NQFRMGFMD6ZG1GD0B9BQ29`, snapshot 2026-09-04, generated 2026-09-04T08:18:44.655Z ## Licence and attribution - Licence: Romanian official acts and public-interest information — outside copyright (`ro-official-acts-public-domain`) - Licence text: https://legislatie.just.ro/Public/DetaliiDocument/7816 - Required attribution: Date despre autorizațiile de transport al masei lemnoase publicate de Ministerul Mediului, Apelor și Pădurilor — SUMAL 2.0, prin Inspectorul Pădurii - Notes: Legea 8/1996 privind dreptul de autor, art. 9, excludes from copyright both official texts of an administrative nature and simple facts and data. Each row here is drawn from an official permit — an `aviz de însoțire a materialului lemnos` the state issues and tracks through SUMAL 2.0 — and permit registers of this kind, together with the bare facts they carry (volumes, dates, coordinates, issuer and transporter identity), are exactly the administrative-act and factual-data category the statute excludes from copyright. They are also public-interest information under Legea 544/2001 and re-usable public-sector information under Legea 179/2022 — Romania's transposition of EU Directive 2019/1024 on open data and the reuse of public-sector information. HOWEVER, and a reuser must weigh this: checked on 2026-09-02, inspectorulpadurii.ro publishes no licence, terms or legal page of any kind — the app is a single-route React page showing a live map, with no footer and no /terms, /legal or /about route — and robots.txt sets an empty "Disallow:" for every user agent, placing no restriction on the API path used here. No explicit reuse licence has therefore been found for this data, and none should be assumed; this dataset rests on the legal position above rather than on any grant from the Ministerul Mediului, Apelor și Pădurilor, and anyone republishing it should make their own assessment. Treat this dataset accordingly: it is a DERIVED work, republishing a subset of what the /api/aviz/locations and /api/aviz/{codAviz} endpoints return — the fields captured in the permits and permit_locations tables — with the source's own photographs (poze) deliberately excluded, since they are binary attachments rather than tabular data; only their count (num_poze) is kept. The publisher may change, restrict or withdraw this API at any time without notice; re-check this page and the API's own behaviour before relying on it for anything beyond casual analysis. 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/sumal-timber-permits/manifest.json - All datasets: https://data-directory.fsn1.your-objectstorage.com/public/index.json - Human page: https://data.bunnytech.app/datasets/sumal-timber-permits 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 permits AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/sumal-timber-permits/v/01M1NQFRMGFMD6ZG1GD0B9BQ29/permits.parquet'); CREATE OR REPLACE VIEW permit_locations AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/sumal-timber-permits/v/01M1NQFRMGFMD6ZG1GD0B9BQ29/permit_locations.parquet'); ``` Example queries: -- Permits issued in the last week: valabilitate_emitere is the leading sort column, so this range prunes well. ```sql ATTACH IF NOT EXISTS 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/catalog.ducklake' AS "datadirectory" (READ_ONLY); SELECT cod_aviz, emitent_denumire, transportator_denumire, volum_total, valabilitate_emitere FROM datadirectory.sumal_timber_permits.permits WHERE valabilitate_emitere >= now() - INTERVAL 7 DAY ORDER BY valabilitate_emitere DESC ``` -- Total declared volume moved by each transporter this month ```sql ATTACH IF NOT EXISTS 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/catalog.ducklake' AS "datadirectory" (READ_ONLY); SELECT transportator_denumire, transportator_cui, sum(volum_total) AS total_m3, count(*) AS permits FROM datadirectory.sumal_timber_permits.permits WHERE valabilitate_emitere >= date_trunc('month', now()) GROUP BY 1, 2 ORDER BY total_m3 DESC LIMIT 20 ``` ## 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/sumal-timber-permits/catalog.ducklake' AS sumal_timber_permits (READ_ONLY); SELECT * FROM sumal_timber_permits.main.permits LIMIT 5; USE sumal_timber_permits; ``` - Latest catalog: https://data-directory.fsn1.your-objectstorage.com/catalog/sumal-timber-permits/catalog.ducklake - This exact version: https://data-directory.fsn1.your-objectstorage.com/catalog/sumal-timber-permits/v/01M1NQFRMGFMD6ZG1GD0B9BQ29/catalog.ducklake (sha256 2e502bfffbd81a6f76b08853c71db8c2d554152c90d334496b9d50b9480b5bc3) - Written by DuckDB v1.5.5 - Time travel: this ingest is snapshot 4 — e.g. `SELECT * FROM sumal_timber_permits.permits AT (VERSION => 4)` ## 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/sumal-timber-permits/v/01M1NQFRMGFMD6ZG1GD0B9BQ29/**/*.parquet'); ``` ## Schema ### permits One row per timber-transport permit ("aviz", codAviz) issued under SUMAL 2.0, with the detail SUMAL records for it: who issued it, who is transporting, the declared volume and species, and the validity window. has_finished_transport flips from false to true once SUMAL records the transport as complete, which is why this table upserts on cod_aviz instead of appending — a permit is one evolving record, not a one-off event. - 998 rows · 53 KB · write mode `upsert` - Physically sorted by: `valabilitate_emitere`, `cod_aviz` - Primary key: `cod_aviz` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/sumal-timber-permits/v/01M1NQFRMGFMD6ZG1GD0B9BQ29/permits.parquet (998 rows) Columns: - `cod_aviz` VARCHAR NOT NULL — The permit code, e.g. "DA26022347000207757509020046". Assigned by SUMAL at issue; the primary key of this table. (range: "DA26008560000201764809020743" … "DC26034330000012733609010920") (~876 distinct) - `tip_aviz` INTEGER — Numeric permit-type code (tipAviz); see nume_tip_aviz for its name and permit_locations.tip_aviz for the same code on the location row. - `nume_tip_aviz` VARCHAR — Human-readable permit type as named by SUMAL, e.g. "Depozit" (depot), "Locul Recoltării" (harvesting site) or "Alte situații" (other situations). - `has_finished_transport` BOOLEAN — Whether SUMAL has recorded this permit's transport as finished. Flips from false to true after issue — the reason this table is upserted rather than appended. - `nr_identificare` VARCHAR — The vehicle or transport identifier tied to this permit (typically a licence plate), as recorded by SUMAL. - `nr_apv` VARCHAR — "Autorizație de Punere în Valoare" number: the forestry harvesting authorisation this timber was cut under, when the permit names one. Kept as text — it can be a long numeric code with no reason to be treated as a quantity. - `provenienta` VARCHAR — Free-text origin as written by SUMAL: a depot name, a harvesting-site description, or a reference to another permit for transshipped timber. - `id_aviz` BIGINT — SUMAL's own internal numeric id for this permit (volum.idAviz), distinct from the human-facing cod_aviz code. - `volum_total` DECIMAL(12,4) [m3] — Total declared volume of timber on this permit, in cubic metres (volum.total). Matched marfa.total in every permit inspected while building this connector. - `marfa_grupe_specii` VARCHAR — Species groups declared on this permit (e.g. "RĂȘINOASE", "FAG"), as SUMAL's own comma-joined summary string. - `marfa_specii` VARCHAR — Individual species declared on this permit (e.g. "MOLID , BRAD"), as SUMAL's own comma-joined summary string. - `marfa_sortimente` VARCHAR — Timber assortments/products declared on this permit (e.g. "Lemn rotund", "Cherestele"), as SUMAL's own comma-joined summary string. - `emitent_denumire` VARCHAR — Name of the entity that issued this permit. - `emitent_cui` VARCHAR — Fiscal code (CUI/CIF) of the issuing entity. Kept as text: Romanian fiscal codes can carry a leading "RO" prefix and must not be treated as a number. - `transportator_identificator` VARCHAR — Identifier SUMAL has on file for the transporter (typically the same value as nr_identificare). - `transportator_denumire` VARCHAR — Name of the transporting entity. - `transportator_cui` VARCHAR — Fiscal code (CUI/CIF) of the transporting entity. Kept as text for the same reason as emitent_cui. - `transportator_tip` VARCHAR — How SUMAL classifies the transporter, e.g. "SUMAL" for one registered in the system. - `transportator_non_sumal` BOOLEAN — True when the transporter is not itself registered in SUMAL. - `beneficiar_tip` VARCHAR — Legal nature of the beneficiary: "FIZICA" (individual) or "JURIDICA" (legal entity). - `destinatar_tip` VARCHAR — Legal nature of the consignee, same vocabulary as beneficiar_tip. - `valabilitate_emitere` TIMESTAMPTZ — When this permit was issued (UTC). (range: "2026-08-29 06:31:33.534+00" … "2026-09-04 07:49:35.098+00") - `valabilitate_finalizare` TIMESTAMPTZ — The deadline by which the transport authorised by this permit must be completed (UTC). - `tip_marfa` VARCHAR — Cargo-type classification SUMAL records for unusual transports (e.g. containerised cargo). Null on every permit inspected while building this connector; kept because the field exists in the API. - `angajat` VARCHAR — Employee identifier SUMAL records against this permit, when one applies. Null on every permit inspected while building this connector. - `remorca` VARCHAR — Trailer identifier SUMAL records against this permit, when one applies. Null on every permit inspected while building this connector. - `identificator_container` VARCHAR — Container identifier, for timber shipped in a container. Blank on every permit inspected while building this connector. - `num_poze` INTEGER — How many photographs SUMAL has attached to this permit. The photographs themselves are deliberately not republished here (see the licence notes) — this is only their count. - `first_seen_date` DATE NOT NULL — The first run day (UTC) on which we saw this permit. Maintained automatically by the upsert loader — never overwritten, only widened. - `last_seen_date` DATE NOT NULL — The most recent run day (UTC) on which this permit was still returned by the API. ### permit_locations Where a currently tracked SUMAL timber-transport permit is right now: one row per permit (cod_aviz), carrying the coordinates and the depot/site id the public map itself plots. This is a live snapshot from /api/aviz/locations, not a historical record of every past location: a permit's row reflects the position it had at fetch time, and it stays untouched (not deleted) once the permit drops out of that endpoint's current window. - 107.6K rows · 1 MB · write mode `upsert` - Physically sorted by: `tip_aviz`, `cod_aviz` - Primary key: `cod_aviz` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/sumal-timber-permits/v/01M1NQFRMGFMD6ZG1GD0B9BQ29/permit_locations.parquet (107.6K rows) Columns: - `cod_aviz` VARCHAR NOT NULL — The permit's code (codAviz), e.g. "DA26022347000207757509020046". Stable identifier of one timber-transport permit; joins to permits.cod_aviz. (range: "AP26000051000002293608310842" … "LC26006777000609773309011459") (~127308 distinct) - `id_depozit` BIGINT — SUMAL internal id of the depot or site (idDepozit) this permit is plotted at on the map. SUMAL sends -1 as a sentinel meaning "not applicable" (observed on every "Alte situații" permit and a scattered few of other types); this column stores that as null rather than a fake numeric id. - `tip_aviz` INTEGER — Numeric permit-type code as returned by this endpoint (tipAviz): observed values include 1 (harvesting site), 2 (depot), 7, 9 and 10 (other situations). permits.nume_tip_aviz gives the human-readable name for the same code. (range: 1 … 10) - `lat` DOUBLE [degrees] — Latitude of the plotted location (WGS 84). - `lng` DOUBLE [degrees] — Longitude of the plotted location (WGS 84). - `first_seen_date` DATE NOT NULL — The first run day (UTC) this permit appeared in the locations endpoint. Maintained automatically by the upsert loader — never overwritten, only widened. - `last_seen_date` DATE NOT NULL — The most recent run day (UTC) this permit still appeared in the locations endpoint. A permit that has since dropped out (transport finished, or it rolled out of the endpoint's window) keeps its last known position here rather than being deleted. ## 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. - `permits` prunes on `valabilitate_emitere` → `cod_aviz`. - `permit_locations` prunes on `tip_aviz` → `cod_aviz`. - `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://inspectorulpadurii.ro/) 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.