Levels.fyi Salary Scraper avatar

Levels.fyi Salary Scraper

Pricing

Pay per event

Go to Apify Store
Levels.fyi Salary Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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

FieldDescription
uuidPublic sample identifier when present
companyCompany name
companySlugLevels.fyi company slug
roleSalary sample title
jobFamilyJob family shown on the page
jobFamilySlugJob-family slug from the URL/page data
levelCompany level, for example L3 or L5
focusTagSpecialization tag when available
locationLocation label
dmaIdLocation DMA identifier when present
countryIdCountry identifier when present
yearsOfExperienceCandidate experience at offer time
yearsAtCompanyTenure at the company
yearsAtLevelTenure at level when present
offerDateOffer/sample date
baseSalaryBase salary amount
totalCompensationTotal yearly compensation
avgAnnualStockGrantValueAnnualized stock/equity value
avgAnnualBonusValueAnnualized bonus value
currencyCurrency code inferred from the page/sample
genderGender field if present in the public sample
employmentTypeEmployment type when present
workArrangementRemote/hybrid/on-site signal when present
levelSampleCountNumber of samples in the level band
levelAverageBaseSalaryAverage base salary for the level
levelAverageStockGrantAverage stock value for the level
levelAverageBonusAverage bonus value for the level
levelAverageTotalCompensationAverage total compensation for the level
levelPageUrlPublic level-specific page URL
sourceUrlSalary page scraped
scrapedAtISO 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

  1. Open the actor on Apify.
  2. Add one or more public Levels.fyi salary URLs.
  3. Optionally add company slugs and job-family slugs.
  4. Set maxSamplesPerPage.
  5. Run the actor.
  6. 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 includeRawSample disabled 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 ApifyClient
import os
client = 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().items
print(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.

Other Automation Lab actors that may complement this workflow:

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.