Levels.fyi API & Scraper
The Levels.fyi API returns tech salary and compensation data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary company/salaries endpoint returns a company's pay by role and location with percentiles for total comp, base salary, bonus and stock, and you can pull a company's roles, search companies, list companies for a role and see submissions. It is built for compensation benchmarking, recruiting and career tools that need real tech-pay data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Levels.fyi level ladders: what L4, SDE II, IC3 and ICT3 mean per company
Every company names its levels differently, and the level strings you get back are that company's own ladder rather than a normalized scale. The table below was measured on 2026-08-27 by calling company/salaries for the software-engineer role at each company with no location filter, which returns the United States figures. P50 is the median total compensation across all levels.
| Company slug | Level ladder returned | Median level | Total-comp P50 (USD) |
|---|---|---|---|
| L3, L4, L5, L6, L7, also named SWE II, SWE III, Senior SWE, Staff SWE | L4 | 302,700 | |
| amazon | SDE I, SDE II, SDE III, Principal SDE, Senior Principal SDE, Distinguished Engineer | SDE II | 262,500 |
| microsoft | numeric bands 59 to 80, some named: SDE 59-60, SDE II 61-62, Senior SDE 63-64, Principal SDE 65-66, Partner 68, Distinguished Engineer 70, Technical Fellow 80 | Senior SDE | 236,900 |
| apple | ICT2, ICT3, ICT4, ICT5, ICT6, Distinguished Engineer, Senior Distinguished Engineer, Engineering Fellow | ICT3 | 271,500 |
| nvidia | IC1 through IC8 | IC3 | 268,000 |
| stripe | L1 through L7 | L2 | 290,540 |
| goldman-sachs | Analyst, Associate, Vice President, Managing Director, Partner | Associate | 160,000 |
A company name is auto-slugified, so company 'Goldman Sachs' resolves to goldman-sachs. Each levels[] entry carries a titles array because a level usually has more than one name, for example ['L3','SWE II'] at Google and ['SDE','59'] at Microsoft, so match on any element rather than assuming titles[0].
Real request and response JSON
Captured from the indexed primary action, company/salaries, on .
{
"method": "POST",
"url": "https://api.reefapi.com/levels-fyi/v1/company/salaries",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"company": "google",
"role": "software-engineer"
}
}{
"ok": true,
"meta": {
"api": "levels-fyi",
"endpoint": "company/salaries",
"mode": "live",
"latency_ms": 1057.4,
"record_count": 7,
"bytes": 602629,
"cache_hit": false,
"url": "/companies/google/salaries/software-engineer",
"charged_credits": 1,
"version": "1.0.0"
},
"data": {
"company": {
"id": 1,
"slug": "google",
"name": "Google",
"description": "Google LLC is an American multinational technology company that specializes in Internet-related services and products, which include online advertising technologies, a search engine, cloud computing, software, and hardware.",
"website": "https://www.google.com",
"linkedin": "company/google",
"year_founded": 1998,
"employee_count": 188000,
"ticker": "GOOG",
"company_type": "public",
"hq_city": "Mountain View",
"hq_state_code": "CA",
"icon": "https://static.levels.fyi/custom/google.webp",
"tags": [
"Internet",
"Web Services & Apps",
"Technology"
],
"vesting_schedule": "38/12,32/12,20/12,10/12|33/12,33/12,22/12,12/12|50/12,28/12,12/12,10/12|36/12,28/12,20/12,16/12|25/12,25/12,25/12,25/12|25/4,25/4,25/4,25/4|33/4,33/4,34/4",
"general_levels": "L3,L4,L5,L6,L7,L8,L9,L10"
},
"role": "Software Engineer",
"role_slug": "software-engineer",
"location": "United States",
"currency": "USD",
"percentiles": {
"total_comp": {
"p10": 177777,
"p25": 215000,
"p50": 294650,
"p75": 382000,
"p90": 481000
},
"base_salary": {
"p10": 150000,
"p25": 164000,
"p50": 199353,
"p75": 225000,
"p90": 250000
},
"bonus": {
"p10": 0,
"p25": 0,
"p50": 28000,
"p75": 37800,
"p90": 50000
},
"stock_grant": {
"p10": 25000,
"p25": 37951,
"p50": 75000,
"p75": 130000,
"p90": 200000
}
},
"median": {
"level": "L4",
"title": "Software Engineer",
"focus_tag": "ML / AI",
"years_of_experience": 2,
"years_at_company": 0,
"location": "Mountain View, CA",
"base_salary": 201000,
"total_compensation": 294650,
"stock_grant_annual": 63500,
"bonus_annual": 30150,
"currency": "USD",
"sample_count": 24207
},
"levels": [
{
"titles": [
"L3",
"SWE II"
],
"title_slugs": [
"l3",
"swe-ii"
],
"order": 0,
"description": "L3 / T3 is the new grad software engineering role at Google",
"percent_workforce": 20,
"target_bonus_percentage": null
},
{
"titles": [
"L4",
"SWE III"
],
"title_slugs": [
"l4",
"swe-iii"
],
"order": 1,
"description": null,
"percent_workforce": 20,
"target_bonus_percentage": null
},
{
"titles": [
"L5",
"Senior SWE"
],
"title_slugs": [
"l5",
"senior-swe"
],
"order": 2,
"description": null,
"percent_workforce": 20,
"target_bonus_percentage": null
}
],
"averages": [
{
"level": "L3",
"secondary_level": "SWE II",
"level_index": 0,
"sample_count": 54,
"sample_count_last_12_months": 1099,
"total_compensation": 196094,
"base_salary": 156185,
"stock_grant": 31458,
"bonus": 8451,
"commission": 0,
"level_page_url": "https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l3"
},
{
"level": "L4",
"secondary_level": "SWE III",
"level_index": 1,
"sample_count": 58,
"sample_count_last_12_months": 841,
"total_compensation": 295637,
"base_salary": 191045,
"stock_grant": 80267,
"bonus": 24325,
"commission": 0,
"level_page_url": "https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l4"
},
{
"level": "L5",
"secondary_level": "Senior SWE",
"level_index": 2,
"sample_count": 46,
"sample_count_last_12_months": 714,
"total_compensation": 434214,
"base_salary": 234400,
"stock_grant": 167606,
"bonus": 32207,
"commission": 0,
"level_page_url": "https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l5"
}
],
"related_roles": [
{
"title": "Android Engineer",
"title_slug": "android-engineer",
"salary_count": 6,
"median_total": 240000
},
{
"title": "Frontend Software Engineer",
"title_slug": "frontend-software-engineer",
"salary_count": 5,
"median_total": 269000
},
{
"title": "Machine Learning Engineer",
"title_slug": "machine-learning-engineer",
"salary_count": 22,
"median_total": 287500
}
],
"sample_submissions": [
{
"uuid": "45f84415-7f2c-45e1-bb2f-cb7371cf8731",
"company": "Google",
"title": "Software Engineer",
"job_family": null,
"level": "L3",
"focus_tag": "Full Stack",
"years_of_experience": 2,
"years_at_company": 2,
"years_at_level": null,
"offer_date": "2026-08-23T16:45:49.058+00:00",
"location": "Raleigh, NC",
"work_arrangement": null,
"base_salary": 120000,
"total_compensation": 140000,
"stock_grant_annual": 20000,
"bonus_annual": 0,
"currency": null
},
{
"uuid": "a71b3479-b41a-4f28-84ea-cfb756c72999",
"company": "Google",
"title": "Software Engineer",
"job_family": null,
"level": "L3",
"focus_tag": "ML / AI",
"years_of_experience": 3,
"years_at_company": 0,
"years_at_level": null,
"offer_date": "2026-08-29T13:43:41.055+00:00",
"location": "New York, NY",
"work_arrangement": null,
"base_salary": 125000,
"total_compensation": 150000,
"stock_grant_annual": 25000,
"bonus_annual": 0,
"currency": null
},
{
"uuid": "9a7df4d6-4f0f-41c4-adaf-77d6ca6f235e",
"company": "Google",
"title": "Software Engineer",
"job_family": null,
"level": "L3",
"focus_tag": "ML / AI",
"years_of_experience": 2,
"years_at_company": 2,
"years_at_level": null,
"offer_date": "2026-09-16T01:59:40.009+00:00",
"location": "New York, NY",
"work_arrangement": null,
"base_salary": 130000,
"total_compensation": 160000,
"stock_grant_annual": 30000,
"bonus_annual": 0,
"currency": null
}
],
"sample_submission_count": 94
}
}What the Levels.fyi API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| company/salaries | The flagship action: full Levels.fyi compensation breakdown for one company + role. Returns the level ladder (L3/L4/…), per-level averages (base / stock / bonus / total), the percentile bands (P10/P25/P50/P75/P90 for total-comp, base, bonus and stock), the median offer (with years of experience), the role's sub-specializations and a sample of recent salary submissions. Pass an optional `location` to scope to a metro. | Recruiting teams call company/salaries to get the flagship action. | company, role, location |
| company/roles | Resolve a company to its Levels.fyi profile (id, slug, website, employee count, HQ, vesting schedule…) plus the catalog of job-family role slugs you can query for it. Use this to confirm a company's slug and pick a role slug to feed into company/salaries. NOTE: the role list is the full Levels.fyi job-family catalog (the roles available to query) — for the roles a company actually has reported data for, read `related_roles` from a company/salaries response. | Labor-market analysts call company/roles to resolve a company to its Levels.fyi profile (id, slug, website, employee count, HQ, vesting s…. | company |
| company/search | Find companies on Levels.fyi by name. Returns matching companies with the slug and a ready-to-use salaries URL — feed the slug into company/roles or company/salaries. | Job boards call company/search to find companies on Levels.fyi by name. | query, limit |
| role/companies | For a given role/title, list every company that reports compensation data for it on Levels.fyi (the role's coverage), plus the country-wide median total-comp and the full job-family catalog. Useful for 'which companies pay for <role>' and leaderboard-style discovery. | Sales intelligence teams call role/companies to get for a given role/title, list every company that reports compensation data for it on Levels.fy…. | role, limit |
| submissions | Paginated individual salary submissions for a company + role — the raw anonymized datapoints behind the averages: level, focus, years of experience, location, base / stock / bonus / total comp and offer date. 50 per page; page with `page`. | Recruiting teams call submissions to get paginated individual salary submissions for a company + role. | company, role, location, page |
Call company/salaries from your stack
curl -X POST https://api.reefapi.com/levels-fyi/v1/company/salaries \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"company":"google","role":"software-engineer"}'import requests
r = requests.post(
"https://api.reefapi.com/levels-fyi/v1/company/salaries",
headers={"x-api-key": REEF_KEY},
json={
"company": "google",
"role": "software-engineer"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/levels-fyi/v1/company/salaries", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"company": "google",
"role": "software-engineer"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.levels-fyi.company/salaries with {"company":"google","role":"software-engineer"}.Who uses this API and why
- Recruiting tools call company/salaries to benchmark an offer against a company's real pay bands.
- Career products use role/companies to show which companies pay most for a given role.
- Comp teams use the percentiles to calibrate salary ranges by level and location.
Questions developers ask before integrating
Which fields add up to total compensation?
base_salary plus stock_grant_annual plus bonus_annual, and it reconciles exactly. Google's median offer measured on 2026-08-27 returned base_salary 200000, stock_grant_annual 80000, bonus_annual 18000 and total_compensation 298000. An individual submission in the same response returned 122222 base, 22222 stock, 0 bonus and total_compensation 144444. Stock is the annualized grant value, not the four-year total, and commission appears as its own field in the per-level averages.
Are these numbers medians or individual salary submissions?
Both, in the same response. percentiles gives p10, p25, p50, p75 and p90 for total_comp, base_salary, bonus and stock_grant separately. median is one representative offer with its level, focus tag, location and years of experience. averages is one row per level with mean total_compensation, base_salary, stock_grant and bonus. sample_submissions carries individual anonymized datapoints, and the submissions action pages through more of them.
Why does sample_count say 39 for a level when the company has thousands of submissions?
Because two different counts sit side by side. In Google's software-engineer averages, level L3 returned sample_count 39 alongside sample_count_last_12_months 1106, while the median block returned sample_count 23928 for the role as a whole. Read sample_count_last_12_months for the recent volume behind a level's averages, and the median's sample_count for the size of the whole dataset.
How many individual submissions can I actually page through?
Fewer than the sample counts suggest. The submissions action returns 50 per page and reports its own totals: for google plus software-engineer on 2026-08-27 it returned total 104 across total_pages 3, while the same company and role reported 23,928 submissions behind the aggregates. The paginated feed is the recent public sample Levels.fyi publishes, not the full dataset, so use percentiles and averages for population figures and submissions for texture.
Which location slugs actually work?
Only the ones matching a real Levels.fyi page, and the naming is not guessable. Measured on 2026-08-27 for google plus software-engineer: new-york-city-area answered with location 'New York City' and a total-comp P50 of 298000, san-francisco-bay-area answered with P50 320000, and greater-seattle-area answered with P50 273000. bay-area, seattle-area, austin-area and london-area all returned error code NOT_FOUND. Omitting location gives the company-wide United States figures, which for Google was P50 302700.
What currency are the compensation numbers in?
US dollars on the US-scoped pages, reported as currency 'USD' at the top level and inside the median block. Individual rows are the exception: all 50 submissions in a measured page came back with currency null, so fall back to the response-level currency rather than reading it per row. No conversion is applied anywhere, so a non-US page reports whatever the source reports.
What does an individual salary submission contain?
uuid, level, title, focus_tag, years_of_experience, years_at_company, location, base_salary, stock_grant_annual, bonus_annual, total_compensation and offer_date. focus_tag is the specialization, with measured values including 'Full Stack', 'Testing (SDET)', 'Web Development (Front-End)' and 'Distributed Systems (Back-End)'. offer_date is a full ISO 8601 timestamp with milliseconds and offset, for example 2026-08-21T03:28:18.149+00:00, and it is the only ISO date in the response.
How do I find the right company and role slug?
company/search takes a partial name and returns matches with their slug and salaries URL. company/roles resolves a company to its profile, measured for Stripe as id 36, employee_count 8000, hq_city 'San Francisco' and company_type 'private', and returns the 105-entry job-family catalog you can query, starting software-engineer, product-designer, product-manager, data-scientist. Going the other way, role/companies lists every company reporting data for a role plus the country-wide median, which for software-engineer was 195,000.
What is the Levels.fyi API?
Levels.fyi API is a ReefAPI endpoint group for levels.fyi It returns live JSON through POST requests under /levels-fyi/v1.
Is the Levels.fyi API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Levels.fyi calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Levels.fyi login or account?
No login to Levels.fyi is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Levels.fyi data?
The page example is captured from a live company/salaries call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Levels.fyi API use?
Levels.fyi actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Levels.fyi from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call levels-fyi actions with the same key, credit pool and JSON envelope used by normal REST requests.