Halantir

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
One mark for each of the 1,119 communes seeded into the spine, plotted at its own administrative centroid. Denmark is drawn lit because it is harvested. Norway, Sweden, Finland and Iceland are drawn faint because they are seeded and not yet harvested.

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.

source_url ted.europa.eu · notice 2025/S 112-338204 The register named, and the path it was fetched from
fetched_at
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>
Read from the spine on this request
content_sha256 9f2c41a7be03 Truncated to 12 of 64

Anyone holding a row can fetch the source and hash it themselves.