Levels.fyi Scraper avatar

Levels.fyi Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Levels.fyi Scraper

Levels.fyi Scraper

Scrape Levels.fyi compensation data with base salary, equity, bonus, and total compensation by company, role, level, and location. Pulls from public Next.js hydration data; no auth, structured output.

Pricing

from $3.00 / 1,000 results

Rating

5.0

(16)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

16

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Scrape compensation data from Levels.fyi — base salary, equity, bonus, and total comp by company, role, level, and location. Pulls structured data from the public Next.js hydration blob; no auth required, fast, and deterministic.

What this actor does

  • Reads compensation data straight from the __NEXT_DATA__ JSON Levels.fyi already ships in every page response — no DOM scraping, no rate limits beyond Cloudflare.
  • Eight modes covering every reliable Levels.fyi lookup axis: by company, by company × role, by company × role × level, by role, by role × location, popular companies, top locations, and free-form URL.
  • Auto-escalates to Apify residential proxy if Cloudflare blocks the direct fetch (toggle in input).
  • Emits flat per-sample records (one row per submitted offer) plus level aggregates and percentile summaries — pick what you want via toggles.

Modes

ModeURL patternWhat you get
byCompany/companies/<slug>/salariesCompany overview (median TC across all roles, highest- / lowest-paying job-family, every job-family with median TC).
byCompanyByRole/companies/<slug>/salaries/<role>Per-level aggregates, percentile summary, and every individual offer Levels.fyi shows for that company × role.
byCompanyByRoleLevel/companies/<slug>/salaries/<role>/levels/<level>Single-bucket detail: median base / TC / stock / bonus + sample offers at that level.
byRole/t/<role>Top companies and top locations for a role.
byRoleLocation/t/<role>/locations/<location>Geo compensation breakdown — percentile histogram, top companies in that city, top locations for that role.
searchCompanies/companies?search=<q>List of popular companies (filterable by substring on name/slug).
topCompanies/locationsIndex of every Levels.fyi region/location and every job-family slug — useful for discovery.
byUrlanyPaste any Levels.fyi URL; auto-routes to the right mode.

Output records

Every record is omit-empty (no null, no "", no []). recordType tags the row.

Common record types:

  • companyOverview — mode=byCompany. Company metadata + median TC + highest / lowest paying role.
  • levelAggregate — one row per level for a company × role with median base / TC / stock / bonus and sample count.
  • salarySample — one row per individual offer (uuid, level, YOE, location, base, TC, stock, bonus, focus tag, education).
  • percentiles — single record with p10/p25/p50/p75/p90 base & TC for the (company × role) or (role × location) bucket.
  • topCompany, topLocation, company, jobFamily — listing/discovery rows.

Input

FieldTypeDefaultDescription
modeenumbyCompanyByRoleOne of the 8 modes above.
companystringgoogleCompany slug (required for byCompany* modes).
roleenumsoftware-engineerJob-family slug.
levelstringLevel slug (e.g. L4, IC3) — required for byCompanyByRoleLevel.
locationSlugenumsan-francisco-bay-areaLocation slug for byRoleLocation.
urlstringLevels.fyi URL (mode=byUrl).
searchstringSubstring filter for searchCompanies.
minTotalCompensationintDrop samples below this TC.
maxTotalCompensationintDrop samples above this TC.
minYearsOfExperienceintDrop samples below this YOE.
maxYearsOfExperienceintDrop samples above this YOE.
includeSamplesbooltrueEmit individual salary submissions.
includeAggregatesbooltrueEmit per-level + percentile aggregates.
useResidentialProxyOnBlockbooltrueAuto-escalate on Cloudflare 403/429.
maxItemsint200Hard cap (1-5000).

Examples

Google software-engineer offers

{
"mode": "byCompanyByRole",
"company": "google",
"role": "software-engineer",
"maxItems": 200
}

SF Bay Area top SWE compensation

{
"mode": "byRoleLocation",
"role": "software-engineer",
"locationSlug": "san-francisco-bay-area"
}

Just paste a URL

{
"mode": "byUrl",
"url": "https://www.levels.fyi/companies/meta/salaries/product-manager"
}

FAQ

How fresh is the data? It's whatever Levels.fyi shows on the page right now — Levels.fyi hydrates every page server-side, so what you see is what you get.

Does it work for non-US locations? Yes — see the locationSlug dropdown for 30+ regions / cities. Currency and exchange rate are emitted on each record where Levels.fyi provides one.

Why are some fields missing? The actor omits any field Levels.fyi didn't fill in for a given record (e.g., gender, ethnicity, firstYearStockGrant). If a sample submitter left a field blank, you get a clean record without nulls.

Cloudflare blocks me. Leave useResidentialProxyOnBlock enabled — the actor retries through Apify residential proxy after the first 403 / 429.

Is the leaderboard / /highest-paid/ endpoint supported? No — those pages are aggressively gated and return 403 even with chrome131 impersonation. The same data is available via byRole (top companies) and byRoleLocation (top locations) and is what we expose.

Limitations

  • Levels.fyi shows up to ~30 individual samples per (company × role) page. To get more, drill into specific levels via byCompanyByRoleLevel.
  • The leaderboard (/leaderboard/, /highest-paid/) is heavily protected and not exposed; equivalent data comes from byRole and byRoleLocation.