Levels.fyi Salary Scraper avatar

Levels.fyi Salary Scraper

Pricing

from $2.38 / 1,000 results

Go to Apify Store
Levels.fyi Salary Scraper

Levels.fyi Salary Scraper

Scrapes Levels.fyi salary pages and organizes public pay data into records for each job level. Results include company and job-family details, location, total compensation, base, stock, bonus, currency, and percentile ranges. Use company names, slugs, or supported Levels.fyi URLs as inputs.

Pricing

from $2.38 / 1,000 results

Rating

0.0

(0)

Developer

Axiom Works

Axiom Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Returns: one row per job level with company, jobFamily, location, level, currency, totalCompensation, baseSalary, sourceUrl. Input: {"companies": ["google"], "jobFamilies": ["software-engineer"], "maxItems": 10} Best for: compensation benchmarking, salary band research for job offers, and HR or recruiting market reports.

{
"company": "Google",
"jobFamily": "Software Engineer",
"location": "United States",
"level": "L3",
"currency": "USD",
"totalCompensation": 209680,
"baseSalary": 154958,
"sourceUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer"
}

What does Levels.fyi Salary Scraper do?

Levels.fyi Salary Scraper is a Levels.fyi scraper and unofficial Levels.fyi API alternative that collects public compensation data for a company, job family and location. For each page it returns one record per job level, such as L3, L4 or L5 at Google, with total compensation, base salary, stock and bonus, plus the percentile ranges for the whole job family. It needs no login and reads only pages that are public.

Each record stands alone. The job-family percentiles (p10, p25, p50, p75 and p90 for total compensation, base salary, stock and bonus) are repeated on every level record of the page, so you can load the dataset into a spreadsheet or database and filter by level without joining tables. Amounts are given twice: in the local currency of the location (for example GBP for the United Kingdom) and in US dollars.

The Actor is a good fit for three jobs. Compensation teams can benchmark pay bands across companies and levels. Candidates and recruiters can check what a level pays in a given city or country before negotiating. Analysts can build market reports by scraping many companies and job families on a schedule and tracking how the figures move.

You can start from company names, from company slugs, or from Levels.fyi URLs. You can also ask for every job family a company lists by passing all, and add locations such as new-york-city-area, san-francisco-bay-area, united-kingdom or india.

What data can you get from Levels.fyi?

Every record has the fields below. Fields the page does not provide are returned as null.

FieldDescriptionExample
idStable record ID: company slug, job family slug, location slug and level slug joined with |google|software-engineer|united-kingdom|l3
sourceUrlThe Levels.fyi page the record came fromhttps://www.levels.fyi/companies/google/salaries/software-engineer/locations/united-kingdom
companyCompany nameGoogle
companySlugCompany sluggoogle
jobFamilyJob family nameSoftware Engineer
jobFamilySlugJob family slugsoftware-engineer
locationLocation the figures apply toUnited Kingdom
locationSlugLocation slugunited-kingdom
locationTypeKind of location: dma, country or citycountry
countryCodeISO country codeGB
levelPrimary level nameL3
levelSlugLevel slugl3
levelTitlesTitles used for the level["L3", "SWE II"]
levelIndexPosition of the level, 0 is the most junior0
levelUrlLevels.fyi page for the levelhttps://www.levels.fyi/companies/google/salaries/software-engineer/levels/l3
currencyCurrency of the local amountsGBP
exchangeRateFromUsdRate used to convert USD to local currency0.756
totalCompensationAverage yearly total compensation, local currency117611
baseSalaryAverage base salary, local currency89438
stockAverage yearly stock value, local currency22589
bonusAverage yearly bonus, local currency5585
totalCompensationUsdAverage yearly total compensation in USD155570
baseSalaryUsdAverage base salary in USD118304
stockUsdAverage yearly stock value in USD29879
bonusUsdAverage yearly bonus in USD7388
submissionCountSalary submissions behind the level figures38
submissionsLast12MonthsSubmissions in the last 12 months39
yearsOfExperienceMedianMedian years of experience2
yearsOfExperienceAvgAverage years of experience3
jobFamilyMedianTotalMedian total compensation of the job family, local currency151217
jobFamilyMedianTotalUsdMedian total compensation of the job family in USD200021.89
totalCompensationPercentilesp10, p25, p50, p75, p90 of total compensation, local currency{"p10": 131669, "p50": 151216}
baseSalaryPercentilesBase salary percentiles, local currency{"p10": 91770, "p50": 108023}
stockPercentilesStock percentiles, local currency{"p10": 19183, "p50": 40471}
bonusPercentilesBonus percentiles, local currency{"p10": 0, "p50": 14171}
percentileSampleSizeSubmissions behind the percentiles1200
companyTotalSubmissionsAll-time submissions for the company and job family12000
vestingScheduleStock vesting schedule listed for the company25/12,25/12,25/12,25/12
companyIndustryReported industryTech
companyEmployeeCountRangeReported employee range10,001+
companyTickerReported tickerGOOG
companyCareerUrlCareers link, not visitedhttps://careers.google.com/
companyHeadquartersCityHeadquarters cityMountain View
companyWebsiteCompany websitehttps://www.google.com
recentSubmissionsAnonymous recent submissions for the level, only when enabled[{"level": "L3", "totalCompensation": 125702.58}]
scrapedAtISO timestamp of the scrape2026-10-03T10:00:00.000Z

When includeRecentSubmissions is enabled, each sample also includes nullable isRedacted, copied from the source. A value of true means Levels.fyi withheld details such as title, location, experience and compensation components. Those details remain null; total compensation can still be available. The Actor does not reconstruct withheld information. Recent submission amounts remain in USD.

Local-currency amounts are the USD figures from the page multiplied by the page's own exchange rate and rounded, which matches what Levels.fyi displays. The raw USD values are always included next to them.

Company context comes from the same salary page, without extra requests. Missing profile values are null. Set minSubmissionCount to require a minimum number of reports behind each level, alongside the existing level and compensation filters. This uses submissionCount, not the separate last-year count; it is a sample-size filter, not a guarantee of statistical reliability. The default 0 keeps all levels.

How to use Levels.fyi Salary Scraper

  1. Open the Actor in Apify Console and go to the Input tab.
  2. Enter one or more companies, for example google or Meta, or paste Levels.fyi salary URLs into the URLs field.
  3. Set the job families (default software-engineer) and, if you want, locations. Leave locations empty for the United States.
  4. Set maxItems to the number of level records you want and start the run.
  5. When the run finishes, open the Output tab and export the dataset as JSON, CSV, Excel, XML or HTML, or read it through the API.

Tips:

Each company, job family and location combination is one page. Many companies have 5 to 12 levels, so 10 pages usually give 50 to 120 records. Use all as the job family to scrape every job family a company lists. If a company name returns a not-found message, copy the URL from the site instead of typing the name. Names are converted to slugs automatically, but a few companies use a different slug. Pages with too few submissions have no level data and are skipped with a warning in the log. A proxy is not normally needed. Switch on Apify Proxy in the Advanced section only if requests start being blocked.

Input

FieldTypeRequiredDescription
companiesarray of stringsYes, unless startUrls is givenCompany slugs, names or Levels.fyi company URLs, e.g. google, Meta.
jobFamiliesarray of stringsNoJob family slugs or names, e.g. software-engineer, Product Manager. Use all for every job family the company lists. Default ["software-engineer"].
locationsarray of stringsNoLocation slugs or names, e.g. new-york-city-area, united-kingdom, india. Empty means the United States.
startUrlsarrayNoLevels.fyi salary page URLs, as strings or {url} objects. A company URL expands to all job families. A level URL keeps only that level.
maxItemsintegerNoMaximum number of records, 1-10000, default 50.
levelsarrayNoOnly return these levels, by name or slug, e.g. L5 or Senior Software Engineer. Default: all levels.
minSubmissionCountintegerNoMinimum level submission count; default 0 disables filtering
minTotalCompensationUsdintegerNoSkip levels whose average total compensation is below this USD amount. Default: no filter.
includeRecentSubmissionsbooleanNoAdds recentSubmissions to each record. Default false.
proxyConfigurationobjectNoProxy settings. Default: no proxy.

At least one of companies or startUrls must be given. If both are given, both are scraped, with duplicate IDs saved once and one shared maxItems budget. Plain company names use jobFamilies and locations; explicit salary URLs use the family and location in their path. Company-only URLs expand all families. The levels filter matches primary names or slugs, not every alternate title. If no rows match, remove levels, lower minTotalCompensationUsd, or check the company, job family and location slugs. Persistent blocks require retrying later or enabling proxyConfiguration.

{
"companies": ["amazon"],
"jobFamilies": ["data-scientist", "product-manager"],
"locations": ["new-york-city-area"],
"startUrls": [
{ "url": "https://www.levels.fyi/companies/stripe/salaries/product-manager" }
],
"maxItems": 50,
"includeRecentSubmissions": false,
"proxyConfiguration": { "useApifyProxy": false }
}

Output

The dataset has one item per level. This trimmed record came from the local Google software-engineer prefill run on 2026-10-13. Salary values can change between runs:

{
"id": "google|software-engineer|united-states|l3",
"company": "Google",
"companySlug": "google",
"jobFamily": "Software Engineer",
"jobFamilySlug": "software-engineer",
"location": "United States",
"locationSlug": "united-states",
"locationType": "country",
"countryCode": "US",
"level": "L3",
"levelSlug": "l3",
"levelTitles": [
"L3",
"SWE II"
],
"levelIndex": 0,
"levelUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l3",
"currency": "USD",
"exchangeRateFromUsd": 1,
"totalCompensation": 209680,
"baseSalary": 154958,
"stock": 40007,
"bonus": 14714,
"totalCompensationUsd": 209680,
"baseSalaryUsd": 154958,
"stockUsd": 40007,
"bonusUsd": 14714,
"submissionCount": 60,
"submissionsLast12Months": 780,
"yearsOfExperienceMedian": 2,
"yearsOfExperienceAvg": 2.73,
"jobFamilyMedianTotal": 281000,
"jobFamilyMedianTotalUsd": 281000,
"totalCompensationPercentiles": {
"p10": 177500,
"p25": 212000,
"p50": 281000,
"p75": 393000,
"p90": 535000
},
"baseSalaryPercentiles": {
"p10": 144000,
"p25": 164000,
"p50": 196000,
"p75": 230000,
"p90": 250000
},
"stockPercentiles": {
"p10": 30000,
"p25": 40000,
"p50": 70000,
"p75": 150000,
"p90": 250000
},
"bonusPercentiles": {
"p10": 0,
"p25": 0,
"p50": 24000,
"p75": 43000,
"p90": 57000
},
"percentileSampleSize": 176,
"companyTotalSubmissions": 23436,
"vestingSchedule": "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",
"companyWebsite": "https://www.google.com",
"scrapedAt": "2026-10-13T10:31:08.506Z",
"sourceUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer"
}

You can download the data as JSON, CSV, Excel, XML or HTML from the dataset page, and the Overview view shows the most useful columns.

How much does it cost to scrape Levels.fyi?

Levels.fyi Salary Scraper is charged per result. You pay only for the records returned, and maxItems caps how many that can be, so a run can never go past the limit you set. See the Pricing tab for the current price. The Actor makes about one request per second and one request returns all levels of a page, so runs are quick and use little compute.

Use with AI agents (MCP)

Connect Levels.fyi Salary Scraper to Claude, Cursor or any MCP client through the Apify MCP server:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=axiomworks/levels-fyi-salary-scraper"
}
}
}

Example prompts:

  1. "Get the total compensation by level for software engineers at Google and Meta from Levels.fyi."
  2. "Compare product manager base salary and stock at Stripe in the United Kingdom and the United States on Levels.fyi."
  3. "Scrape every job family at Amazon in the New York City area from Levels.fyi and list the ten highest median totals."

Integrations and API

Run Levels.fyi Salary Scraper from your own code with the Apify API. Set APIFY_TOKEN to your Apify API token (send it in the Authorization header, never in the URL).

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("axiomworks/levels-fyi-salary-scraper").call(
run_input={"companies": ["google"], "jobFamilies": ["software-engineer"], "maxItems": 50}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["level"], item["totalCompensation"], item["currency"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('axiomworks/levels-fyi-salary-scraper').call({
companies: ['google'],
jobFamilies: ['software-engineer'],
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

cURL

curl -X POST "https://api.apify.com/v2/acts/axiomworks~levels-fyi-salary-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["google"], "jobFamilies": ["software-engineer"], "maxItems": 50}'

The Integrations tab connects the Actor to Make, Zapier, n8n, Google Sheets and webhooks, and you can put it on a schedule to track pay changes over time.

FAQ

How many records will I get? One record per level for each company, job family and location page. Companies usually have between 3 and 12 levels per job family. The run stops when it reaches maxItems.

What currency are the amounts in? The fields totalCompensation, baseSalary, stock and bonus use the currency in the currency field, which follows the location you chose. The fields ending in Usd always use US dollars.

Are these individual salaries? No. The per-level numbers are aggregates that Levels.fyi computes from anonymous submissions. Individual entries are only returned when you turn on includeRecentSubmissions, and they are anonymous as well.

Why did my run return 0 results? The company, job family or location slug probably does not exist, or the page has too few submissions to show levels. The run still finishes successfully and the status message names the page that was not found. Check the slug on the site and paste the URL into startUrls.

How fresh is the data? Each run reads the live page, so the figures are as current as the site. The scrapedAt field tells you when a record was collected.

Do I need a proxy? Usually not. Requests are plain page loads at a modest rate. If the site starts blocking, enable Apify Proxy and blocked requests are retried on a new IP.

Can I scrape one level only? Yes. Put a level URL such as https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l5 into startUrls and only that level is returned.

Why is a field null? Some pages do not publish every number, for example the vesting schedule of small companies. Those fields are returned as null and never filled with guesses.

The Actor collects only data that is publicly visible without logging in. The salary figures are anonymous aggregates and the Actor does not collect personal data. You are responsible for how you use the data, including compliance with the website's terms and applicable laws such as GDPR. This is not legal advice. This Actor is an independent tool and is not affiliated with or endorsed by Levels.fyi.

Feedback

Found a bug or need a field that isn't here? Open an issue on the Issues tab and we'll look at it.