NGO registry
Atlas view
NGO registry
api_v1.ngo_indexOne row per voluntary organisation Atlas tracks, with its identity, branding and focus.
First 5 rows ·
api_v1.ngo_indexsnapshot 2026-05-12
| orgnr | slug | name | brand_name | website_url | tier | chapter_data_shape | has_chapters | primary_focus | icnpo_code_1 | icnpo_code_2 | icnpo_code_3 | chapter_count | has_supply |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 943838240 | fire-h | 4H Norge | — | https://www.4h.no | A | cms_bins | true | youth | — | — | — | 0 | false |
| 970169113 | diabetesforbundet | Diabetesforbundet | — | https://www.diabetes.no | A | cms_bins | true | patient_support | — | — | — | 0 | false |
| 938498318 | frelsesarmeen | Frelsesarmeen | — | https://www.frelsesarmeen.no | A | cms_bins | true | social | — | — | — | 0 | false |
| 940190738 | lhl | Landsforeningen for hjerte- og lungesyke | LHL | https://www.lhl.no | A | cms_bins | true | patient_support | — | — | — | 0 | false |
| 971322926 | mental-helse | Mental Helse | — | https://mentalhelse.no | A | cms_bins | true | patient_support | — | — | — | 0 | false |
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
| Column | Description |
|---|---|
| orgnr | 9-digit Brreg organisasjonsnummer (text — leading zeros are preserved). Natural key for this view. |
| slug | kebab-case URL-friendly identifier (e.g. 'redcross', 'kirkens-bymisjon'). |
| name | Legal name from Brreg. |
| brand_name | Common brand name when distinct from legal name (e.g. 'Sanitetskvinnene' vs N.K.S.). NULL when the brand equals the legal name. |
| website_url | NGO's primary website. Used as the outbound link from the index page. |
| tier | Structural-fit tier (A / B / C) from docs/research/ngo-landscape.md. v1 includes Tier A only. |
| chapter_data_shape | How 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_chapters | Whether 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_focus | One-line description of the NGO's main mission area. |
| icnpo_code_1 | ICNPO classification code (primary). See ref_icnpo. NULL when unclassified. |
| icnpo_code_2 | ICNPO classification code (secondary). NULL when not used. |
| icnpo_code_3 | ICNPO classification code (tertiary). NULL when not used. |
| chapter_count | Count 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_supply | Convenience 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.