Free, no-auth JSON endpoints for AI job risk data across 206 countries. Built on ILO ILOSTAT, UNDP HDR, and World Bank Open Data.
All endpoints return JSON. No authentication, no API key, no sign-up. Fetch directly from the browser or server.
{code} with a lowercase ISO 3166-1 alpha-2 country code, e.g. us, de, in// Fetch AI job risk data for Germany fetch('https://www.worldjobsdata.com/data/countries/de.json') .then(r => r.json()) .then(d => { console.log(d.country_name); // "Germany" console.log(d.stats.weighted_ai_avg); // e.g. 5.3 console.log(d.occupations.length); // 9 or 10 console.log(d.wb_economy.gdp_per_capita_usd); // World Bank GDP console.log(d.hdr_data.hdi); // UNDP HDI score });
https://www.worldjobsdata.com
All responses are served from Vercel's global CDN. Cache-Control: public, max-age=86400 - files update when new data is published (roughly monthly).
CORS is open - you can fetch from any origin, including the browser.
A machine-readable OpenAPI 3.1 spec is available at /data/openapi.json - compatible with Postman, Swagger UI, and any OpenAPI tooling.
Data tiers reflect source quality. Tier A countries (US, UK, DE, FR, JP, etc.) have full ISCO-08 occupation data with wages, growth projections, and education breakdown. Tier B/C countries have employment shares and AI scores but may lack wages or growth data.
// Response structure (abbreviated) { "countries": [ { "code": "US", // UPPERCASE alpha-2 "name": "United States", "tier": "A", // A | B | C "weighted_ai_exposure": 5.1, "weighted_robotics_risk": 3.5, "total_employment_thousands": 143100, "has_wages": true, "has_growth": true, "youth_unemployment_rate": 8.9, "risk_velocity_label": "Disruption imminent (0-3 years)" // ...28 more fields } // ...205 more countries ], "tier_counts": { "A": 35, "B": 61, "C": 110 } }
{code} must be lowercase ISO 3166-1 alpha-2 (e.g. us, gb, in, de). Returns occupation groups with AI scores, wages, employment, plus World Bank economy and UNDP HDR indicators.// GET /data/countries/us.json { "country_code": "US", "country_name": "United States", "year": 2024, "tier": "A", "total_employment_thousands": 143100, "occupations": [ { "isco_code": "4", "label": "Clerical support workers", "ai_exposure": 8.5, "robotics_risk": 2.5, "wfh_potential": 8, "employment_thousands": 18800, "employment_pct": 13.1, "median_annual_wage_usd": 45760 } // ...8 more occupation groups ], "wb_economy": { /* World Bank indicators */ }, "hdr_data": { /* UNDP HDI indicators */ } }
meta.json are UPPERCASE ("US"). File paths are lowercase (/data/countries/us.json). Always call .toLowerCase() when building the URL from a meta entry.
// GET /data/isco_scores.json (abbreviated) [ { "isco_code": 4, "label": "Clerical support workers", "ai_exposure": 8.5, "robotics_risk": 2.5, "offshoring_risk": 5.0, "wfh_potential": 8 } // ...9 more groups ]
| Field | Type | Description |
|---|---|---|
| country_code | string | ISO 3166-1 alpha-2, UPPERCASE (e.g. "US") |
| country_name | string | Full country name in English |
| year | integer | Labour force survey reference year |
| tier | string | "A" (full data), "B" (partial), or "C" (core only) |
| total_employment_thousands | number | null | Total employed persons in thousands |
| occupations | array | Array of ISCO-08 occupation groups - see Occupation schema |
| stats | object | Precomputed weighted averages (weighted_ai_avg, weighted_robotics_avg, etc.) |
| risk_velocity | number | Score 0-10 indicating how soon disruption arrives |
| risk_velocity_label | string | Human-readable velocity label |
| recovery_resilience | number | Score 0-10 for workforce recovery capacity |
| wb_economy | object | null | World Bank economy indicators - see WB Economy schema |
| hdr_data | object | null | UNDP Human Development Report indicators - see HDR schema |
| source_ids | array | Data source citations (ILO ILOSTAT, BLS, Eurostat, etc.) |
| Field | Type | Description |
|---|---|---|
| isco_code | string | ISCO-08 major group code "0"-"9" |
| label | string | ISCO-08 major group label |
| ai_exposure | number | AI exposure score 0-10 (10 = highest risk) |
| robotics_risk | number | Physical automation risk score 0-10 |
| offshoring_risk | number | Offshoring susceptibility 0-10 |
| wfh_potential | number | Work-from-home potential 0-10 |
| employment_thousands | number | null | Workers in this group (thousands) |
| employment_pct | number | null | Share of total employment (%) |
| female_share_pct | number | null | Female share of employment (%) |
| median_annual_wage_usd | number | null | Median annual wage in USD (null if unavailable) |
| projected_growth_pct | number | null | 10-year employment growth projection (Tier A only) |
| ai_rationale | string | Plain-English explanation of AI exposure score |
wb_economy)| Field | Type | Description |
|---|---|---|
| gdp_per_capita_usd | number | null | GDP per capita in current USD |
| population | number | null | Total population |
| labor_force_participation_pct | number | null | Labour force participation rate, total (%) |
| labor_force_participation_female_pct | number | null | Labour force participation rate, female (%) |
| unemployment_pct | number | null | Unemployment rate, modelled ILO estimate (%) |
| poverty_headcount_3usd_pct | number | null | Population below $3.65/day poverty line (%) |
| gini | number | null | Gini inequality coefficient |
| adult_literacy_pct | number | null | Adult literacy rate (%) |
| life_expectancy | number | null | Life expectancy at birth (years) |
| *_year | string | null | Data year for each indicator (e.g. gdp_per_capita_usd_year) |
Source: World Bank Open Data (CC BY 4.0). Most recent year per indicator as of the last enrichment run.
hdr_data)| Field | Type | Description |
|---|---|---|
| hdi | number | null | Human Development Index score (0-1) |
| hdi_rank | integer | null | Global HDI rank (1 = highest) |
| gni_per_capita_ppp | number | null | GNI per capita in PPP USD |
| life_expectancy | number | null | Life expectancy at birth (years) |
| expected_years_schooling | number | null | Expected years of schooling |
| mean_years_schooling | number | null | Mean years of schooling (adults 25+) |
| hdr_year | integer | HDR report year (e.g. 2022) |
| source | string | "UNDP Human Development Report 2023/24" |
For high-volume use (10k+ requests/day), please cache responses on your side. The Cache-Control: max-age=86400 header tells you files are stable for 24 hours. Data refreshes happen monthly at most.
To be notified when data updates, watch the GitHub repository or check the year field in the country JSON.
WorldJobsData scores and analysis are published under CC BY 4.0. Attribution: "WorldJobsData (worldjobsdata.com)".
Underlying data sources have their own licences:
| Source | Licence | Fields |
|---|---|---|
| ILO ILOSTAT | CC BY 4.0 | employment, wages, female share |
| World Bank Open Data | CC BY 4.0 | wb_economy.* |
| UNDP Human Development Reports | CC BY 3.0 IGO | hdr_data.* |
| US Bureau of Labor Statistics | Public domain | detail_occupations (US only) |
| Eurostat | CC BY 4.0 | employment (EU countries) |
// Fetch meta.json once, sort by AI exposure const meta = await fetch('https://www.worldjobsdata.com/data/meta.json') .then(r => r.json()); const ranked = meta.countries .filter(c => c.weighted_ai_exposure != null) .sort((a, b) => b.weighted_ai_exposure - a.weighted_ai_exposure); console.log('Most AI-exposed:', ranked[0].name, ranked[0].weighted_ai_exposure);
import requests
def get_country(code):
url = f'https://www.worldjobsdata.com/data/countries/{code.lower()}.json'
return requests.get(url).json()
us = get_country('us')
de = get_country('de')
# Compare avg AI exposure
print(us['country_name'], us['stats']['weighted_ai_avg'])
print(de['country_name'], de['stats']['weighted_ai_avg'])
# Compare HDI
print(us['hdr_data']['hdi'], de['hdr_data']['hdi'])
library(jsonlite) meta_url <- "https://www.worldjobsdata.com/data/meta.json" meta <- fromJSON(meta_url) countries_df <- meta$countries # Top 10 by AI exposure top10 <- head(countries_df[order(-countries_df$weighted_ai_exposure), ], 10) print(top10[, c("name", "weighted_ai_exposure", "tier")])