Denmark · read live on this request
The record, as it actually stands today.
Four datasets, one country, every row receipted. Nothing on this page is baked, and a failed read says so in words. Coverage is Denmark by design: no second country until the first is green.
Coverage: Denmark · Vitals 2016–2025 · Tenders 2026–2026 · Decisions 5 of 99 communes since 2024
HALANTIR / THE OFFICIAL LAYER SPINE (subject, place, time, value, receipt) TERRITORY 1,119 COMMUNES · 5 COUNTRIES COVERAGE 1 HARVESTED · 4 SEEDED HARVEST ON A CLOCK, NIGHTLY, IN SQL LEDGER THE LEDGER OPENS WITH THE FIRST CLAIM GATE NO COUNTRY TWO UNTIL THE FIRST IS GREEN · LAW 28 REFUSAL NEVER A PERSON · NEVER A SCORE · NEVER AN UNRECEIPTED ROW RENDERED 2026-09-21T04:59:10Z BUILT BY HEIMLANDR AB
Harvested · carries rows and receipts
Seeded · the schema holds it, the harvest has not reached it
1,119 commune centroids · read 2026-09-21T04:59:10Z
- Norway 357 seeded
- Finland 309 seeded
- Sweden 290 seeded
- Denmark 99 harvested
- Iceland 64 seeded
One mark is one commune, at its own administrative centroid, and there is nothing smaller on this map by design. No basemap, no imagery, no settlement, no address. The shape you are looking at is the administrative grid itself.
The gate
One country lit. Four seeded and waiting.
Every commune in the Nordics is already in the schema, at its own administrative centroid. One of them is harvested. The other four carry no rows and no receipts yet, and they are drawn faint for exactly that reason.
A map that lit all five would be the first lie this system told. The gate is a promise about sequence, and this is what keeping it looks like.
One mark is one commune. There is nothing smaller on this map, by design and by schema.
01 · Danmarks Statistik
Municipal vitals
The year-keyed series Danmarks Statistik publishes for every Danish commune, harvested from the official statbank registers and reduced to the spine sentence: subject, place, time, value, receipt. The statistical office is the only source.
The harvest stores what the register publishes, verbatim. It does not estimate, interpolate, or fill a missing year with a plausible one. Where the register is silent, the record is silent, and says so.
Vitals rows Read failed
- Source
- api.v1_counters · vitals_rows
- Read
- 2026-09-21T04:59:10Z
- Method
- rowcount-v1 · DK · 2016-01-01 → 2025-12-31
View the request
GET /rest/v1/v1_counters?select=* apikey: <anon> authorization: Bearer <anon>
GET /rest/v1/v1_vitals
02 · TED
Tenders
Danish public procurement notices from TED, the EU's official tenders journal, harvested since 2021. TED has two eras, and the record refuses to smooth over the wall between them.
From 2023-10-25 the eForms mandate applies: notices arrive structured at the source, and outcome fields are machine-readable. Before the mandate, the modern search interface returns no award fields at all. The outcomes of that era exist only inside each notice's legacy XML, and the harvest fetches them notice by notice, at a pace the register tolerates.
Which era a notice belongs to is a property of the notice, never a guess. Procedure type is the one outcome-adjacent field the registers populate across both eras, and it is harvested across the whole span.
Tender notices Read failed
- Source
- api.v1_counters · tenders
- Read
- 2026-09-21T04:59:10Z
- Method
- rowcount-v1 · DK · 2026-01-02 → 2026-08-27
View the request
GET /rest/v1/v1_counters?select=* apikey: <anon> authorization: Bearer <anon>
GET /rest/v1/v1_tenders
03 · Committee ledgers
Decisions
Committee decision ledgers from five Danish communes: Randers · Vejle · Aarhus · Odense · Horsens. Walked meeting by meeting since January 2024. Each row is one agenda item from one committee meeting, stored verbatim from the commune's own published ledger, with the meeting date and the receipt to the page it came from.
The five are the proving set: the harvest is proven commune by commune, not announced country by country. Ninety-four Danish communes remain, behind the gate.
Decisions · 5 communes Read failed
- Source
- api.v1_counters · decisions
- Read
- 2026-09-21T04:59:10Z
- Method
- rowcount-v1 · DK · 2024-01-04 → 2026-09-09 · end = last scheduled meeting on record
View the request
GET /rest/v1/v1_counters?select=* apikey: <anon> authorization: Bearer <anon>
GET /rest/v1/v1_decisions
04 · Outcomes
Tender outcomes
Who won, and how many bid. For notices in the eForms era the outcomes arrived structured. For the legacy era they were recovered notice by notice from the per-notice XML, and that recovery is complete.
Where a source holds no award, a cancelled procedure or a discontinued lot, the absence is written down as a receipted negative, never skipped. A gap you can cite is a finding. A gap that was silently dropped is a lie.
Named winners Read failed
- Source
- api.v1_counters · tenders_with_winners
- Read
- 2026-09-21T04:59:10Z
- Method
- rowcount-v1 · DK · 2026-01-02 → 2026-08-27 · awards top-up 04:20Z daily
View the request
GET /rest/v1/v1_counters?select=* apikey: <anon> authorization: Bearer <anon>
Award lots Read failed
- Source
- api.v1_counters · tender_award_lots
- Read
- 2026-09-21T04:59:10Z
- Method
- rowcount-v1 · DK · 2026-01-02 → 2026-08-27 · awards top-up 04:20Z daily
View the request
GET /rest/v1/v1_counters?select=* apikey: <anon> authorization: Bearer <anon>
GET /rest/v1/v1_tender_awards
05 · Corrections
The corrections ledger
The record corrects itself in public. When a harvested row is later shown wrong, by a register revision or a missed parse, the correction files into its own ledger: what stood, what stands now, and the receipt for both.
A correction never deletes anything. The record of having been wrong stays readable, because a record that can quietly forget its errors is not a record.
Corrections filed 5 Live
- Source
- api.v1_corrections · exact count
- Read
- 2026-09-21T04:59:10Z
- Method
- count=exact · the standing ledger
View the request
HEAD /rest/v1/v1_corrections?select=* Prefer: count=exact apikey: <anon> authorization: Bearer <anon>
GET /rest/v1/v1_corrections
06 · The track record
The claims ledger
Every claim a detector makes is filed in falsifiable form with a check date, and rechecked against fresh harvest when it matures. Matured misses are classified and kept; the precision of every detector version will publish with the misses included, once there are matured claims to score.
Until then no hit rate renders anywhere on this site. A track record with nothing in it is not zero, it is unopened, and the two are different facts.
Claims filed 3 Live
- Source
- api.v1_claims · exact count
- Read
- 2026-09-21T04:59:10Z
- Method
- count=exact · the ledger opens with the first claim
View the request
HEAD /rest/v1/v1_claims?select=* Prefer: count=exact apikey: <anon> authorization: Bearer <anon>
GET /rest/v1/v1_claims · GET /rest/v1/v1_misses
07 · The receipt
What a row carries.
Every row in every dataset carries the same three fields, and the schema refuses the insert without them: the source URL it was fetched from, the timestamp of the fetch, and a hash of the fetched content. That is law 1 as a column constraint.
Every figure on this page opens into its receipt: the view it was read from, the moment of the read, the method line, and the verbatim request that produced it. The request replays against the same public door every reader gets, described on the access page. Nothing shown here is privileged.
Read failed
- Source
- api.v1_counters · last_fetch_at
- Read
- 2026-09-21T04:59:10Z
- Method
- live read · the moment the last register answered
View the request
GET /rest/v1/v1_counters?select=last_fetch_at apikey: <anon> authorization: Bearer <anon>
Anyone holding a row can fetch the source and hash it themselves.