The official layer

Live— last harvest 2026-08-06T05:20:04Z

File interest

Denmark · read live on this request

The record.

Four datasets, one country, every row receipted. The figures on this page are read from the live spine at the moment you requested it — nothing is baked into the page, and a failed read says READ FAILED. Coverage is Denmark by design: the gate says no second country until Denmark is green.

Coverage: Denmark · Vitals 2016–2025 · Tenders 2021–2026 · Decisions 5 of 99 communes since 2024

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 24,962 Live
Source
api.v1_counters · vitals_rows
Read
2026-08-06T09:25:49Z
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 45,034 Live
Source
api.v1_counters · tenders
Read
2026-08-06T09:25:49Z
Method
rowcount-v1 · DK · 2021-01-04 → 2026-08-06
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 25,005 Live
Source
api.v1_counters · decisions
Read
2026-08-06T09:25:49Z
Method
rowcount-v1 · DK · 2024-01-08 → 2026-08-13 · 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 are being recovered notice by notice from the per-notice XML. That backfill is running now — the counts below move between renders, and the stamp says so. Where a source holds no award — a cancelled procedure, 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 14,681 Live · backfill running
Source
api.v1_counters · tenders_with_winners
Read
2026-08-06T09:25:49Z
Method
rowcount-v1 · DK · 2021-01-04 → 2026-08-06 · mid-backfill — re-read every render
View the request
GET /rest/v1/v1_counters?select=*
apikey: <anon>
authorization: Bearer <anon>
Award lots 32,142 Live · backfill running
Source
api.v1_counters · tender_award_lots
Read
2026-08-06T09:25:49Z
Method
rowcount-v1 · DK · 2021-01-04 → 2026-08-06 · mid-backfill — re-read every render
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 — a register revised, a parse missed — 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 forever, because a record that can quietly forget its errors is not a record.

Corrections filed 0 Live
Source
api.v1_corrections · exact count
Read
2026-08-06T09:25:49Z
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 0 Live
Source
api.v1_claims · exact count
Read
2026-08-06T09:25:49Z
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 the first law as a column constraint — a row without a receipt cannot exist, because the database will not hold it.

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 API door every reader gets — the one described on the access page. Nothing shown here is privileged.