levels.fyi Salary Scraper — Tech Compensation Data
Pricing
Pay per event
levels.fyi Salary Scraper — Tech Compensation Data
Scrape individual salary & total-compensation records from levels.fyi by company slug, company-salaries URL, or job-family URL. One flat row per submission: title, level, focus, years of experience, base, stock, bonus, total comp, location & demographics. JSON/CSV.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Share
levels.fyi Salary Scraper 💰

Pull real, individual salary and total-compensation records from levels.fyi — the community-sourced database that tech workers use to benchmark pay. Feed it a company slug (google, meta, amazon), a company-salaries URL, or a specific job-family URL, and get back one clean, flat row per submission: company, title, level, focus, years of experience, base / stock / bonus, total comp, location, work arrangement and self-reported demographics.
No login, no browser automation, no manual copy-paste from tables — just structured JSON/CSV you can drop straight into a spreadsheet, a comp model, or a dashboard.
💡 Why use this scraper
- Individual records, not just averages. Most levels.fyi views show medians. This actor harvests the underlying per-submission samples — the raw data points behind the charts.
- Benchmark compensation across companies, levels and locations for offer negotiation, comp-band design or market research.
- Whole-company sweeps. Give it just
googleand it walks every job family (Software Engineer, Product Manager, Data Scientist, Sales, and 50+ more) automatically. - Rich per-row detail — base salary, average annual stock, bonus, total comp, first-year figures, focus tag (e.g. Machine Learning), years of experience / at company / at level, work arrangement, and demographics when the submitter shared them.
- Fast & reliable — pure HTTP over residential IPs against the embedded page data; typical runs finish in seconds.
📋 What you can scrape
| Input | Example | What you get |
|---|---|---|
| Company slug | google | Every job family on Google's salaries page → all individual records |
| Company-salaries URL | https://www.levels.fyi/companies/meta/salaries | Same as above, from a pasted URL |
| Job-family URL | https://www.levels.fyi/companies/amazon/salaries/software-engineer | Just that one role's individual records |
| Job-family filter | ["software-engineer", "product-manager"] | Restrict a company sweep to specific roles |
🔧 Input
| Field | Type | Description |
|---|---|---|
companySlugs | array | Company slugs, e.g. ["google", "meta", "amazon"]. Each expands to every job family on that company's salaries page. |
startUrls | array | Company-salaries URLs and/or specific job-family salary URLs. Auto-classified. |
jobFamilies | array | Optional filter — only scrape these job-family slugs (e.g. software-engineer, data-scientist). Empty = all. |
maxItems | integer | Hard cap on total rows for the run. |
maxItemsPerCompany | integer | Cap records harvested per company. |
maxConcurrency | integer | Parallel requests (default 6). |
proxy | object | Free-tier proxy config (defaults to Apify Residential, US). Paid runs use a built-in US residential pool. |
Example input
{"companySlugs": ["google", "meta"],"jobFamilies": ["software-engineer", "product-manager"],"maxItems": 2000}
⚙️ How it works
- Company page — for each company slug / URL, the actor loads
/companies/{slug}/salariesand reads the embedded page data to enumerate every job family listed for that company. - Job-family pages — it then visits each
/companies/{slug}/salaries/{jobFamily}page and extracts the individual salary submissions embedded in the page's data payload (grouped by company level). - Flat rows — every submission becomes one dataset row with a stable
uuid, so re-runs and multi-family sweeps deduplicate cleanly.
All requests go through US residential proxies with automatic session rotation and retries on rate-limits, so runs stay reliable at scale.
📤 Output
Each row is one individual compensation submission:
{"rowType": "salary","uuid": "6e828129-7eb5-400f-8c56-85f9c6379956","company": "Google","companySlug": "google","title": "Software Engineer","jobFamily": "Software Engineer","jobFamilySlug": "software-engineer","level": "L3","levelName": "L3","focusTag": "Full Stack","yearsOfExperience": 0,"yearsAtCompany": 0,"yearsAtLevel": null,"offerDate": "2026-06-07T05:33:59.048Z","location": "Pittsburgh, PA","countryId": 254,"dmaId": 508,"workArrangement": "hybrid","compPerspective": "offer","employmentType": "full_time","baseSalary": 139000,"totalCompensation": 159000,"avgAnnualStockGrantValue": 20000,"avgAnnualBonusValue": 0,"gender": "female","ethnicity": null,"education": null,"sourceUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer","scrapedAt": "2026-07-06T03:19:23.279Z"}
Key output fields
| Field | Meaning |
|---|---|
uuid | Stable levels.fyi submission id (dedup key) |
company / title / level | Company, role and company-native level (L3, E5, …) |
focusTag | Specialization (e.g. Machine Learning, Full Stack) |
yearsOfExperience / yearsAtCompany / yearsAtLevel | Experience context |
baseSalary / avgAnnualStockGrantValue / avgAnnualBonusValue | Comp breakdown |
totalCompensation | Headline total comp |
firstYearTotalCompensation | First-year total (where reported) |
location / workArrangement / compPerspective | Where, how and offer-vs-current |
gender / ethnicity / education | Self-reported demographics (when shared) |
offerDate | When the offer/submission was dated |
❓ FAQ
Are these individual data points or averages? Individual submissions. The actor pulls the underlying per-record samples behind levels.fyi's charts, so you can slice and aggregate them yourself.
Which companies are supported?
Any company on levels.fyi. Use the slug from the URL — https://www.levels.fyi/companies/**stripe**/salaries → stripe.
Which job families can I scrape?
Whatever the company page lists — Software Engineer, Product Manager, Software Engineering Manager, Data Scientist, Hardware Engineer, Sales, Recruiter, Technical Program Manager and dozens more. Leave jobFamilies empty to grab them all.
Is the money in USD? Amounts are the values levels.fyi stores for each record. For US roles that is USD. International records carry their own currency where levels.fyi provides it.
How much data can I get per company? levels.fyi surfaces a bounded set of recent sample records per level, so expect dozens to a few hundred individual records per company depending on how many families and levels it has.
🛟 Support
Run into a company that won't parse, a field you need added, or a schema question? Open an issue on the actor's Issues tab with the input you used — most requests are quick fixes.
⚠️ Disclaimer
This actor collects publicly available compensation data from levels.fyi for research, benchmarking and analytics. It does not access any login-gated content and stores no personal-account data. Individual submissions on levels.fyi are self-reported and anonymized by the source. You are responsible for using the scraped data in compliance with levels.fyi's Terms of Service and all applicable laws (including data-protection regulations). This actor is not affiliated with, endorsed by, or sponsored by levels.fyi.
🔎 SEO Keywords
levels.fyi scraper, levels fyi salary scraper, tech salary data, total compensation scraper, tech comp benchmarking, software engineer salary data, FAANG salary scraper, compensation dataset, salary benchmarking API, levels.fyi API, stock and bonus data, tech pay data, salary negotiation data, comp band research, levels fyi companies salaries.