Salary Data Methodology

SalaryScope derives salary figures from a multi-factor mathematical model — not from self-reported surveys. Every number is reproducible from public government data and the formulas below.

This page explains each step in full so you can verify any figure yourself.

Why most salary sites get international figures wrong

Most competing sites calculate international city salaries as:US salary × cost-of-living indexThis is mathematically wrong. A German software engineer does not earn "US salary × Germany cost-of-living." They earn a salary set by German labor market conditions.

SalaryScope uses each country's actual average wage from OECD/ILO data, then applies how much a particular occupation earns above the national average in that country's labor market. This produces results that match what employers actually pay.

The Master Formula

salary(job, city) =
countryAvgWage(country) // OECD / ILO / World Bank
× OccupationPremiumRatio(job) // BLS OES: job ÷ all-occupation avg
× skillElasticity(job, country) // scarcity premium in developing countries
× incomeTierCompression(country) // Europe pays lower tech premium than US
× cityMetroPremium(city) // metro area vs national average
× deterministicJitter(job, city) // ±3%, reproducible per job×city pair

For US cities, Steps 2–5 are collapsed: the BLS national median is used directly, then multiplied by the BLS metro-area premium for that city (also from BLS OES).

1

Country Average Wages — Three Tiers

Every country has a baseline annual average wage in PPP-adjusted USD. We use the most authoritative source available for each country, in priority order:

TierSourceCountriesBadge
Tier 1OECD Average Wages (AV_AN_WAGE)
PPP-adjusted USD, employer-reported, 2023 actuals
38 OECD members (US, Germany, Japan, UK…)OECD verified
Tier 2ILO ILOSTAT
Mean wages by country, PPP-converted, 2023/2024
Singapore, India, Brazil, UAE, China…ILO estimate
Tier 3World Bank GNI per capita (PPP)
GNI/cap × labor income share (0.40–0.60 by tier), 2024
Nigeria, Bangladesh, Ethiopia, Ghana…GDP estimate

The badge shown on each salary page tells you which tier was used. Data is refreshed every 30 days by calling the OECD SDMX-JSON API and the World Bank REST API automatically.

2

Occupation Premium Ratio (OPR)

The OPR answers: "How much more does this job pay than the average of all jobs?"It is derived entirely from U.S. BLS Occupational Employment and Wage Statistics (OEWS) — the most rigorous employer-survey wage dataset published by any government.

OPR(job) = jobMedianWage_US / allOccupationAvgWage_US
// allOccupationAvgWage_US = $80,440 (BLS OEWS 2023 national all-occupation average)
// OPR is clamped to [0.5, 5.0] to guard against outliers
Example: Software Developer US median = $130,160
OPR = $130,160 / $80,440 = 1.62×
→ software developers earn 62% above the average worker across all countries

Every job in our database is mapped to a BLS SOC code. Each SOC code has its own OPR. For emerging roles without their own SOC code (AI engineer, blockchain developer), we use the category-average OPR from closely related occupations.

3

Skill Elasticity

In lower-income countries, skilled workers earn a disproportionately larger premium above the national average. A software engineer in India earns roughly 5–8× the national average — far above the 1.62× ratio in the US — because of international demand and talent scarcity. This effect is captured by the Skill Elasticity multiplier:

skillElasticity(job, country) =
1 + SI × α × ln(usAvgWage / countryAvgWage)
// SI = Skill Intensity for this category (0 = unskilled, 1 = hyper-specialized)
// α = 0.17 (calibration constant)
// ln() = natural logarithm — amplifies effect non-linearly for poorer countries
Examples (Software Engineer, SI = 0.92):
Germany (avg $62k): SE = 1 + 0.92 × 0.17 × ln(80440/62400) = 1.04×
Brazil (avg $12k): SE = 1 + 0.92 × 0.17 × ln(80440/12800) = 1.30×
India (avg $4.5k): SE = 1 + 0.92 × 0.17 × ln(80440/4500) = 1.48×
Skill Intensity by category
Technology0.92
Finance0.88
Science0.82
Engineering0.80
Legal0.75
Healthcare0.70
Business0.65
Marketing0.60
Creative0.55
Real Estate0.55
Education0.52
Government0.50
Trades0.45
Hospitality0.40
4

Income Tier Compression

In Western Europe and Japan, the gap between skilled and unskilled workers is compressed by strong unions, higher minimum wages, and social wage norms. A software engineer in Germany earns roughly 1.7× the national average — not the 1.62× US OPR. This compression is applied per income tier:

Income TierGDP/cap (PPP)ExamplesOPR Multiplier
High income> $35kGermany, Japan, UK, France× 0.82 (compressed)
Upper middle$13–35kPoland, Brazil, China, Mexico× 0.92
Middle$5–13kIndonesia, South Africa, Colombia× 1.00 (neutral)
Lower middle$2–5kIndia, Vietnam, Philippines, Nigeria× 1.18 (amplified)
Low income< $2kEthiopia, Tanzania, Rwanda× 1.42 (amplified)
5

Log-Normal Percentile Bands

Salary distributions within an occupation follow a log-normal distribution — validated in research by BLS, NBER, and the Federal Reserve. Given a median salary M and a spread parameter σ (calibrated per job category), percentiles are computed as:

P(x) = M × exp(z_score × σ)
P10 = M × exp(−1.282 × σ) // entry-level proxy
P25 = M × exp(−0.674 × σ)
P50 = M // median (anchor)
P75 = M × exp( 0.674 × σ)
P90 = M × exp( 1.282 × σ) // senior-level proxy
// Example: Software Engineer (σ = 0.34), M = $130,000
P10 = $130k × exp(−1.282 × 0.34) = $130k × 0.645 = $83,900
P25 = $130k × exp(−0.674 × 0.34) = $130k × 0.795 = $103,400
P75 = $130k × exp( 0.674 × 0.34) = $130k × 1.258 = $163,500
P90 = $130k × exp( 1.282 × 0.34) = $130k × 1.549 = $201,400
σ (spread) by category — wider σ = wider income range
Financeσ=0.46
bonuses vary widely
Creativeσ=0.42
freelance vs staff gap
Legalσ=0.40
BigLaw vs public sector
Real Estateσ=0.44
commission-based
Technologyσ=0.34
stable distribution
Businessσ=0.35
moderate variance
Scienceσ=0.31
academic vs industry
Engineeringσ=0.30
relatively uniform
Marketingσ=0.36
seniority spread
Healthcareσ=0.27
licensing floors
Tradesσ=0.27
union rates help
Educationσ=0.22
salary scales narrow
Governmentσ=0.20
pay bands public
6

City Metro Premium

Each city has a metro premium — how much more employers pay compared to the national average in that country. For US cities, this uses BLS metro-area OEWS data directly. For international cities, premiums are derived from labor economics research on agglomeration effects.

San Francisco1.68×
New York1.56×
Seattle1.52×
London1.28×
Paris1.28×
Singapore1.00×
Zurich1.12×
Tokyo1.30×
Shanghai1.65×
Bangalore1.52×
Dubai1.18×
Sydney1.20×
7

Deterministic Jitter

A ±3% variation is applied per job×city pair using an FNV-1a hash of the slugs. This ensures two different jobs in the same city show slightly different numbers (as in reality), but the same job×city pair always produces the same value across page loads, deployments, and servers. The jitter does not change the median — it reflects natural inter-firm pay variation within a market.

8

Auto-Update Schedule

DataSourceFrequency
US job salaries (all 207)BLS OEWS APIEvery 24 hours
City cost-of-living indexesWorld Bank PPPEvery 24 hours
H-1B company wagesBLS OEWS + USCISEvery 7 days
International country wagesOECD API + World Bank GNIEvery 30 days

All updates run on the production server's internal scheduler. No external cron services or GitHub Actions are used.

Questions about methodology? data@salaryscope.co · See also: About & Data Sources