Levels.fyi Compensation Scraper icon

Jobs

Levels.fyi Compensation Scraper

Scrape verified tech compensation data from Levels.fyi by company — total comp, base salary, stock, bonus, and level breakdowns by job family, normalized into one row per data point for CSV, JSON, or API export.

Free Apify credit covers a first run. No credit card to try.

What this Actor scrapes

Levels.fyi crowdsources tech-industry compensation reports and normalizes them into levels, total comp, base, stock, and bonus per company and job family — the closest thing to a public pay ladder for tech roles. This Actor parses that data straight out of the page's own embedded JSON: point it at one or more companies and it writes one structured row per individual submission (base, stock, and bonus kept separate — the differentiator most compensation scrapers flatten away) or one row per title in a lightweight company-wide overview, ready for comp-benchmarking spreadsheets, recruiting tools, or internal pay-band research.

What we handle for you

  • 🎯 Two granularities, your call — component-separated individual submissions (base/stock/bonus kept apart) or lightweight company-wide aggregates.
  • 🔁 We retry with exponential backoff on 408 / 429 / 503 and honour Retry-After — up to 5 attempts per page.
  • 🌐 We route every request through Apify Proxy, residential preferred and pinned to the US, so your dataset isn't tied to one exit IP.
  • 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, deduped by submission ID, JSON / CSV / Excel export straight from the Apify Console.
  • 🔍 Every row carries its submission-count context — so you always know how much of the underlying sample you're looking at, never presented as more complete than it is.
  • 💰 Pay-Per-Event pricing — you only pay for rows that hit your dataset. No data, no charge.

Use cases

  • Comp benchmarking — pull Levels.fyi's per-level total comp, base, stock, and bonus for target companies into a spreadsheet or BI tool.
  • Offer negotiation research — compare a candidate's offer against Levels.fyi's published bands for the same company and job family.
  • Recruiting + TA analytics — feed normalized, component-separated compensation rows into a sourcing or comp-modeling pipeline.
  • Internal pay-band research — track how a peer company's published levels and comp move over time.

Input

Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.

FieldTypeRequiredWhat it does
mode string no 'Company + job family' pulls per-level compensation rows for one or more job families at each company. 'Company overview' pulls the company-wide summary row instead.
companies array yes Levels.fyi company URL slugs, e.g. 'google', 'meta', 'apple' — not arbitrary display names.
jobFamilies array no Levels.fyi job-family URL slugs, e.g. 'software-engineer', 'product-manager'. Required (non-empty) when Mode is 'Company + job family'; every (company, job family) pair is fetched.
maxResults integer no Hard cap on dataset rows for this run.
{
  "mode": "company_job_family",
  "companies": [
    "google"
  ],
  "jobFamilies": [
    "software-engineer"
  ],
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

Output

One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.

granularitycompanycompany_slugjob_familyjob_family_slugtitleleveltracklocationyears_of_experienceyears_at_companybase_salarystock_annual_valuebonus_annual_valuetotal_compensationcurrency_code

{
  "granularity": "individual_submission",
  "company": "Google",
  "company_slug": "google",
  "job_family": "Software Engineer",
  "job_family_slug": "software-engineer",
  "title": "Software Engineer",
  "level": "L3",
  "track": "ML / AI",
  "location": "New York, NY",
  "years_of_experience": 0.0,
  "years_at_company": 0.0,
  "base_salary": 140000.0,
  "stock_annual_value": 2500.0,
  "bonus_annual_value": 0.0,
  "total_compensation": 142500.0,
  "currency_code": "USD",
  "offer_date": "2026-07-09T17:59:59.627+00:00",
  "level_submission_count": 46,
  "level_submission_count_last_12_months": 1134,
  "source_url": "https://www.levels.fyi/companies/google/salaries/software-engineer",
  "scraped_at": "2026-08-06T09:00:00+00:00"
}

Pricing

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row$0.0018Per result written to the dataset.

You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.

FAQ

Do I need a Levels.fyi account or API key?
No. This Actor scrapes Levels.fyi's own publicly published compensation pages — no login, no API key.
What's the difference between the two modes?
'Company + job family' returns individual-submission rows with base salary, stock, and bonus broken out separately — one row per sample in each level bucket. 'Company overview' returns one aggregate row per title (median total comp + submission count), with no base/stock/bonus split.
Are the individual-submission rows the complete Levels.fyi dataset?
No — each level bucket embeds a bounded preview of its submissions, not every one on file. Every row carries level_submission_count and level_submission_count_last_12_months so you can see exactly how much of the underlying sample you're getting, instead of mistaking a preview for the full population.
What format do company and job-family slugs need to be in?
Use Levels.fyi's own URL slugs — e.g. 'google', not 'Google Inc'; 'software-engineer', not 'Software Engineer'. We lowercase and hyphenate spaces as a convenience, but you're responsible for supplying a slug that matches a real Levels.fyi URL.
What happens if I request a company or job family that doesn't exist?
That pair returns zero rows and is logged as a failed pair — it never crashes the run. Only if every requested pair comes back empty does the run fail loudly, so you know to double-check your slugs.

Ready to run it?

Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.

Related Actors

Teams that run this also run