Free API - No key required

WorldJobsData API

Open JSON endpoints for AI job risk data across 206 countries. Built on ILO ILOSTAT, UNDP HDR, and World Bank Open Data. CORS open, CDN-cached, no auth.

No API key 206 countries CC BY 4.0 CORS open CDN-cached OpenAPI 3.1
https://www.worldjobsdata.com/data/countries/us.json

Quick start

All endpoints return JSON. No authentication, no API key, no sign-up. Fetch directly from any browser or server.

GET https://www.worldjobsdata.com/data/countries/{code}.json
Replace {code} with a lowercase ISO 3166-1 alpha-2 code - e.g. us, de, in, gb.
// 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_avg_ai_exposure);         // 5.3
    console.log(d.occupations.length);            // usually 9-10 (ISCO-08 major groups); some countries (e.g. Germany) report finer sub-major-group detail, up to 42
    console.log(d.wb_economy.gdp_per_capita_usd); // World Bank GDP
    console.log(d.hdr_data.hdi);                  // UNDP HDI score
  });
Live API test

Base URL

https://www.worldjobsdata.com

All responses are served from Vercel's global CDN with Cache-Control: public, max-age=86400. Files update when new data is published - roughly monthly.

CORS is fully open - 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.

Coverage

Countries
206
With wages
127
With HDI
177
WB economy
198
ISCO groups
9-10
Licence
CC BY 4.0

Data tiers reflect source quality. Tier A countries (21 total, including US, UK, DE, CA, AU, and 16 others) have full ISCO-08 occupation data with wages, growth projections, and education breakdown. Tier B/C countries (19 and 166 respectively) have employment shares and AI scores but may lack wages or growth data.

Endpoints

Country list

GET /data/meta.json
All 206 countries with summary stats - AI exposure scores, employment totals, data tier, and World Bank indicators. Use this to build country pickers or rank tables without fetching all 206 individual files.
// 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": 143978.2,
      "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": 21, "B": 19, "C": 166 }
}

Country data

GET /data/countries/{code}.json
Full data for one country. {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": 2025,
  "tier": "A",
  "total_employment_thousands": 143978.2,
  "occupations": [
    {
      "isco_code": "4",
      "label": "Clerical support workers",
      "ai_exposure": 8.5,
      "robotics_risk": 2.5,
      "wfh_potential": 8.5,
      "employment_thousands": 16227.9,
      "employment_pct": 11.27,
      "median_annual_wage_usd": 46818.01
    }
    // ...8 more occupation groups
  ],
  "wb_economy": { /* World Bank indicators */ },
  "hdr_data": { /* UNDP HDI indicators */ }
}
Case note: country codes in meta.json are UPPERCASE ("US"). File paths are lowercase (/data/countries/us.json). Always call .toLowerCase() when building the fetch URL from a meta entry.

Global ISCO scores

GET /data/isco_scores.json
AI exposure, robotics risk, offshoring risk, and WFH potential for ISCO-08 occupation groups (10 one-digit major groups plus finer sub-major-group detail for many countries, 54 codes total). Use this as the baseline scoring reference when building your own tools.
// GET /data/isco_scores.json (abbreviated - object keyed by ISCO-08 code, not an array)
{
  "4": {
    "digital_ai_exposure": 8.5,
    "robotics_risk": 2.5,
    "offshoring_risk": 7.5,
    "wfh_potential": 8.5,
    "ai_rationale": "...",
    "robotics_rationale": "..."
  }
  // ...53 more codes, keyed "0" through detailed sub-major codes like "42"
}

Schema reference

Country object

FieldTypeDescription
country_codestringISO 3166-1 alpha-2, UPPERCASE (e.g. "US")
country_namestringFull country name in English
yearintegerLabour force survey reference year
tierstring"A" (full data), "B" (partial), or "C" (core only)
total_employment_thousandsnumber | nullTotal employed persons in thousands
occupationsarrayArray of ISCO-08 occupation groups - see Occupation schema
statsobjectPrecomputed weighted averages (weighted_avg_ai_exposure, weighted_avg_robotics_risk, weighted_avg_offshoring_risk, weighted_avg_wfh_potential)
risk_velocitynumberScore 0-10 indicating how soon disruption arrives
risk_velocity_labelstringHuman-readable velocity label
recovery_resiliencenumberScore 0-10 for workforce recovery capacity
wb_economyobject | nullWorld Bank economy indicators - see WB Economy schema
hdr_dataobject | nullUNDP Human Development Report indicators - see HDR schema
source_idsarrayData source citations (ILO ILOSTAT, BLS, Eurostat, etc.)

Occupation object

FieldTypeDescription
isco_codestringISCO-08 major group code "0"-"9"
labelstringISCO-08 major group label
ai_exposurenumberAI exposure score 0-10 (10 = highest risk)
robotics_risknumberPhysical automation risk score 0-10
offshoring_risknumberOffshoring susceptibility 0-10
wfh_potentialnumberWork-from-home potential 0-10
employment_thousandsnumber | nullWorkers in this group (thousands)
employment_pctnumber | nullShare of total employment (%)
female_share_pctnumber | nullFemale share of employment (%)
median_annual_wage_usdnumber | nullMedian annual wage in USD (null if unavailable)
projected_growth_pctnumber | null10-year employment growth projection (Tier A only)
ai_rationalestringPlain-English explanation of the AI exposure score

World Bank economy object (wb_economy)

FieldTypeDescription
gdp_per_capita_usdnumber | nullGDP per capita in current USD
populationnumber | nullTotal population
labor_force_participation_pctnumber | nullLabour force participation rate, total (%)
labor_force_participation_female_pctnumber | nullLabour force participation rate, female (%)
unemployment_pctnumber | nullUnemployment rate, modelled ILO estimate (%)
poverty_headcount_3usd_pctnumber | nullPopulation below $3.65/day poverty line (%)
gininumber | nullGini inequality coefficient
adult_literacy_pctnumber | nullAdult literacy rate (%)
life_expectancynumber | nullLife expectancy at birth (years)
*_yearstring | nullData 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.

UNDP HDR object (hdr_data)

FieldTypeDescription
hdinumber | nullHuman Development Index score (0-1)
hdi_rankinteger | nullGlobal HDI rank (1 = highest)
gni_per_capita_pppnumber | nullGNI per capita in PPP USD
life_expectancynumber | nullLife expectancy at birth (years)
expected_years_schoolingnumber | nullExpected years of schooling
mean_years_schoolingnumber | nullMean years of schooling (adults 25+)
hdr_yearintegerHDR report year (e.g. 2022)
sourcestring"UNDP Human Development Report 2023/24"

Rate limits

No enforced rate limits for reasonable use. All files are served directly from Vercel's global CDN - each request is a static file fetch with no server-side processing.

For high-volume use (10k+ requests/day), cache responses on your side. The Cache-Control: max-age=86400 header means 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.

Licence

WorldJobsData scores and analysis are published under CC BY 4.0. Attribution: "WorldJobsData (worldjobsdata.com)".

Underlying data sources:

SourceLicenceFields
ILO ILOSTATCC BY 4.0employment, wages, female share
World Bank Open DataCC BY 4.0wb_economy.*
UNDP Human Development ReportsCC BY 3.0 IGOhdr_data.*
US Bureau of Labor StatisticsPublic domaindetail_occupations (US only)
EurostatCC BY 4.0employment (EU countries)

Code examples

JavaScript - rank all countries by AI exposure

// 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);

Python - compare two countries

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_avg_ai_exposure'])
print(de['country_name'], de['stats']['weighted_avg_ai_exposure'])

# Compare HDI
print(us['hdr_data']['hdi'], de['hdr_data']['hdi'])

R - load all countries

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")])