Data API - v1.0

WorldJobsData API

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

No API key required 206 countries CC BY 4.0 CORS open CDN-cached

Quick start

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

GET https://www.worldjobsdata.com/data/countries/{code}.json
Replace {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
  });

Base URL

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.

Coverage

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

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.

Endpoints

Country list

GET /data/meta.json
Returns 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": 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 }
}

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": 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 */ }
}
Note: country codes in meta.json are UPPERCASE ("US"). File paths are lowercase (/data/countries/us.json). Always call .toLowerCase() when building the URL from a meta entry.

Global ISCO scores

GET /data/isco_scores.json
AI exposure, robotics risk, offshoring risk, and WFH potential for all 10 ISCO-08 major occupation groups. Use this as the baseline scoring reference when building your own tools.
// 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
]

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_ai_avg, weighted_robotics_avg, etc.)
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 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 as of the last enrichment run.

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

There are no enforced rate limits for reasonable use. 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), 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.

Licence

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

Underlying data sources have their own licences:

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

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