Skip to main content

api_v1.meta_endpoints

Atlas view

api_v1.meta_endpoints

api_v1.meta_endpoints

One row per queryable endpoint, with filterable tags.

First 5 rows · api_v1.meta_endpoints
snapshot 2026-05-12
endpointschema_nametable_nametagsis_public_apitable_type
api_v1.activity_catalogapi_v1activity_catalog["layer:api_v1","cadence:irregular","eu_theme:SOCI","geo:kommune","provider:r…trueVIEW
api_v1.coverage_gap_barnefattigdomapi_v1coverage_gap_barnefattigdom["layer:api_v1","cadence:annual","cadence:irregular","eu_theme:EDUC","eu_them…trueVIEW
api_v1.distrikt_summaryapi_v1distrikt_summary["layer:api_v1","cadence:irregular","eu_theme:GOVE","eu_theme:SOCI","geo:komm…trueVIEW
api_v1.indicator_latest_valuesapi_v1indicator_latest_values["layer:api_v1","cadence:annual","cadence:irregular","eu_theme:EDUC","eu_them…trueVIEW
api_v1.indicator_missing_kommunerapi_v1indicator_missing_kommuner["layer:api_v1","cadence:annual","cadence:irregular","eu_theme:EDUC","eu_them…trueVIEW

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
endpointSchema-qualified table/view identifier (`<schema>.<table>`). Primary key.
schema_nameOne of `api_v1`, `marts`, `raw`.
table_nameBare table/view name without schema qualification.
tags`text[]` carrying the layer tag (`layer:<schema>`) plus inherited source tags via union semantics. Filter via PostgREST's `?tags=cs.{...}` array-contains operator.
is_public_api`true` when `schema_name = 'api_v1'`. Lets clients distinguish stable-contract endpoints from the broader `marts.*` / `raw.*` surfaces that are queryable but not version-guaranteed.
table_type`BASE TABLE` for tables (most `marts.*`, all `raw.*`) and `VIEW` for views (all `api_v1.*` wrappers). ⚠️ IN `api_v1` IT IS ALWAYS `VIEW` AND THEREFORE TELLS YOU NOTHING ON ITS OWN. All 17 public relations are views over a `marts.mart_*` relation; this column distinguishes them from `marts.*` and `raw.*`, not from each other. 🔴 IT DOES NOT PREDICT WHETHER `Prefer: count=estimated` CAN BE TRUSTED. Three cases, and the deciding property is whether the aggregation happened BEFORE the planner saw it: 1. the mart is a TABLE — 14 of 17. Its rows were counted by ANALYZE when it was built, whatever its query did, so the estimate is accurate. `indicator_summary` aggregates heavily and estimates fine, because the aggregating happened at build time. 2. the mart is a PLAIN VIEW — `brreg_enhet`. Row count propagates from the base table. Accurate. 3. the mart is an AGGREGATING VIEW — `kommune_ngo_summary` and `kommune_ngo_totals`, and only these. The planner must guess how many groups a GROUP BY will produce, and measured on the live API 2026-09-20 it guessed badly: kommune_ngo_summary exact 5 435 estimated 69 462 12.8x kommune_ngo_totals exact 357 estimated 6 946 19.5x ⚠️ AND SEPARATELY, `estimated = 1` DOES NOT MEAN ONE ROW. It is the planner's floor, so an EMPTY relation reports 1 — measured on activity_catalog, distrikt_summary and kommune_local_chapters, all of which hold zero rows and all of which are case 1. A consumer asking "is there any data here?" cheaply gets yes. ✅ Use `Prefer: count=exact`. The largest published relation is ~72 000 rows and an exact count is cheap; the estimate saves nothing worth being wrong about. 🔵 An earlier version of this description said the split was tables versus views. There are no tables in api_v1, so that rule was unusable — a consumer checking dim_kommune, a view that estimates exactly, would have concluded the documentation was wrong (urb-agents #1288).

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/meta_endpoints?limit=5

About this view​

One row per queryable endpoint, with filterable tags. The index of this API. One row per queryable Atlas endpoint, with tags inherited from upstream sources via the lineage graph and a `layer:<schema>` tag from the schema. Wraps to `api_v1.meta_endpoints` and backs the tag-filter catalogue at `/data` in the customer frontend (PLAN-007 phase 4). 🔵 THIS IS THE INDEX, SO IT SAYS WHERE THE OTHER TWO CATALOGUES ARE: `meta_sources` for one row per ingest source (licence, publisher, freshness), and `meta_dimensions` for one row per source × upstream dimension — what each coded column means and its value format. A consumer enumerating relations here should not have to read 19 descriptions to discover the second one (urb-agents #1335). Includes endpoints from `api_v1.*`, `marts.*`, and `raw.*` (Atlas's three open-by-default schemas; `private_marts.*` stays auth-gated and is excluded). Skips internal seeds prefixed `_` (`_sources_manifest`, `_sources_dimensions`) and any `dbt_*` diagnostic tables. Tag inheritance uses the **union** rule: a `mart_*` derived from many sources picks up every source's `provider:`, `topic:`, `geo:`, `cadence:`, and `eu_theme:` tag, deduped. Filter "involves something annual" beats "purely annual" — see PLAN-007 phase 3.2 for the design rationale.