Levels.fyi Scraper
Pricing
from $3.00 / 1,000 results
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
Maintained by CommunityActor stats
16
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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
| Mode | URL pattern | What you get |
|---|---|---|
byCompany | /companies/<slug>/salaries | Company 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 | /locations | Index of every Levels.fyi region/location and every job-family slug — useful for discovery. |
byUrl | any | Paste 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
| Field | Type | Default | Description |
|---|---|---|---|
mode | enum | byCompanyByRole | One of the 8 modes above. |
company | string | google | Company slug (required for byCompany* modes). |
role | enum | software-engineer | Job-family slug. |
level | string | – | Level slug (e.g. L4, IC3) — required for byCompanyByRoleLevel. |
locationSlug | enum | san-francisco-bay-area | Location slug for byRoleLocation. |
url | string | – | Levels.fyi URL (mode=byUrl). |
search | string | – | Substring filter for searchCompanies. |
minTotalCompensation | int | – | Drop samples below this TC. |
maxTotalCompensation | int | – | Drop samples above this TC. |
minYearsOfExperience | int | – | Drop samples below this YOE. |
maxYearsOfExperience | int | – | Drop samples above this YOE. |
includeSamples | bool | true | Emit individual salary submissions. |
includeAggregates | bool | true | Emit per-level + percentile aggregates. |
useResidentialProxyOnBlock | bool | true | Auto-escalate on Cloudflare 403/429. |
maxItems | int | 200 | Hard 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 frombyRoleandbyRoleLocation.