Skip to main content

NGO registry

Atlas view

NGO registry

api_v1.ngo_index

One row per voluntary organisation Atlas tracks, with its identity, branding and focus.

First 5 rows · api_v1.ngo_index
snapshot 2026-05-12
orgnrslugnamebrand_namewebsite_urltierchapter_data_shapehas_chaptersprimary_focusicnpo_code_1icnpo_code_2icnpo_code_3chapter_counthas_supply
943838240fire-h4H Norge—https://www.4h.noAcms_binstrueyouth———0false
970169113diabetesforbundetDiabetesforbundet—https://www.diabetes.noAcms_binstruepatient_support———0false
938498318frelsesarmeenFrelsesarmeen—https://www.frelsesarmeen.noAcms_binstruesocial———0false
940190738lhlLandsforeningen for hjerte- og lungesykeLHLhttps://www.lhl.noAcms_binstruepatient_support———0false
971322926mental-helseMental Helse—https://mentalhelse.noAcms_binstruepatient_support———0false

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
orgnr9-digit Brreg organisasjonsnummer (text — leading zeros are preserved). Natural key for this view.
slugkebab-case URL-friendly identifier (e.g. 'redcross', 'kirkens-bymisjon').
nameLegal name from Brreg.
brand_nameCommon brand name when distinct from legal name (e.g. 'Sanitetskvinnene' vs N.K.S.). NULL when the brand equals the legal name.
website_urlNGO's primary website. Used as the outbound link from the index page.
tierStructural-fit tier (A / B / C) from docs/research/ngo-landscape.md. v1 includes Tier A only.
chapter_data_shapeHow this NGO's per-chapter activity data is shaped — drives which ingest pattern it uses. Values: 'api_canonical', 'cms_bins', 'programme_only', 'no_structure'.
has_chaptersWhether this NGO DECLARES that it has chapters — an editorial fact from dim_ngo, recorded when the organisation is curated. Not the same question as has_supply, which is chapter_count > 0 and therefore an ingest OUTCOME: does Atlas hold chapter rows for this organisation yet. They agree today only because all curated NGOs declare has_chapters true and all have been ingested. The first NGO curated before its chapters land makes them disagree, and a consumer filtering on the wrong one loses it without an error.
primary_focusOne-line description of the NGO's main mission area.
icnpo_code_1ICNPO classification code (primary). See ref_icnpo. NULL when unclassified.
icnpo_code_2ICNPO classification code (secondary). NULL when not used.
icnpo_code_3ICNPO classification code (tertiary). NULL when not used.
chapter_countCount of active chapters for this NGO (filtered by dim_chapter.is_active = true). Zero if the NGO has no chapters or all chapters are dormant. 🔴 AND A THIRD CASE, WHICH IS THE ONE TRUE TODAY: zero also means ATLAS HOLDS NO CHAPTER DATA. All eleven organisations currently report `has_chapters = true` with `chapter_count = 0`, and a consumer reading the pair gets a contradiction (urb-agents #1388). 🔵 The two columns answer different questions and both answers are correct. `has_chapters` is a property of the ORGANISATION — it is structured in local chapters — and comes from the roster. `chapter_count` is a property of ATLAS — how many it holds — and comes from `dim_chapter`, which is empty until the Red Cross data arrives. ⚠️ So `has_chapters = true, chapter_count = 0` reads "this organisation has chapters and Atlas has none of them", not "its chapters are all dormant". See `activity_catalog`, `distrikt_summary` and `kommune_local_chapters`, which are empty for the same reason and say so. 🔵 Same shape as the FHI suppression note: the data is right and the reading is the defect.
has_supplyConvenience boolean: chapter_count > 0. True when the NGO has at least one active chapter — i.e. it appears on the supply side of Atlas.

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

About this view​

One row per voluntary organisation Atlas tracks, with its identity, branding and focus. 🔴 WHAT THIS RELATION DELIBERATELY DOES NOT CARRY. The demo consumer matches an organisation's local units in Brønnøysundregistrene by a name SUBSTRING it maintains itself, and it asked Atlas explicitly NOT to publish that (urb-agents #1387): "That is a heuristic we invented and are answerable for; ngo_index has no such column and should not." 🔵 The split it drew, and it is the right one: the ROSTER is ours — orgnr, canonical name, primary_focus, tier — and the MATCHING RULE is theirs. A published pattern column would make Atlas answerable for a guess it did not make, and would make one consumer's heuristic look like a property of the organisation. ⚠️ THIS NOTE EXISTS BECAUSE THE OBVIOUS RESPONSE IS THE WRONG ONE. That consumer has now deleted three hardcoded copies of Atlas data in two days, and each time the right fix was to publish what it was copying — served_as for the unserved list, window_years for the windowed-years map. The reflex "it keeps a copy, so publish it" is correct twice and wrong here. It keeps this copy on purpose. One row per NGO in dim_ngo with chapter_count and has_supply decorations. Backs the NGO landing page (atlas-frontend /ngo) and is equivalent to the listNgos() inline query. chapter_count counts only active chapters (dim_chapter.is_active), so a defunct NGO sits at 0 even if its historical chapters are retained. has_supply is the convenience boolean (chapter_count > 0). The full table is small (~11 rows in v1, growing as new NGOs land), so PostgREST consumers typically read all of it.