Skip to main content

Indicator coverage summary

Atlas view

Indicator coverage summary

api_v1.indicator_summary

One row per indicator and source: latest year, kommune coverage and value range.

First 5 rows · api_v1.indicator_summary
snapshot 2026-05-12
source_idcontents_codecontents_labellatest_yearkommuner_with_valuekommuner_with_nullmin_valuemax_valueupstream_updated
fhi-bor-aleneRATEAndel (prosent)2025357014.778112882378335.71014492753622026-05-06T14:33:01.602+00:00
fhi-bor-aleneSMRStandardisert rate (100 = nasjonalt snitt)2025357058.8771298331957142.2719433797172026-05-06T14:33:01.602+00:00
fhi-bor-aleneTELLERAntall personer20253570472022212026-05-06T14:33:01.602+00:00
fhi-mobbingRATE_grade10Andel (prosent) (10. trinn)20221671903.3647375504710618.30985915492962026-05-06T14:34:02.398+00:00
fhi-mobbingRATE_grade7Andel (prosent) (7. trinn)20222081492.7247956403269836.36363636363642026-05-06T14:34:02.398+00:00

Built from​

This Atlas view joins data from the following upstream sources. Click through for provenance, methodology, and citation.

Showing direct dbt parents. See full lineage in /lineage/ →

Columns​

ColumnDescription
source_idAtlas source identifier, e.g. 'ssb-08764'. Joins back to fact_kommune_indicators.source_id and to the source declarations in indicators/sources.yml.
contents_codeSource-specific ContentsCode verbatim from upstream (e.g. 'EUskala60', 'Folkemengde'). Combined with source_id forms the natural key of this view.
contents_labelHuman-readable label for contents_code, verbatim from upstream. NULL only if every contributing row had a NULL label (rare).
upstream_titleWhat this series is ABOUT, from the source catalogue. The subject was previously unreachable from this view — a consumer used 8 of 195 series and missed the ones matching its own question, because `contents_label` describes the UNIT ("Andel (prosent)") and the subject lived only in an opaque slug (urb-agents #1250, #1252). Joined from mart_meta_sources; NULL only if a source is absent from the catalogue, which `relationships` below asserts cannot happen.
publisherWho publishes the upstream series (SSB, FHI, Bufdir, Brreg). Joined from mart_meta_sources.
eu_themeEU high-value-dataset theme. Populated for all 44 sources — filter on it to ask "what does Atlas have about X?", which is the question this view could not previously answer.
tagsTopic vocabulary from the source manifest, e.g. ['provider:brreg', 'topic:ngo-supply']. Joined from mart_meta_sources. 🔴 QUOTE THE VALUE. A tag contains a colon, and unquoted it is rejected: `?tags=cs.{topic:ngo-supply}` returns 22P02 malformed array literal. The working form is `?tags=cs.{"topic:ngo-supply"}`. ⚠️ The unquoted spelling was published HERE, in this description, until 2026-09-20 — so a consumer following the documentation got an error and had to work the quoting out for itself (urb-agents #1281). Same class as the `personer` description: the contract said something a consumer acted on and it was wrong.
latest_yearMost recent calendar year for which this (source_id, contents_code) has a VALUE in fact_kommune_indicators. The coverage and value-range columns below are computed against this year only. 🔴 THIS CHANGED ON 2026-09-21 AND THE OLD BEHAVIOUR WAS WRONG. It was "has any rows", which pointed at years the publisher had not released yet: upstream ships the full grid, so a row exists with a NULL value. Seven of `ssb-06913`'s eight series resolved to 2026 with `kommuner_with_value` 0 and both value bounds null — a live series whose summary read as empty (urb-agents #1351). ⚠️ IT IS THE LATEST YEAR AN ACTIVE, NON-SENTINEL KOMMUNE HAS A VALUE — the same subject the coverage below is counted over. A first version filtered only on `value is not null` and was defeated by SSB zero-filling retired kommune codes: 0101 Halden (-2019) and 0801 Kragerø (-1959) carry a literal 0 for every year forever, so the year looked populated while every active kommune was null there. `latest_year` and `kommuners_with_value` disagreed about which rows count (urb-agents #1354). ⚠️ A series with no value in ANY year keeps the newest year it has rows for, rather than going null. Disappearing from the catalogue is the worse failure: "0 of 357" invites a question, an absent row does not. ⚠️ READ IT WITH `latest_year_window_years`. For a windowed source this is the FIRST year of the window, not the year of the data, and rendering it alone prints a date that is wrong by up to four years.
latest_year_window_yearsHow many calendar years `latest_year` covers: 1 for an annual series, 5 for `fhi-selvmord`, 3 for `fhi-mobbing`. The span is `latest_year` to `latest_year + latest_year_window_years - 1`. 🔴 WHY IT IS A COLUMN AND NOT A SENTENCE. The window was already stated in prose in this catalogue. On 2026-09-21 it was misread twice in one day in opposite directions — a reviewer called a live `fhi-selvmord` series six years stale, and a consumer shipped the caption «Mobbetallene er fra 2022» for a 2022-2024 window. The consumer's proposed workaround, matching `/1-year/i` against the description, false-positives on `fhi-kpr-1aar`, whose title contains "KPR 1-year" and which is annual anyway (urb-agents #1331). 🔵 CROSS-CHECK IT AGAINST `meta_dimensions`, WHICH SAID ALL THIS FIRST. `?code=in.(AAR,Tid)&select=source_id,meaning,value_format` carries the upstream's own description of its time dimension. On 2026-09-21 a consumer, ops-dev and this agent each derived the windowing independently while that relation was already published and already said it — and the claim "exactly two FHI sources are windowed", used as evidence, was wrong; the catalogue named three (urb-agents #1333). ⚠️ IT IS A `max()` OVER THE KOMMUNER AT `latest_year`, because this view's grain is one row per (source, contents_code) and the window lives on the fact row. That is only honest if the window is uniform across kommuner within an indicator-year, which is asserted by the singular test `window_is_uniform_within_an_indicator_year`. If that test ever fails, this column is lossy and the failure is the warning.
kommuner_with_valueCount of active kommuner (kommune_is_active = true) that have a non-NULL value for this indicator at latest_year. The headline coverage number on the data explorer.
kommuner_with_null🔴 FOR AN `fhi-*` SOURCE THIS IS SUPPRESSION, NOT ABSENCE, AND THE TWO LEAD TO OPPOSITE CONCLUSIONS IN A NEED INDEX. FHI hides small numbers by policy. Quoted from FHI's own table metadata (table 377, read 2026-09-22): "Statistikk basert på færre enn 6 tilfeller skjules av personvernhensyn... Dersom mer enn 20 prosent av tallene i en tidsserie er skjult av personvernhensyn, skjules hele tidsserien for ikke å skape et skjevt inntrykk av situasjonen i kommunen." So FHI hides a cell under ~6 cases, and hides the WHOLE SERIES when more than 20% of it is hidden — explicitly to avoid giving a skewed impression of that kommune. ⚠️ A consumer that reads the resulting gap as "no need here" is producing exactly the skew the suppression exists to prevent, and doing it in the direction that moves help away from the smallest places. 🔵 MEASURED, and the shape is unambiguous (urb-agents #1369, #1379): 105 kommuner are missing from 10 or more `fhi-*` series, median population 1,452, monotonic in population. `1151 Utsira`, 219 people, is missing from 15. EVERY kommune is absent from at least three series — so a kommune appearing here is ordinary and is not a defect to report. ⚠️ The thresholds above are table 377's; the policy is FHI-wide but each table states its own. Read the source's metadata rather than assuming 6. 🔵 It is NOT suppression for SSB sources. SSB zero-fills instead — a dissolved kommune carries a literal 0 forever — which is a different failure and was the cause of the `latest_year` defect fixed in a657f4f. Two publishers, two conventions, and the same column has to be read differently for each. Count of active kommuner that have a row at latest_year but value IS NULL (i.e. upstream suppressed the cell). Inactive kommuner are not counted.
min_valueMinimum non-NULL value across all rows at latest_year, regardless of whether the kommune is active. NULL if no row had a value.
max_valueMaximum non-NULL value across all rows at latest_year, regardless of whether the kommune is active. NULL if no row had a value.
upstream_updatedMost recent fact_kommune_indicators.updated_at across the rows that contributed to this summary. Useful for staleness checks per indicator without joining to raw.*.

Sample query​

Live PostgREST query that returns the first 5 rows. URL adapts to the current host — local dev shows api-atlas.localhost; the deployed site shows the configured API base.

https://api-atlas.urbalurba.com/indicator_summary?limit=5

About this view​

One row per indicator and source: latest year, kommune coverage and value range. One row per (source_id, contents_code) summarising the latest-year coverage and value range for every indicator in fact_kommune_indicators. This is the backing dataset for the data explorer index page (atlas-frontend /data) and is the equivalent of the listIndicators() inline query that PostgREST projects as /mart_indicator_summary on the public API. Query shape: latest-year-per-indicator + group-by + value/null counts filtered to active kommuner only. Inactive kommuner (historical codes retained by upstream) are excluded from the counts so consumers see "how many of today's kommuner have data?" not "how many rows exist?". Refreshed nightly together with fact_kommune_indicators. The upstream_updated column carries the most recent raw load timestamp across the rows that contributed to this summary, so freshness can be inspected per indicator without joining to raw.* sources.