Levels Fyi Salary Scraper
Pricing
from $2.80 / 1,000 results
Levels Fyi Salary Scraper
Scrape individual salary submissions from Levels.fyi — base, stock, bonus, TC by company, role, level, and location.
Pricing
from $2.80 / 1,000 results
Rating
5.0
(1)
Developer
ShhhLabs
Actor stats
0
Bookmarked
6
Total users
3
Monthly active users
7 days ago
Last modified
Categories
Share
Levels.fyi Salary Scraper
Scrape salary data from Levels.fyi — individual salary submissions with company, role, level, location, YoE, and full comp breakdown. No API key needed.
Features
- 1 row = 1 salary submission: each individual submission is its own row with full comp breakdown
- 2 scraping modes: specific company×role combos, or all roles for given companies
- Per-level context: median TC, base, stock, bonus for each career level (L3–L8, IC1–IC6, etc.) denormalized on each row
- Percentile data: p10/p25/p50/p75/p90 for total comp, base salary, stock grants, and bonus
- 80 job families: software engineer, product manager, data scientist, and 77 more
- 3,000+ companies: from FAANG to startups — every company with data on Levels.fyi
- Company metadata: industry, HQ location, employee count, funding stage, vesting type, ticker
- Sub-title breakdowns: specializations within each role (e.g. "Backend SWE", "ML Engineer") with median TC
- No headless browser: pure HTTP + JSON — fast, cheap, reliable
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | "specific" | "specific" = exact company+role combos. "companies" = all roles for given companies. |
companies | string[] | ["google"] | Company slugs. Find slugs in Levels.fyi URLs (e.g. levels.fyi/companies/google → "google"). |
roles | string[] | — | Role slugs. Used in specific mode only — ignored in companies mode. See full list below. |
maxResults | integer | 0 | Maximum rows to output. Actor stops when reached. 0 = unlimited. |
maxRequestsPerSecond | number | 20 | Rate limit (1–50 req/s). |
timeoutSeconds | integer | 300 | Max run time in seconds before graceful stop. |
Usage Examples
Scrape Google Software Engineer salaries:
{"mode": "specific","companies": ["google"],"roles": ["software-engineer"]}
Scrape all roles at FAANG companies:
{"mode": "companies","companies": ["google", "meta", "apple", "amazon", "netflix"]}
Scrape multiple roles at multiple companies:
{"mode": "specific","companies": ["stripe", "coinbase", "databricks"],"roles": ["software-engineer", "product-manager", "data-scientist"]}
Output
Each result is one individual salary submission. For example, "Google × Software Engineer" at level L3 with 15 recent submissions produces 15 rows. Company, role, and level metadata is denormalized into every row for easy filtering and export.
Example Row
{"uuid": "d0c6e935-...","offerDate": "2026-03-18T10:02:08.653+00:00","yearsOfExperience": 12,"yearsAtCompany": 3,"focusTag": "Data","location": "New York, NY","baseSalary": 120000,"totalCompensation": 160000,"stockGrantAnnual": 40000,"bonusAnnual": 0,"company": "Google","companySlug": "google","companyId": 1,"industry": "Tech","ticker": "GOOG","hqCity": "Mountain View","hqState": "California","employeeCount": 258750,"fundingStage": "post_ipo","vestingType": "RSU","role": "Software Engineer","roleSlug": "software-engineer","level": "L3","levelSecondaryName": "SWE II","levelMedianTC": 204005,"levelAvgBase": 157074,"levelAvgStock": 33157,"levelAvgBonus": 13774,"levelSubmissions": 54,"levelSubmissionsLast12Mo": 904,"levelUrl": "/companies/google/salaries/software-engineer/levels/l3","roleTotalSubmissions": 21959,"percentiles": {"totalComp": { "p10": 175000, "p25": 206000, "p50": 319000, "p75": 398750, "p90": 490000 },"baseSalary": { "p10": 150000, "p25": 166000, "p50": 199000, "p75": 220000, "p90": 242000 },"stockGrant": { "p10": 25000, "p25": 40000, "p50": 90000, "p75": 140000, "p90": 200000 },"bonus": { "p10": 0, "p25": 0, "p50": 30000, "p75": 38750, "p90": 48000 }},"subTitles": [{ "title": "Backend Software Engineer", "slug": "backend-software-engineer", "medianTC": 285000, "count": 524 }],"currency": "USD","scrapedAt": "2026-04-16T17:30:00Z","sourceUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer"}
Output Fields
| Field | Type | Description |
|---|---|---|
uuid | string | Unique submission identifier |
offerDate | string | When the salary was submitted |
yearsOfExperience | number | Total years of professional experience |
yearsAtCompany | number | Years at the current company |
focusTag | string | null | Specialization (e.g. "Data", "ML", "Backend") |
location | string | Submitter's work location |
baseSalary | number | Annual base salary |
totalCompensation | number | Total annual compensation (base + stock + bonus) |
stockGrantAnnual | number | Annual stock grant value |
bonusAnnual | number | Annual bonus amount |
company | string | Company display name |
companySlug | string | URL-safe company identifier |
companyId | number | Levels.fyi internal company ID |
industry | string | null | Industry classification |
ticker | string | null | Stock ticker (public companies) |
hqCity / hqState | string | null | Company HQ location |
employeeCount | number | null | Approximate employee count |
fundingStage | string | null | pre_seed through post_ipo |
vestingType | string | null | RSU, ISO, etc. |
role | string | Job family display name |
roleSlug | string | URL-safe role identifier |
level | string | Primary level name (e.g. "L3", "ICT4") |
levelSecondaryName | string | Alternative level name (e.g. "SWE II") |
levelMedianTC | number | Median total compensation at this level |
levelAvgBase | number | Average base salary at this level |
levelAvgStock | number | Average annual stock grant at this level |
levelAvgBonus | number | Average annual bonus at this level |
levelSubmissions | number | Salary submissions at this level |
levelSubmissionsLast12Mo | number | Submissions in the last 12 months |
levelUrl | string | Level-specific page path |
roleTotalSubmissions | number | Total submissions across all levels for this company × role |
percentiles | object | p10/p25/p50/p75/p90 for TC, base, stock, bonus (role-wide) |
subTitles[] | array | Role specializations with median TC |
currency | string | Always "USD" |
scrapedAt | string | ISO 8601 timestamp |
sourceUrl | string | Levels.fyi page URL |
Pricing
Pay Per Result — each individual salary submission is one row.
| Scenario | Rows (approx.) | Description |
|---|---|---|
| 1 company, 1 role | ~50–150 | 10–20 submissions × 5–8 levels |
| 5 FAANG companies, all roles | ~3,000–6,000 | ~10–20 submissions per level |
| Top 200 companies, 1 role | ~10,000–30,000 | varies by company size |
Free tier: test with a few company×role combos before committing.
Available Role Slugs
All 80 job families supported by Levels.fyi:
What Stops the Actor
The actor stops when any of these conditions is met (whichever comes first):
- All requests completed — every company × role combination has been scraped.
- Max results reached — the
maxResultslimit is hit. The actor saves all rows collected so far and stops. - Timeout reached — the
timeoutSecondslimit is hit. The actor saves all data collected so far and exits gracefully.
In all cases, data already pushed to the dataset is preserved.
Limitations
- Data freshness: Levels.fyi caches pages at CDN for 6 hours. Data reflects submissions up to that window.
- Coverage: Not all companies have data for all 80 roles. Most companies have 2–10 roles with salary data.
- Currency: All compensation figures are in USD. Non-US salaries are converted to USD by Levels.fyi.
- Submissions per level: Each level returns 10–20 recent submissions, not the full history.
- BuildId rotation: Levels.fyi changes its internal buildId on each deploy. The actor handles this automatically — if a request fails, it re-extracts the buildId and retries.
- Volume: ~20,000–30,000 company×role pages exist in total. A full catalog crawl takes several hours. Use
maxResultsortimeoutSecondsto cap runs.