Levels.fyi Jobs Scraper
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
19
Total users
7
Monthly active users
11 days ago
Last modified
Categories
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/maxTotalSalaryand 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 โ
totalCompensationEstimatesnames 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.fyiurl, pluspostingDateandexpiryDateon 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
Simple keyword search
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
Search
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQueries | array | ["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. |
location | string | "" | 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. |
startUrls | array | [] | Paste full Levels.fyi job-search or individual job URLs to scrape them directly. Up to 50 per run. |
Filters & Limits
| Parameter | Type | Default | Description |
|---|---|---|---|
workArrangement | string | Any | Where the role is performed: Any, Remote, Hybrid, or Office. |
jobFamily | string | Any | Limit to one discipline: Any, Software Engineer, Engineering Manager, Data Scientist, Data Science Manager, Product Manager, Designer, Security, or Hardware Engineer. |
level | string | Any | Seniority band: Any, Internship, Entry Level, Senior, Principal, Manager, Director, or Executive. |
sortBy | string | Relevance | Result 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. |
minTotalCompensation | integer | null | Drop 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. |
maxResults | integer | 100 | Max 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
| Parameter | Type | Default | Description |
|---|---|---|---|
includeDescription | boolean | true | Include 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
| Field | Type | Description |
|---|---|---|
jobId | string | Unique Levels.fyi job ID, a 17 to 18 digit number as a string. Always present |
title | string | Job title. Always present |
locations | array of strings | Listed 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 |
workArrangement | string or null | remote, hybrid, or office, lowercase. Null when Levels.fyi has not tagged the listing, about 6 rows in 10 |
jobFamily | string or null | Discipline slug, e.g. software-engineer (detailed record only, 100%). Null when descriptions are off |
employmentTypes | array of strings | Lowercase snake_case values such as full_time, part_time, internship, temporary, other (detailed record only, 100%) |
isPromoted | boolean | Whether 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 |
url | string | Canonical Levels.fyi job URL. Always present |
Compensation
| Field | Type | Description |
|---|---|---|
minBaseSalary | number or null | Bottom of the posted base salary. Present on about 62% of rows |
maxBaseSalary | number or null | Top of the posted base salary. Equal to the minimum when the listing posts a single figure |
minTotalSalary | number or null | Bottom of the posted total compensation |
maxTotalSalary | number or null | Top of the posted total compensation. About 4 in 10 priced listings post a single figure rather than a spread |
payFigureSuspect | boolean | true 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) |
salaryCurrency | string or null | Currency code, e.g. USD, EUR, GBP, JPY, CAD. Present on exactly the rows that carry pay figures, never on their own |
totalCompensationEstimates | array of objects | The 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
| Key | Type | Description |
|---|---|---|
level | string | The employer's own band name, e.g. IC13, TR5, G17, L4 |
levelSlug | string | Lowercase slug of the same band |
total | number | Estimated total compensation for that band, in the listing's currency |
priority | integer | Rank of the band within the employer's ladder, starting at 0 |
match | boolean | Present on the bands Levels.fyi matches to this posting; omitted on the others |
Company
| Field | Type | Description |
|---|---|---|
company | string | Company name. Always present |
companySlug | string | Company slug on Levels.fyi. Always present |
companyType | string or null | Lowercase: public, private, nonprofit, education, or government. Present on 98% of rows |
companyEmployeeCount | integer or null | Reported headcount as a whole number, e.g. 4800. Present on 99% of rows |
companyEstimatedValuation | number or null | Estimated 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) |
companyShortDescription | string or null | One-line company blurb. Present on 99.8% of rows |
companyIcon | string or null | Company logo URL. Present on 99.7% of rows |
Dates, Links & Context
| Field | Type | Description |
|---|---|---|
postingDate | string | When the job was posted, a full ISO 8601 timestamp, e.g. "2026-09-03T20:47:15.000Z". Always present |
expiryDate | string | When the listing expires, same timestamp format. Always present |
applicationUrl | string | External application link, most often LinkedIn, Greenhouse, Lever or Ashby. Always present |
descriptionText | string | Plain-text job description, averaging about 5,700 characters (detailed record only). The key is absent entirely when descriptions are off |
descriptionHtml | string | Full HTML job description (detailed record only). The key is absent entirely when descriptions are off |
searchQuery | string | The keyword that produced this row |
searchLocation | string | The location filter that was actually applied to this search. Empty when the run used no location filter |
scrapedAt | string | Extraction 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
minTotalCompensationfloor, 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,employmentTypesandjobFamilylive 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
payFigureSuspectbefore 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 markedtrueand 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
startUrlswhen 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.
| Results | No discount | Bronze | Silver | Gold |
|---|---|---|---|---|
| 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
Legal & Ethical Use
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.
