# Levels.fyi Scraper: US Tech Salary + Jobs (`santamaria-automations/levels-fyi-scraper`) Actor

Extract US tech job listings from Levels.fyi with structured compensation data (base salary, total comp, equity, bonus) at the top FAANG-tier companies. Returns title, company, location, comp min/max USD, level, work arrangement, description and apply URL. Pay-per-result.

- **URL**: https://apify.com/santamaria-automations/levels-fyi-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 serp results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Levels.fyi Scraper: US Tech Salary + Jobs

Extract US tech job listings from [Levels.fyi](https://www.levels.fyi/jobs), the salary transparency site for FAANG-tier engineering, product and data roles. Every row includes Levels.fyi's structured compensation data (base salary, total comp, currency), location, work arrangement and a direct apply URL to the employer's ATS.

### What it does

Levels.fyi hosts 70,000+ open tech jobs with the site's own structured salary data on the majority of rows. This actor pulls listings from Levels.fyi's SSR pages, then optionally fetches each job's detail JSON for the full description, employment type, and perks, PLUS each company's Levels.fyi profile for the unique compensation-by-level averages that only Levels.fyi publishes.

Three enrichment modes:

- **Minimal** (default): 15 SERP-level fields per row including base/total salary and currency when Levels.fyi surfaces them (about 67% fill rate).
- **With job details**: adds full HTML description, employment type, work arrangement, perks list, structured location, years-of-experience parsing.
- **With company details**: adds 15+ company profile fields (industry, employee count, valuation, HQ address, ticker, benefits page URL, funding stage) plus the unique `company_avg_total_comp_by_level` array with total comp and sample size for every level Levels.fyi tracks at that company.

#### Sample output

```json
{
  "_type": "job",
  "id": "105808633052177094",
  "title": "Staff Machine Learning Engineer, Ad Serving",
  "company_name": "Roku",
  "company_slug": "roku",
  "company_logo_url": "https://img.logo.dev/roku.com?token=pk_Ez-J4YOpSS-Bjtug_T41Dw",
  "company_type": "public",
  "employee_count": 3400,
  "estimated_valuation_usd": 20800000000,
  "location": "New York, New York",
  "salary_min": 195000,
  "salary_max": 510000,
  "salary_currency": "USD",
  "total_comp_min_usd": 195000,
  "total_comp_max_usd": 510000,
  "level": "Staff",
  "workplace_type": "onsite",
  "employment_type": "full_time",
  "posted_at": "2026-08-21",
  "expires_at": "2026-09-20",
  "job_url": "https://www.levels.fyi/jobs?jobId=105808633052177094",
  "application_url": "https://www.weareroku.com/jobs/7991258?gh_jid=7991258",
  "job_family_slug": "software-engineer",
  "source_platform": "levels.fyi",
  "company_about": "Roku, Inc. is an American publicly traded company based in San Jose, California...",
  "company_website": "https://www.roku.com",
  "company_founded": 2002,
  "company_headquarters": "1173 Coleman Ave, San Jose, CA 95110, USA",
  "company_hq_city": "San Jose",
  "company_hq_state": "California",
  "company_industry": "Consumer Electronics",
  "company_ticker": "ROKU",
  "company_size_range": "1,001-5,000",
  "company_active_jobs_count": 187,
  "company_avg_total_comp_by_level": [
    {"level": "L3", "avg_total_comp_usd": 215379, "sample_size": 26, "job_family": "software-engineer"},
    {"level": "L4", "avg_total_comp_usd": 329868, "sample_size": 19, "job_family": "software-engineer"},
    {"level": "L5", "avg_total_comp_usd": 508600, "sample_size": 30, "job_family": "software-engineer"}
  ]
}
```

### Pricing

**$0.001 per actor start + $0.003 per SERP row + $0.005 per detail row (when `includeJobDetails=true`) + $0.005 per unique company profile (when `includeCompanyDetails=true`). About $3 to $10 per 1,000 tech roles depending on enrichment.**

You only pay for rows that successfully return data. Failed fetches are not charged.

**New to Apify?** Every account gets a $5 free monthly platform credit, enough for around 1,000 detail rows on this actor before you commit to paying anything. Test extensively first.

| Event | Price |
|-------|-------|
| Actor start | $0.001 |
| SERP row | $0.003 |
| Job detail row (when `includeJobDetails=true`) | $0.005 |
| Company profile (unique company, when `includeCompanyDetails=true`) | $0.005 |

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQueries` | array of strings | Job titles or job families to search. Slugified into Levels.fyi's job-family filter (e.g. `software engineer` becomes `/jobs/title/software-engineer`). |
| `startUrls` | array of strings | Alternative to searchQueries. Feed direct Levels.fyi jobs URLs. |
| `location` | string | Optional location filter (`San Francisco Bay Area`, `New York City Area`, `Seattle Area`, `Remote`). |
| `companySlugs` | array of strings | Optional. Restrict to specific companies (`google`, `meta`, `apple`, `netflix`, etc). Each company walked up to 15 jobs per query. |
| `includeJobDetails` | boolean | Fetch each job's SSR detail JSON for description, perks, work arrangement. Default false. |
| `includeCompanyDetails` | boolean | Fetch each unique company's Levels.fyi profile + salary rollup for the by-level compensation averages. Default false. |
| `maxResults` | integer | Total cap across all queries. Default 20. |
| `maxResultsPerQuery` | integer | Per-query cap. Default 100. |
| `maxConcurrency` | integer | Concurrent detail requests. Default 5. |

#### Example input

```json
{
  "searchQueries": ["software engineer", "product manager"],
  "companySlugs": ["google", "meta", "netflix"],
  "location": "san-francisco-bay-area",
  "includeJobDetails": true,
  "includeCompanyDetails": true,
  "maxResults": 200
}
```

### Output fields

**Identity**

- `id`: Levels.fyi internal job ID
- `title`: Role title
- `company_name`, `company_slug`, `company_logo_url` (logo.dev image URL when available)

**Compensation (Levels.fyi's unique differentiator)**

- `salary_min`, `salary_max`, `salary_currency`
- `total_comp_min_usd`, `total_comp_max_usd`: Total comp including base + equity + bonus
- `base_salary_min_usd`, `base_salary_max_usd`: Base only

**Level and experience**

- `level`: Coarse level tag inferred from title (Entry, Senior, Staff, Principal, Distinguished, Manager)
- `years_experience_min`, `years_experience_max`: Parsed from description when available

**Company signals (SERP-level, always populated)**

- `company_type`: public, private, non\_profit, government
- `employee_count`: Approximate size
- `estimated_valuation_usd`: Market cap for public companies, private valuation otherwise

**Job classification**

- `workplace_type`: remote, hybrid, onsite
- `employment_type`: full\_time, part\_time, contract, internship
- `job_family_slug`: Levels.fyi's job-family taxonomy

**Timing**

- `posted_at`, `expires_at`: ISO 8601 dates
- `scraped_at`: When the row was fetched

**Content**

- `description`: Full HTML description (with `includeJobDetails=true`)
- `perks`: Employer-verified perks list (401k, ESPP, health insurance, etc)
- `location`: City, state or multi-location pipe-joined
- `job_url`: Canonical Levels.fyi URL
- `application_url`: Direct link to the employer's ATS

**Contact extraction (with `includeJobDetails=true`)**

- `contact_emails`: Email addresses found in the job description (e.g. `recruit-engineer@hennge.com`). Deduplicated, lowercased.
- `contact_phones`: Phone numbers found in the description (US/international formats).
- `contact_urls`: External HTTP(S) links from the description (levels.fyi self-references excluded).

**Company profile (with `includeCompanyDetails=true`)**

- `company_about`, `company_website`, `company_founded`
- `company_headquarters`, `company_hq_city`, `company_hq_state`, `company_hq_country`
- `company_size_range`, `company_industry`, `company_ticker`
- `company_estimated_annual_revenue`, `company_funding_stage`
- `company_benefits_page`: URL to the company's dedicated benefits page
- `company_active_jobs_count`: Total open Levels.fyi listings at this company
- `company_active_jobs`: Array of `{title, job_url, location, salary_text}` for other roles
- `company_avg_total_comp_by_level`: Levels.fyi's proprietary data. Array of `{level, avg_total_comp_usd, avg_base_salary_usd, sample_size, job_family}` for every level Levels.fyi tracks at this company. UNIQUE to this actor.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

`https://mcp.apify.com?tools=santamaria-automations/levels-fyi-scraper`

**Example prompt once connected:**

> "Use `levels-fyi-scraper` to find Staff+ level software engineering roles at Google, Meta and Netflix in the San Francisco Bay Area. Include company details. Return a table with title, total comp range and the company's L6 average total comp."

Clients that support dynamic tool discovery (Claude.ai, VS Code) receive the full input schema automatically.

### Why this scraper

- **Only structured compensation data at scale.** Levels.fyi is the reference dataset for US tech compensation. Every row includes salary min/max in USD on the majority of postings, plus the unique by-level averages when you enable company details.
- **FAANG-tier company coverage.** Google, Meta, Apple, Netflix, Amazon, Microsoft, Nvidia, Anthropic, OpenAI and the rest of the top tech employers all list on Levels.fyi.
- **Rich company profile.** 15+ company fields (industry, valuation, ticker, size range, funding stage) come out of the /companies profile with a single extra HTTP hop, deduplicated across all rows from the same employer.
- **Zero login, zero captcha subscriptions.** HTTP-only, uses Levels.fyi's own SSR endpoints. No browser tier needed.
- **Pay-per-row.** No hourly rental. Small runs cost cents.

### Common use cases

- **Comp benchmarking for hiring teams.** Get the Levels.fyi total-comp range on every open role from a target competitor list, side-by-side with the company's own average by level.
- **Recruiters.** Track FAANG-tier openings and pitch candidates with real total-comp numbers instead of guesses.
- **Job seekers building comp models.** Feed structured comp data into a personal negotiation spreadsheet without manually copying from the site.
- **AI job-search agents.** Give agents structured access to US tech comp signals.
- **Compensation research.** Track how comp bands shift over time at specific companies and levels.

### Notes and limits

- **Salary fill rate is ~67% on the SERP-level** (Levels.fyi structures salary data on most, not all, listings). Rows without disclosed salary have null in the salary fields but everything else populated.
- **Salary is USD-dominated.** The `salary_currency` field is populated for non-USD roles (JPY, EUR, GBP, INR). The `*_usd` fields are only populated when the reported currency is USD (no FX conversion in this actor).
- **`level` field is coarse.** It infers from title keywords (Senior/Staff/Principal). The company-specific level (L5 at Google, E5 at Meta) requires an extra lookup and lives in `company_avg_total_comp_by_level` (in the company profile) rather than on the job row.
- **Pagination is per-URL not per-query.** Levels.fyi's SSR returns 5 companies x 3 jobs = 15 rows per multi-company page, or 15 jobs on a single-company page. Use `companySlugs` to walk companies deeply, or feed multiple keywords to get breadth. Client-side deep pagination is behind an encrypted API and not supported.
- **`years_experience_*` is parsed from the description** with a regex. Not every listing follows a consistent format; expect null on ~40% of rows.
- **Company profile pages are deduplicated per run.** If your batch has 20 rows from Google, we fetch `/companies/google` once and apply to all 20. Only unique company profiles are billed.

### Related Actors

- [Job Feed](https://apify.com/santamaria-automations/job-feed): one normalized, deduplicated job feed across 50+ international job boards. Orchestrates the NanoScrape fleet.
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): scrape jobs directly from company career pages (Greenhouse, Lever, Workday, etc.).
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): extract job listings from any website via HTML pattern detection.
- [LinkedIn Jobs Scraper](https://apify.com/santamaria-automations/linkedin-go): Broader coverage for tech + non-tech roles across countries.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): The generalist US jobs board.
- [Y Combinator Jobs Scraper](https://apify.com/santamaria-automations/ycombinator-scraper): Startup jobs from Y Combinator's job board.
- [Wellfound (AngelList) Jobs Scraper](https://apify.com/santamaria-automations/wellfound-jobs-scraper): Startup roles with equity ranges.
- [WeWorkRemotely Scraper](https://apify.com/santamaria-automations/weworkremotely): Remote-only tech roles.

### Support

For issues, feature requests, or fields not yet extracted, please open an issue on the [Issues tab](https://apify.com/santamaria-automations/levels-fyi-scraper/issues) of this actor. We typically respond within 24 hours.

Contact: contact@nanoscrape.com

# Actor input Schema

## `searchQueries` (type: `array`):

One or more job-title keywords. Slugified into Levels.fyi's job-family filter (e.g. 'software engineer' -> /jobs/title/software-engineer). Common values: software engineer, product manager, data scientist, mechanical engineer, marketing.

## `startUrls` (type: `array`):

Direct Levels.fyi jobs URLs to crawl instead of building from keywords. Examples: https://www.levels.fyi/jobs/company/netflix, https://www.levels.fyi/jobs/title/software-engineer/location/san-francisco-bay-area. Mutually exclusive with searchQueries.

## `location` (type: `string`):

Location filter. Slugified to Levels.fyi location taxonomy: 'San Francisco Bay Area', 'New York City Area', 'Seattle Area', 'Remote'. Leave blank for all locations.

## `companySlugs` (type: `array`):

Optional list of Levels.fyi company slugs to restrict search (e.g. 'google', 'meta', 'apple', 'netflix', 'amazon', 'microsoft'). When provided, each slug is walked deeply (up to 15 jobs per company per query).

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description, structured base/total-salary, employment type, perks list, and postal addresses. Otherwise only SERP-visible fields are returned.

## `includeCompanyDetails` (type: `boolean`):

Also fetch each unique company's Levels.fyi profile page (/companies/{slug}) for the About text, HQ address, industry, founded year, employee count range, ticker, valuation, benefits page and Levels.fyi's proprietary compensation percentile ranking. Deduplicated per company.

## `maxResults` (type: `integer`):

Total cap across all queries. Levels.fyi hosts 70,000+ open tech jobs across all filters at any time.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per keyword/URL. Because Levels.fyi's SSR returns 5 companies x 3 jobs = 15 rows per page and 15 jobs per company on company-scoped pages, deeper crawls page across job-family and company URLs.

## `maxConcurrency` (type: `integer`):

Maximum concurrent detail-page requests (only used when includeJobDetails or includeCompanyDetails is true).

## Actor input object example

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "location": "san-francisco-bay-area",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped US tech opportunities with Levels.fyi's proprietary compensation and level data.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "software engineer"
    ],
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/levels-fyi-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["software engineer"],
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/levels-fyi-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "software engineer"
  ],
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/levels-fyi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/levels-fyi-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fHuCP5HwRpEbCVvvd/builds/tVnTggIhHuJT3Dkea/openapi.json
