Levels.fyi Salary Scraper
Pricing
Pay per event
Levels.fyi Salary Scraper
Extract public Levels.fyi salary samples by company, role, level, location, base pay, stock, bonus, and total compensation.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Extract structured compensation samples from public Levels.fyi salary pages.
Use this actor to collect salary benchmarks by company, role, level, location, experience, base pay, stock, bonus, and total compensation.
What does Levels.fyi Salary Scraper do?
Levels.fyi Salary Scraper reads public company salary pages such as https://www.levels.fyi/companies/google/salaries/software-engineer and turns the embedded compensation records into clean dataset rows.
It is designed for compensation research, recruiting intelligence, salary benchmarking, and talent-market analysis.
The actor uses HTTP extraction from the page data already delivered to the browser. It does not require a login for public salary pages.
Who is it for?
- ๐ผ Recruiters comparing offer competitiveness across target employers.
- ๐ Compensation analysts building pay bands from market signals.
- ๐งโ๐ผ HR and People Ops teams reviewing leveling and location trends.
- ๐ข Startup founders planning engineering salary budgets.
- ๐ Researchers studying total compensation by level, role, and geography.
- ๐งฐ Data teams feeding salary records into BI dashboards or spreadsheets.
Why use this Levels.fyi scraper?
Levels.fyi pages are useful, but manual copy-paste is slow and inconsistent.
This actor gives you repeatable exports with normalized fields:
- company and role context
- level and focus tag
- years of experience
- years at company
- offer date
- location identifiers
- base salary
- total compensation
- stock grant value
- bonus value
- level average compensation
- source URL and scrape timestamp
Data you can extract
| Field | Description |
|---|---|
uuid | Public sample identifier when present |
company | Company name |
companySlug | Levels.fyi company slug |
role | Salary sample title |
jobFamily | Job family shown on the page |
jobFamilySlug | Job-family slug from the URL/page data |
level | Company level, for example L3 or L5 |
focusTag | Specialization tag when available |
location | Location label |
dmaId | Location DMA identifier when present |
countryId | Country identifier when present |
yearsOfExperience | Candidate experience at offer time |
yearsAtCompany | Tenure at the company |
yearsAtLevel | Tenure at level when present |
offerDate | Offer/sample date |
baseSalary | Base salary amount |
totalCompensation | Total yearly compensation |
avgAnnualStockGrantValue | Annualized stock/equity value |
avgAnnualBonusValue | Annualized bonus value |
currency | Currency code inferred from the page/sample |
gender | Gender field if present in the public sample |
employmentType | Employment type when present |
workArrangement | Remote/hybrid/on-site signal when present |
levelSampleCount | Number of samples in the level band |
levelAverageBaseSalary | Average base salary for the level |
levelAverageStockGrant | Average stock value for the level |
levelAverageBonus | Average bonus value for the level |
levelAverageTotalCompensation | Average total compensation for the level |
levelPageUrl | Public level-specific page URL |
sourceUrl | Salary page scraped |
scrapedAt | ISO timestamp of extraction |
How much does it cost to scrape Levels.fyi salary data?
The actor uses pay-per-event pricing:
- $0.005 start fee per run
- formula-derived tiered per-result pricing for each salary sample saved
- BRONZE per-result price: $0.0001 per salary sample (platform minimum adjustment above the formula floor)
You only pay for records produced. Use a small maxSamplesPerPage during testing, then increase it for production benchmarking.
How to use this actor
- Open the actor on Apify.
- Add one or more public Levels.fyi salary URLs.
- Optionally add company slugs and job-family slugs.
- Set
maxSamplesPerPage. - Run the actor.
- Export results as JSON, CSV, Excel, or via the Apify API.
Input options
Levels.fyi salary page URLs
Use startUrls when you already know exact pages.
Example:
{"startUrls": [{ "url": "https://www.levels.fyi/companies/google/salaries/software-engineer" }],"maxSamplesPerPage": 50}
Company and job-family slugs
Use slugs to generate URLs automatically.
{"companySlugs": ["google", "meta", "microsoft"],"jobFamilySlugs": ["software-engineer", "product-manager"],"maxSamplesPerPage": 100}
Raw sample JSON
Enable includeRawSample only if you need the original embedded object for custom mapping.
Output example
{"company": "Google","role": "Software Engineer","level": "L4","location": "Los Angeles, CA","yearsOfExperience": 14,"yearsAtCompany": 5,"baseSalary": 180000,"totalCompensation": 220000,"avgAnnualStockGrantValue": 40000,"avgAnnualBonusValue": 0,"currency": "USD","sourceUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer","scrapedAt": "2026-05-26T00:00:00.000Z"}
Tips for better results
- Start with one URL and a low sample limit.
- Use public company salary pages, not login-only pages.
- Combine company slugs and job families for batch research.
- Keep
includeRawSampledisabled unless you need debugging details. - Export CSV for spreadsheet review.
- Export JSON for data pipelines.
Integrations
Use the dataset with:
- Google Sheets or Excel compensation models.
- Airtable recruiting research bases.
- BigQuery, Snowflake, or Postgres salary warehouses.
- HR analytics dashboards.
- Recruiting market intelligence workflows.
- Apify webhooks for scheduled refreshes.
API usage
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/levels-fyi-salary-scraper').call({startUrls: [{ url: 'https://www.levels.fyi/companies/google/salaries/software-engineer' }],maxSamplesPerPage: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.slice(0, 3));
Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/levels-fyi-salary-scraper').call(run_input={'startUrls': [{'url': 'https://www.levels.fyi/companies/google/salaries/software-engineer'}],'maxSamplesPerPage': 50,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items[:3])
cURL
curl -X POST "https://api.apify.com/v2/acts/automation-lab~levels-fyi-salary-scraper/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"companySlugs":["google"],"jobFamilySlugs":["software-engineer"],"maxSamplesPerPage":50}'
MCP usage
Connect the actor through Apify MCP:
https://mcp.apify.com/?tools=automation-lab/levels-fyi-salary-scraper
Claude Code setup:
$claude mcp add apify-levels-fyi-salary "https://mcp.apify.com/?tools=automation-lab/levels-fyi-salary-scraper"
Claude Desktop JSON config:
{"mcpServers": {"apify-levels-fyi-salary": {"url": "https://mcp.apify.com/?tools=automation-lab/levels-fyi-salary-scraper"}}}
Example prompts:
- "Scrape Google software engineer salary samples from Levels.fyi and summarize median total compensation."
- "Compare public Levels.fyi salary samples for Google and Microsoft software engineers."
- "Export Levels.fyi product manager salary records as CSV-ready data."
Scheduling
Schedule daily, weekly, or monthly runs in Apify Console when you need fresh compensation data.
For salary benchmarking, monthly refreshes are often enough.
For recruiting campaigns, weekly refreshes can catch new samples sooner.
Data quality notes
The actor extracts public user-submitted compensation samples. Treat them as market signals, not payroll-certified data.
Use filters and aggregation to reduce outlier impact.
Compare multiple companies, levels, and locations before making compensation decisions.
FAQ
Is Levels.fyi Salary Scraper free to try?
You can run a small test with a low maxSamplesPerPage value to estimate output volume and cost before scaling up.
Can I scrape multiple companies in one run?
Yes. Add multiple company slugs and job-family slugs, or provide multiple exact salary page URLs.
Troubleshooting
The actor returned no results
Check that the URL is a public salary page using the /companies/{company}/salaries/{job-family} pattern.
I received fewer records than expected
Levels.fyi may expose a limited number of public samples on a page. Increase maxSamplesPerPage, add more pages, or use more company/job-family combinations.
Some fields are null
Not every public sample includes every attribute. Null values mean the field was absent in the page data.
Legality and responsible use
This actor extracts publicly available page data. You are responsible for using exported data in a way that complies with applicable laws, contracts, privacy rules, and Levels.fyi terms.
Do not use salary data to make discriminatory decisions.
Do not attempt to scrape private, login-only, or access-controlled data.
Related scrapers
Other Automation Lab actors that may complement this workflow:
- https://apify.com/automation-lab/linkedin-jobs-scraper
- https://apify.com/automation-lab/indeed-scraper
- https://apify.com/automation-lab/google-maps-lead-finder
- https://apify.com/automation-lab/company-employee-scraper
Changelog
0.1
Initial actor for public Levels.fyi salary sample extraction.
Support
If a public salary URL fails, include the input URL, run ID, and expected company/role in your support request.
Summary
Levels.fyi Salary Scraper helps teams turn public compensation pages into structured salary datasets for benchmarking, recruiting, and workforce planning.