Skip to content
AltUrb

Methodology

Some of what this site shows comes unchanged from the region; some of it we produce ourselves. The work-type classification reaches 92.0% accuracy in French and 95.0% in Dutch on a 300-case evaluation set. Surfaces are recomputed net, missing values carry a reason code rather than a zero, and nothing is shown below ten cases.

From the source to the page

Every night at 03:00 the full feed of the three Nova layers is downloaded and kept compressed, unmodified. Those files are the reference: the database is rebuilt from them, never the other way round. Any figure on the site can therefore be traced back to the snapshot that produced it.

The load then compares each case with its previous version through a fingerprint over the meaning-carrying fields. An unchanged case is not rewritten; a changed one creates a new version, and status changes become dated events.

Enrichment finishes around 06:00 and the statistics around 06:30. No page aggregates anything at display time: a commune's figures were all produced on the same night from the same snapshot, which is why they agree with each other.

The work-type classification

Nova does not say what a project does: it publishes a free-text description, in French, in Dutch or both. We have it read by a language model (Claude Sonnet 5) with a fixed prompt and a strict output schema, which assigns one primary type out of 21 and as many secondary types as the text supports.

Primary-label accuracy, measured on 11 September 2026 against a 300-case set frozen in advance and never used to tune the prompt.
SubsetAccuracyRequired threshold
French-language cases (200)92.0%90%
Dutch-language cases (100)95.0%90%
Overall93.0%

The threshold blocks publication: until accuracy reaches 90% in each language separately, the classification is not published. It is re-measured whenever the prompt changes. Dutch is deliberately oversampled in the evaluation set relative to its real share of the data.

A case with no description is never classified on a hunch: it carries the reason code no_description and stays without a work type. 77,047 cases, almost all of them old, are in that position.

A work type is an automated reading of a text, not an administrative fact. Roughly one case in fourteen carries a questionable primary type. For an individual decision, read the description and check against the source.

Surfaces and net m²

Nova publishes an existing, a projected and an authorised area per use. The last two are totals after the works, not the size of the job: a minor modification to a large estate carries the whole estate's surfaces.

We therefore compute a net m² per use: authorised area, or projected when there is none, minus the existing area. That is the only measure that describes the project. Gross totals stay visible but never rank or compare anything.

The environmental layer has no surface fields at all. Measures there are empty with the reason not_applicable; for a mixed case the page shows the linked planning record's surfaces, labelled as coming from it, so they are never counted twice.

Dates and the timeline

The application date is the reception date of the request; failing that, the sending date, and we state which one was used. Since 2024 Nova leaves the reception date empty on about half the records: without that fallback, 2025 would show 1,687 applications instead of 7,085.

A case timeline distinguishes two origins. An observed event is a change we saw happen between two nightly loads. A reconstructed event is inferred from the case's own date fields, for everything that happened before we were watching that case. Both are dated, and the page says which is which.

Implausible dates are kept as received in the raw data but neutralised for display, with the reason implausible_in_source: before 1800, or too far into the future. 199 planning cases are affected, mostly validity dates between 2052 and 2073 and a few typing errors such as 1824 for 2024.

A reason code rather than a zero

A missing value is not a zero. Whenever data is absent, the page shows why it is absent instead of a number that would be wrong.

CodeMeaning
missing_in_sourceThe source does not carry this value for this case.
not_reportedThe source says nothing: the field exists but nothing was declared.
not_applicableThe notion does not exist for this kind of case — surfaces on an environmental permit, for instance.
implausible_in_sourceThe value exists but falls outside plausible bounds.
no_descriptionThe case carries no usable description.

The most visible case is planning charges: a withheld or undeclared amount is never shown as “€ 0”, because that would assert that a project carries none when we do not know.

What we keep out of the figures

The list of excluded sub-types is a table in the database, read through a single definition of a visible permit. Search, the pages, the maps, the statistics and the sitemaps all read that definition: adding an exclusion is one row, not a change in six files.

Known limits

An error in our derived fields is corrected on request. An error in the case itself has to be corrected by the administration; the correction then reaches us within 24 hours.

Updated on 13 September 2026