Levels.fyi Jobs Scraper avatar

Levels.fyi Jobs Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Levels.fyi Jobs Scraper

Levels.fyi Jobs Scraper

[๐Ÿ’ฐ $1 / 1K] Extract tech jobs from Levels.fyi with the base and total pay Levels.fyi publishes, company type, headcount and valuation, locations and apply links. Search by keyword and location, filter by work arrangement, discipline, level or a pay floor, or paste Levels.fyi URLs.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

19

Total users

7

Monthly active users

11 days ago

Last modified

Share

Pull tech job listings from Levels.fyi at scale, each one carrying the pay figures Levels.fyi publishes, company intelligence (type, exact headcount, estimated valuation), a ready-to-apply link, and, where Levels.fyi has them, listed locations, work arrangement and a level-by-level total-comp table. A single keyword reaches about 2,500 hiring companies before the board runs out of new ones. Built for technical recruiters, compensation analysts, and job seekers who need real salary data without copying numbers off the website one listing at a time.

Why This Scraper?

  • Real pay figures on about 6 listings in 10 โ€” minBaseSalary/maxBaseSalary, minTotalSalary/maxTotalSalary and a currency code, measured at 61% across 1,773 listings. Coverage runs near 9 in 10 across the first few hundred results of a keyword and thins as a sweep goes deeper, so you know exactly what you are getting. Nothing is estimated, inferred or filled in: a listing Levels.fyi prices arrives priced, and one it doesn't arrives empty rather than guessed.
  • A level-by-level comp table on about 2 in 3 engineering listings โ€” totalCompensationEstimates names each employer's own internal bands (IC13, TR5, G17) with an estimated total for each and a flag marking which band the posting matches. Measured at 68% on two separate Software Engineer runs against 20% on an Internship run: Levels.fyi has levelled senior engineering ladders far more thoroughly than early-career roles. Needs Fetch Full Job Descriptions on.
  • Company intelligence on virtually every row โ€” company type on 98% (public, private, nonprofit, education, government), exact employee headcount as a number on 99%, one-line description on 99.8%, logo on 99.7%, and an estimated valuation in dollars on about half. Segment by startup vs. public or by headcount without a second data source.
  • 2,500 employers deep per keyword โ€” the board serves fresh companies for roughly 2,500 employers, then repeats itself; the run stops there instead of spinning. 1,500 listings from one keyword took 78 seconds, and 1,773 listings spanned 1,226 distinct companies.
  • A pay floor that filters listings, not companies โ€” set a dollar figure and each individual posting is checked against it, including the promoted ones Levels.fyi pins to the top of its own results. Ten currencies appear in the data and non-dollar pay is compared at approximate rates so a floor doesn't silently drop them.
  • A mis-reported-pay marker on every row โ€” job boards feed Levels.fyi the odd broken figure: a Toronto banking director listed at a flat $5,000,000, a maths adjunct at $1,456,000, a Netflix manager at $1,250,000 whose own posting says $523,000 to $920,000. Every row carries payFigureSuspect, true when a listing's base and total are the same number and that number is $1,000,000 or more a year. Filter on one field to drop them, and a highest-pay sort puts them below the real offers instead of at the top. The published figures are never altered.
  • Exact result caps โ€” ask for 1,500 and you get 1,500, counted in listings rather than pages, so a small cap doesn't quietly bill you for a full page of extras. Duplicates across pages and across keywords are removed, including the copies Levels.fyi creates when one opening is advertised in several cities: those arrive as one row naming every city, not one billed row per city.
  • 8 disciplines and 7 seniority bands โ€” Software Engineer, Engineering Manager, Data Scientist, Data Science Manager, Product Manager, Designer, Security and Hardware Engineer, crossed with Internship, Entry Level, Senior, Principal, Manager, Director and Executive, so you can isolate exactly the band you're benchmarking.
  • 3 sort modes applied across your whole result set โ€” Relevance, Total Compensation (highest first), or Date Posted (newest first). Levels.fyi ranks employers rather than listings, so the ordering is applied to your rows, across every keyword at once, with pay compared across currencies.
  • Apply links and dates on 100% of rows โ€” an external applicationUrl (LinkedIn, Greenhouse, Lever, Ashby), the canonical Levels.fyi url, plus postingDate and expiryDate on every single listing for freshness filtering.

Use Cases

Recruiting & Talent Sourcing

  • Build target-company shortlists by headcount, valuation, or company type
  • Find roles by discipline and seniority to match open reqs
  • Track which companies are actively hiring for a given title
  • Pull apply-ready links to route candidates straight to live postings

Compensation Benchmarking

  • Benchmark base vs. total pay across companies for the same role
  • Read each employer's own internal bands from the per-level comp table
  • Set a minimum total-comp floor to study only senior and staff bands
  • Build market pay bands by city and work arrangement

Job Seeking & Career Moves

  • Surface the highest-paying roles first with Total Compensation sort
  • Filter to Remote-only positions across every discipline
  • Compare offers against real posted figures before negotiating
  • Track newly posted roles with Date Posted sort and posting dates

Market & Talent Research

  • Map hiring demand by discipline, level, and location
  • Spot which startups vs. public companies are scaling headcount
  • Monitor remote vs. hybrid vs. office trends across the listings Levels.fyi tags with an arrangement
  • Feed structured comp and company data into analytics dashboards

Getting Started

The fastest way to start โ€” one keyword:

{
"searchQueries": ["Software Engineer"],
"maxResults": 100
}

Remote senior roles, highest pay first

{
"searchQueries": ["Data Scientist", "Machine Learning Engineer"],
"location": "Remote",
"level": "principal",
"sortBy": "total_compensation",
"maxResults": 200
}

High-paying engineering roles with full filters

{
"searchQueries": ["Software Engineer", "Engineering Manager"],
"location": "San Francisco",
"workArrangement": "hybrid",
"jobFamily": "software-engineer",
"level": "mid_staff",
"sortBy": "total_compensation",
"minTotalCompensation": 300000,
"maxResults": 500,
"includeDescription": true
}

Input Reference

ParameterTypeDefaultDescription
searchQueriesarray["Software Engineer"]Job titles or keywords to search for. Each keyword runs its own search. Up to 50. Leave empty for the broadest result set for your location and filters.
locationstring""City, region, or work arrangement to search in, e.g. "San Francisco", "London", "Remote". "Remote", "Hybrid" and "Office" are applied as a work-arrangement filter. Combined with each keyword. Empty searches everywhere.
startUrlsarray[]Paste full Levels.fyi job-search or individual job URLs to scrape them directly. Up to 50 per run.

Filters & Limits

ParameterTypeDefaultDescription
workArrangementstringAnyWhere the role is performed: Any, Remote, Hybrid, or Office.
jobFamilystringAnyLimit to one discipline: Any, Software Engineer, Engineering Manager, Data Scientist, Data Science Manager, Product Manager, Designer, Security, or Hardware Engineer.
levelstringAnySeniority band: Any, Internship, Entry Level, Senior, Principal, Manager, Director, or Executive.
sortBystringRelevanceResult order: Relevance, Total Compensation (highest first), or Date Posted (newest first). Levels.fyi ranks employers rather than individual listings, so it decides which employers a search reaches and the dataset is then ordered listing by listing across all your keywords. Rows with no pay figure (or no posting date) sit at the end.
minTotalCompensationintegernullDrop listings advertising less than this many US dollars a year in total pay. A listing is kept when the top of its posted range reaches the figure; listings with no posted pay are kept too. Other currencies are compared at approximate exchange rates. Empty means no minimum.
maxResultsinteger100Max listings to collect per keyword (or per start URL). Set to 0 to take everything Levels.fyi serves for that keyword, roughly 2,500 employers deep. Counted in listings, so a run stops exactly at your cap; duplicates across pages and across keywords are removed, so the count can run slightly under.

Output

ParameterTypeDefaultDescription
includeDescriptionbooleantrueInclude the full job description (text and HTML) for each listing, plus jobFamily, employmentTypes and the per-level totalCompensationEstimates table, which Levels.fyi only publishes on the detailed record. Turn off for lighter records with only titles, companies, locations, and compensation.

Output

Each job is a single flat record. This is a real row, unedited apart from the two description fields, which are shortened here:

{
"jobId": "124779280260309702",
"title": "Software Engineer II, Android",
"company": "Pinterest",
"companySlug": "pinterest",
"companyType": "public",
"companyEmployeeCount": 4800,
"companyEstimatedValuation": 13000000000,
"companyShortDescription": "Pinterest is a social media company that enables discovery of things like recipes, style inspiration, home hacks and more.",
"companyIcon": "https://static.levels.fyi/pinterestlogo.png",
"isPromoted": false,
"locations": ["Toronto, ON, CA"],
"workArrangement": "office",
"jobFamily": "software-engineer",
"employmentTypes": ["full_time"],
"minBaseSalary": 189378,
"maxBaseSalary": 189378,
"minTotalSalary": 216764,
"maxTotalSalary": 289425,
"salaryCurrency": "USD",
"totalCompensationEstimates": [
{ "level": "IC13", "levelSlug": "ic13", "total": 127425.55, "priority": 0, "match": true },
{ "level": "IC14", "levelSlug": "ic14", "total": 184209.56, "priority": 1, "match": true },
{ "level": "IC15", "levelSlug": "ic15", "total": 242706.23, "priority": 2, "match": true }
],
"postingDate": "2026-09-03T20:47:15.000Z",
"expiryDate": "2026-10-04T04:12:28.000Z",
"applicationUrl": "https://www.pinterestcareers.com/jobs/?gh_jid=7987854",
"url": "https://www.levels.fyi/jobs?jobId=124779280260309702",
"searchQuery": "Software Engineer",
"searchLocation": "",
"descriptionHtml": "<div><p><strong>About Pinterest:</strong></p>\n<p>Millions of people around the w...",
"descriptionText": "About Pinterest:\nMillions of people around the world come to our platform to fin...",
"scrapedAt": "2026-09-04T21:33:58.159548+00:00"
}

Fill rates below were measured across 1,773 listings collected over six runs in one sitting. The four fields marked (detailed record only) arrive only when Fetch Full Job Descriptions is on; their rates are measured on those runs.

Core Fields

FieldTypeDescription
jobIdstringUnique Levels.fyi job ID, a 17 to 18 digit number as a string. Always present
titlestringJob title. Always present
locationsarray of stringsListed locations in long form, e.g. "London, England, United Kingdom". Usually one entry, several when the same opening is advertised across offices. Empty when Levels.fyi publishes no location for the listing, about 13% of rows. That figure swings with the search: 0% on a city-filtered run, 31% on a remote one
workArrangementstring or nullremote, hybrid, or office, lowercase. Null when Levels.fyi has not tagged the listing, about 6 rows in 10
jobFamilystring or nullDiscipline slug, e.g. software-engineer (detailed record only, 100%). Null when descriptions are off
employmentTypesarray of stringsLowercase snake_case values such as full_time, part_time, internship, temporary, other (detailed record only, 100%)
isPromotedbooleanWhether Levels.fyi pinned the listing as sponsored. True on about 1 row in 20 overall, but heavily front-loaded: roughly a quarter of the rows in a small-cap run against about 1 in 100 deep into a sweep
urlstringCanonical Levels.fyi job URL. Always present

Compensation

FieldTypeDescription
minBaseSalarynumber or nullBottom of the posted base salary. Present on about 62% of rows
maxBaseSalarynumber or nullTop of the posted base salary. Equal to the minimum when the listing posts a single figure
minTotalSalarynumber or nullBottom of the posted total compensation
maxTotalSalarynumber or nullTop of the posted total compensation. About 4 in 10 priced listings post a single figure rather than a spread
payFigureSuspectbooleantrue when the listing's base and total ranges are the same number and that number is $1,000,000 or more a year, which is how a broken figure reaches Levels.fyi from a feeding job board. On a $250K-floor Software Engineer + Engineering Manager run, 71 of 172 rows. Zero on all seven other sample runs (1,284 rows)
salaryCurrencystring or nullCurrency code, e.g. USD, EUR, GBP, JPY, CAD. Present on exactly the rows that carry pay figures, never on their own
totalCompensationEstimatesarray of objectsThe employer's own internal bands with an estimated total for each (detailed record only). Fill depends strongly on the role: 68% on two Software Engineer runs, 20% on an Internship run. See the table below

The five pay fields are all present or all absent together: a row never carries a currency without figures, or figures without a currency. payFigureSuspect is on every row and reads false when there is nothing to question.

Inside each totalCompensationEstimates entry

KeyTypeDescription
levelstringThe employer's own band name, e.g. IC13, TR5, G17, L4
levelSlugstringLowercase slug of the same band
totalnumberEstimated total compensation for that band, in the listing's currency
priorityintegerRank of the band within the employer's ladder, starting at 0
matchbooleanPresent on the bands Levels.fyi matches to this posting; omitted on the others

Company

FieldTypeDescription
companystringCompany name. Always present
companySlugstringCompany slug on Levels.fyi. Always present
companyTypestring or nullLowercase: public, private, nonprofit, education, or government. Present on 98% of rows
companyEmployeeCountinteger or nullReported headcount as a whole number, e.g. 4800. Present on 99% of rows
companyEstimatedValuationnumber or nullEstimated valuation in whole dollars, e.g. 13000000000. Present on about half of rows, and more often on the larger employers a search surfaces first (74% in a small-cap run, 49% deep into a sweep)
companyShortDescriptionstring or nullOne-line company blurb. Present on 99.8% of rows
companyIconstring or nullCompany logo URL. Present on 99.7% of rows
FieldTypeDescription
postingDatestringWhen the job was posted, a full ISO 8601 timestamp, e.g. "2026-09-03T20:47:15.000Z". Always present
expiryDatestringWhen the listing expires, same timestamp format. Always present
applicationUrlstringExternal application link, most often LinkedIn, Greenhouse, Lever or Ashby. Always present
descriptionTextstringPlain-text job description, averaging about 5,700 characters (detailed record only). The key is absent entirely when descriptions are off
descriptionHtmlstringFull HTML job description (detailed record only). The key is absent entirely when descriptions are off
searchQuerystringThe keyword that produced this row
searchLocationstringThe location filter that was actually applied to this search. Empty when the run used no location filter
scrapedAtstringExtraction timestamp, ISO 8601 with a UTC offset, e.g. "2026-09-04T21:33:58.159548+00:00"

Tips for Best Results

  • Keep caps moderate if you want priced listings. Pay figures sit on roughly 9 listings in 10 across the first few hundred results of a keyword and thin out further down: on one 1,500-listing sweep the first 250 rows were 88% priced and the last 250 were 38%. Several keywords at 200 each will hand you far more priced rows than one keyword driven 1,500 deep.
  • Run several related titles in one batch. A single keyword reaches about 2,500 employers before Levels.fyi stops serving new ones, and a full sweep that deep takes a couple of minutes. Queue "Software Engineer", "Backend Engineer", and "Full Stack Engineer" together to widen coverage instead of driving one keyword to its ceiling.
  • Set a minimum total compensation to isolate senior roles. A minTotalCompensation floor, say 300000, drops every listing whose posted pay tops out below it, surfacing staff and principal roles without scrolling past junior listings. Roles that post no pay at all still come through, so sort by total compensation if you want the priced ones first.
  • Turn on full descriptions when you want the per-level comp table. totalCompensationEstimates, employmentTypes and jobFamily live only on the detailed record, so they are empty without it. The comp table is the one to plan around, and it depends on the role: Levels.fyi had levelled 68% of the Software Engineer listings we measured but only 20% of the Internship ones, so expect thinner coverage on early-career searches.
  • Filtering by location or work arrangement also filters out the untagged listings. Levels.fyi publishes a location on about 87% of listings and an arrangement on about 4 in 10, and a filter can only match a listing that carries the value. A London run comes back 100% located and a Remote run 100% arrangement-tagged, while an unfiltered run shows the true coverage. Location coverage moves the furthest: across eight saved searches it ran from 100% on the city-filtered one down to 69% on the remote one. Use an unfiltered run when you are measuring how common something is, and a filtered one when you want a clean subset.
  • Filter on payFigureSuspect before you benchmark. A pay floor lets broken figures through, because a listing wrongly priced at $5,000,000 clears any floor you set. Drop the rows marked true and what is left is pay you can quote: on a $250K-floor engineering run that removed 71 of 172 rows and left every top-of-list result a real senior offer at Meta, Google, Amazon, OpenAI and Databricks.
  • Pair a keyword with a location for sharper results โ€” "Data Scientist" plus "New York" returns a tighter, more relevant set than either alone.
  • Add a seniority level filter to benchmark a single band cleanly; combine it with a discipline to compare, say, Senior Data Scientist pay across companies.
  • Paste a tuned URL into startUrls when you've already dialed in a search on the website โ€” the scraper lifts the keyword and filters straight from the link.

Pricing

From $1 per 1,000 results โ€” among the most affordable ways to collect Levels.fyi compensation and company data at scale. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

ResultsNo discountBronzeSilverGold
100$0.12$0.11$0.11$0.10
1,000$1.20$1.13$1.07$1.00
10,000$12.00$11.30$10.70$10.00
100,000$120.00$113.00$107.00$100.00

A "result" is one job listing pushed to your dataset. No compute or time-based charges โ€” you pay per result, plus a small fixed per-run start fee.

Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps:

  • Zapier / Make / n8n โ€” Workflow automation
  • Google Sheets โ€” Direct spreadsheet export
  • Slack / Email โ€” Notifications on new results
  • Webhooks โ€” Trigger custom APIs on run completion
  • Apify API โ€” Full programmatic access

This scraper collects publicly available job-listing and compensation data for legitimate research, recruiting, and analytics. You are responsible for using the data in compliance with Levels.fyi's terms of service and all applicable laws, including data protection regulations such as GDPR and CCPA. Do not use the data to harass individuals, and respect the rights of the data's original publishers. When in doubt, consult legal counsel about your specific use case.