What is available?
Every dataset is published in both CSV (for spreadsheet tools) and JSON (for code). Files are refreshed automatically by GitHub Actions and served via GitHub Pages. All permanent raw links below are stable and suitable for use in live queries from Excel, Power BI, Tableau, R, Python, SPSS, or Stata — the data refreshes in the background without breaking your link.
Last snapshot: loading… · Generated (UTC): loading…
Datasets
countries_master
The authoritative country-level reference table. One row per ISO3 code. Contains:
iso3,iso2,m49— standard country codes- Country names in English, Arabic, Chinese, French, Russian, Spanish
- UN geoscheme: global, region, sub-region, intermediate region codes and names
- UN special designations:
is_ldc,is_lldc,is_sids - World Bank: income level, lending type, WB region, capital city, lat/lon
- World Bank FCS status, FCS category, fiscal year
- OECD DAC: ODA-eligible flag, WB income hint, reporting year
country_group_membership
Every country–group relationship in long (tidy) format. Ideal for merging into your own analysis. Columns:
iso3,iso2,m49— country identifierssource— e.g. un_m49, world_bank, oecd_dac, world_bank_fcs, un_sdggroup_type— e.g. region, income_level, special_group, oda_eligibilitygroup_code— short code for the groupgroup_name— human-readable group name
country_classification_library
A fully denormalized join of countries_master and country_group_membership. Every row is a country–group pair plus all country metadata. Best for ad-hoc queries when you don't want to do your own join. Contains all columns from both parent tables.
aggregates
Long-format reference table matching the OSAA / UNCTAD aggregates format. One row per country-group membership. Best for pivot tables, group-level analysis, and matching against other UN reference datasets. Columns:
Country or Area— English country nameM49 Code— UN numeric codeiso2,iso3— ISO alpha codescountry_grouping— group name (e.g. Africa, Low income, Least Developed Countries (LDC))
Tip: In Excel, pivot on country_grouping to count countries per group.
In R: dplyr::count(df, country_grouping). In Python: df.groupby("country_grouping").size().
sources & run_manifest
Provenance and integrity records for each pipeline run.
- sources.csv/json — one row per upstream source: organisation, title, URL, access timestamp, license note, notes
- run_manifest.json — snapshot ID, UTC timestamp, record counts, and SHA-256 checksums for every output file
SDR 2025 extracted artifacts
Machine-readable extracts used by the SDG Analytics Lab.
sdr2025_codebook.json— 126 indicator definitions, thresholds, metadata, and source notessdr2025_overview.json— 208-country SDG index overview with goal dashboard and trend statusessdr2025_indicator_scores.json— 2025 normalized indicator scores by country (102 indicators)
Permanent raw links (for live queries)
These links always serve the latest committed version. Paste them directly into Excel, Power BI, Tableau, or code — no need to re-download manually.
| File | Raw URL |
|---|---|
| countries_master.csv | …/data/latest/countries_master.csv |
| country_group_membership.csv | …/data/latest/country_group_membership.csv |
| country_classification_library.csv | …/data/latest/country_classification_library.csv |
| aggregates.csv | …/data/latest/aggregates.csv |
| sources.csv | …/data/latest/sources.csv |
| run_manifest.json | …/data/latest/run_manifest.json |
| sdr2025_codebook.json | …/docs/data/sdr2025_codebook.json |
| sdr2025_overview.json | …/docs/data/sdr2025_overview.json |
| sdr2025_indicator_scores.json | …/docs/data/sdr2025_indicator_scores.json |
How to load the data in your tool
Copy-paste snippets for every major tool. Replace the URL with any raw link from the table above.
# Install readr if needed: install.packages("readr") library(readr) BASE <- "https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/" # Master country table (one row per country/area) countries <- read_csv(paste0(BASE, "countries_master.csv")) # Long-format group memberships memberships <- read_csv(paste0(BASE, "country_group_membership.csv")) # Full denormalized library (country + group in one table) library_df <- read_csv(paste0(BASE, "country_classification_library.csv")) # Example: filter to LDC countries ldc <- countries[countries$is_ldc == TRUE, ] # Example: find all World Bank income-level memberships income_groups <- memberships[memberships$source == "world_bank" & memberships$group_type == "income_level", ]
# pip install pandas requests import pandas as pd BASE = "https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/" # Master country table countries = pd.read_csv(BASE + "countries_master.csv") # Long-format group memberships memberships = pd.read_csv(BASE + "country_group_membership.csv") # Full denormalized library library_df = pd.read_csv(BASE + "country_classification_library.csv") # Example: LDC countries ldc = countries[countries["is_ldc"] == True] # Example: World Bank FCS list fcs = countries[countries["wb_fcs_status"] == True][["iso3","country_name_en","wb_fcs_category"]] # Example: merge memberships back to country names df = memberships.merge(countries[["iso3","country_name_en"]], on="iso3")
--- Excel (Get Data from Web) --- 1. Open Excel → Data tab → Get Data → From Web 2. Paste this URL: https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/countries_master.csv 3. Click OK → in Power Query Editor, select the table and click "Close & Load" 4. To refresh later: Data tab → Refresh All --- Power Query formula (paste in Advanced Editor) --- let Source = Csv.Document( Web.Contents("https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/countries_master.csv"), [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv] ), PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true]) in PromotedHeaders
--- Power BI Desktop --- 1. Home → Get Data → Web 2. Paste URL: https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/countries_master.csv 3. Power Query will detect it as a CSV table automatically. 4. Promote first row as headers if not already done. --- M formula (Power Query Advanced Editor) --- let Source = Csv.Document( Web.Contents( "https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/countries_master.csv" ), [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv] ), #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]), #"Changed Types" = Table.TransformColumnTypes(#"Promoted Headers", {{"is_ldc","Logical"},{"is_lldc","Logical"},{"is_sids","Logical"}, {"wb_fcs_status","Logical"},{"oecd_dac_eligible","Logical"}}) in #"Changed Types" -- Tip: load country_group_membership.csv as a second query, -- then create a relationship on iso3 to build a cross-filter.
--- Tableau Desktop --- Option A — Web Data Connector (Tableau 2020.4+): Connect → Web Data Connector Paste: https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/countries_master.csv Option B — Text File (download first): 1. Download countries_master.csv from this page 2. Connect → Text File → select the downloaded file Option C — Google Sheets bridge: 1. In Google Sheets: File → Import → upload the CSV 2. Publish the sheet (File → Share → Publish to web → CSV) 3. Connect Tableau to that published CSV URL -- After connecting, you can JOIN country_group_membership.csv -- on iso3 to add classification groups to your map/chart.
* SPSS syntax — download the CSV file first, then import. GET DATA /TYPE=TXT /FILE='C:\path\to\countries_master.csv' /ENCODING='UTF8' /DELIMITERS="," /QUALIFIER='"' /ARRANGEMENT=DELIMITED /FIRSTCASE=2 /VARIABLES= iso3 A3 iso2 A2 m49 A3 country_name_en A80 region_name_en A60 wb_income_name A40 is_ldc A5 is_lldc A5 is_sids A5 wb_fcs_status A5 oecd_dac_eligible A5. CACHE. EXECUTE. * Note: download the latest CSV from the Downloads page * before running this syntax, or use a macro to fetch via URL.
* Stata 16+ can import directly from a URL local base "https://raw.githubusercontent.com/MafiAtUN/country-classification-commons/main/data/latest/" * Master country table import delimited "`base'countries_master.csv", /// varnames(1) encoding("UTF-8") clear * Group memberships (long format) import delimited "`base'country_group_membership.csv", /// varnames(1) encoding("UTF-8") clear * Example: keep only LDC countries keep if is_ldc == "True" * Example: merge memberships with master on iso3 import delimited "`base'countries_master.csv", varnames(1) clear save countries_master.dta, replace import delimited "`base'country_group_membership.csv", varnames(1) clear merge m:1 iso3 using countries_master.dta
How to best use this data
Start with countries_master
If you need a single lookup table (e.g. to add income level or region to a dataset you already have), use
countries_master.csv. Join on iso3 (preferred) or m49.
Every country has a unique iso3.
Use country_group_membership for multi-group analysis
If you want to filter or count countries by group (e.g. "all OECD DAC ODA recipients in Sub-Saharan Africa"),
use the long-format country_group_membership.csv.
It is already tidy: one group membership per row, easy to GROUP BY or pivot.
One-stop table: use country_classification_library
Need everything in one place without joins? Use country_classification_library.csv. It is the full Cartesian product of countries × groups, with all country metadata repeated per row. Best for ad-hoc queries, pivot tables, and BI tools where joins are inconvenient.
Key columns reference
source: un_m49 / world_bank / world_bank_fcs / oecd_dac / un_sdggroup_type: region / income_level / lending_type / special_group / fcs_status / oda_eligibility …- Boolean columns (
is_ldc,wb_fcs_status…) are stored as textTrue/Falsein CSV; in JSON they are proper booleans.
Repository download
- Download full repository as ZIP — includes all data, scripts, and history.
- Browse latest data directory on GitHub
- Browse historical snapshots
- Browse change logs