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.