# Levels.fyi Scraper (Tech Salary & Total Compensation) (`scrapers_lat/levels-fyi-scraper`) Actor

Scrape levels.fyi crowdsourced tech compensation by company, role and location. Get total comp, base salary, stock, bonus, level, years of experience and per-level medians. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/levels-fyi-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (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 $14.18 / 1,000 compensation records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 (Tech Salary & Total Compensation)](https://scrapers.lat/banners/levels-fyi-scraper.png)](https://console.apify.com/actors/6jhgyU6SeCMnDkb7P/input)

## Levels.fyi Scraper (Tech Salary & Total Compensation)

Here is one real result, with every field the actor returns:

```json
{
  "uuid": "8b8eec02-082a-4f64-88b2-c236feff29cc",
  "company": "Google",
  "companySlug": "google",
  "title": "Software Engineer",
  "jobFamily": "Software Engineer",
  "role": "software-engineer",
  "level": "L3",
  "standardizedLevel": "L3",
  "focusTag": "Full Stack",
  "location": "New York, NY",
  "yearsOfExperience": 1,
  "yearsAtCompany": 1,
  "totalCompensation": 170000,
  "baseSalary": 150000,
  "stockGrantValue": 20000,
  "bonus": 0,
  "currency": "USD",
  "gender": null,
  "submittedDate": "2026-07-22T18:14:36.336+00:00",
  "levelMedianTotalComp": 210772,
  "levelMedianBase": 165524,
  "levelMedianStock": 34036,
  "levelMedianBonus": 11212,
  "levelSampleCount": 42,
  "companyMedianTotalComp": 287499,
  "companyLevelMedians": "L3:208961(1112);L4:289516(835);L5:412916(723);L6:643531(229);L7:954705(64);L8:1105136(11);L9:1786800(5)",
  "aiMarketPosition": "below median for this level",
  "aiNegotiationTips": [
    "Highlight your unique skills and contributions",
    "Research comparable offers from other companies",
    "Consider negotiating for additional stock options",
    "Be prepared to discuss your performance and impact"
  ],
  "aiLevelEquivalents": "Facebook E3, Amazon L4, Microsoft SDE II",
  "aiSummary": "The total compensation for this L3 Software Engineer position at Google is below the median for similar roles.",
  "pageUrl": "https://www.levels.fyi/companies/google/salaries/software-engineer",
  "source": "levels.fyi",
  "observedAt": "2026-08-20T10:30:25.993Z"
}
```

The most complete tech compensation scraper available. It returns every field a crowdsourced salary submission exposes (company, title, level, focus area, location, years of experience, and the full base salary, stock and bonus breakdown behind each total comp figure), plus derived per-level medians, optional company benchmark tables and an optional AI compensation insight, and gives you four filters to target exactly the records you need.

**📥 [Input](https://apify.com/scrapers_lat/levels-fyi-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/levels-fyi-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/levels-fyi-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/levels-fyi-scraper/examples)**

![Platform](https://img.shields.io/badge/platform-Apify-5c5cff) ![Coverage](https://img.shields.io/badge/coverage-tech%20compensation-2ea44f) ![Output](https://img.shields.io/badge/output-JSON%20%7C%20CSV%20%7C%20Excel-1f6feb) ![Billing](https://img.shields.io/badge/billing-pay%20per%20result-orange)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)
- [More scrapers at scrapers.lat](#more-scrapers-at-scraperslat)

### What it does

This actor collects crowdsourced tech total-compensation records by company, role and location. Each record is one real submission with the money split out: total compensation, base salary, annual stock grant value and bonus, tied to the company level (for example L5 or SDE II), the focus area (ML / AI, Backend, Mobile), the location, and the submitter's years of experience and years at the company.

Every record also carries the per-level medians for its role (median total comp, base, stock and bonus, plus the sample size behind them), so you can see instantly whether an offer sits above or below the level. Two optional add-ons go further: company benchmarks attach the company-wide median and the full per-level median table, and an AI compensation insight adds a market-position read, negotiation tips, comparable levels at other companies and a one-line summary.

Use it for compensation benchmarking, recruiting and sourcing, offer negotiation, and market research.

### Quickstart

Give it at least a company or a role. Example input:

```json
{
  "company": "Google",
  "role": "Software Engineer",
  "location": "New York",
  "minTotalComp": 200000,
  "maxResults": 25
}
```

- Company and role together pull that role at that company (richest, most records).
- Company only pulls every role at that company.
- Role only pulls the top-paying companies for that role.

### Input reference

| Name | Type | Required | Description | Example |
| --- | --- | --- | --- | --- |
| `company` | string | one of company/role | Company to pull compensation for | `Google` |
| `role` | string | one of company/role | Job family to filter by | `Software Engineer` |
| `location` | string | no | Keep only records whose location contains this text | `New York` |
| `minTotalComp` | integer | no | Keep only records with total comp at or above this USD amount | `200000` |
| `maxResults` | integer | no | Max records to collect in the run (free plans capped at 10) | `25` |
| `companyBenchmarks` | boolean | no | Paid add-on, off by default. Attach the company per-level median table and company-wide median | `false` |
| `aiCompInsight` | boolean | no | Paid add-on, off by default. Add AI market position, negotiation tips, level equivalents and summary | `false` |

### Output reference

| Name | Type | Description |
| --- | --- | --- |
| `uuid` | string | Unique id of the compensation submission |
| `company` | string | Company name |
| `companySlug` | string | Company slug |
| `title` | string | Job title |
| `jobFamily` | string | Job family (role track) |
| `role` | string | Role slug used for the query |
| `level` | string | Company level name, for example L5 or SDE II |
| `standardizedLevel` | string | Standardized ladder level name |
| `focusTag` | string | Focus area, for example ML / AI, Backend, Mobile |
| `location` | string | Location (city, region) |
| `yearsOfExperience` | integer | Total years of experience |
| `yearsAtCompany` | integer | Years at the company |
| `totalCompensation` | integer | Total compensation in USD |
| `baseSalary` | integer | Base salary in USD |
| `stockGrantValue` | integer | Average annual stock grant value in USD |
| `bonus` | integer | Average annual bonus in USD |
| `currency` | string | Compensation currency (USD) |
| `gender` | string | Self-reported gender when public |
| `submittedDate` | string | Offer / submission date |
| `levelMedianTotalComp` | integer | Median total comp for this level and role |
| `levelMedianBase` | integer | Median base salary for this level and role |
| `levelMedianStock` | integer | Median stock grant for this level and role |
| `levelMedianBonus` | integer | Median bonus for this level and role |
| `levelSampleCount` | integer | Number of samples behind the level medians |
| `companyMedianTotalComp` | integer | Company-wide median total comp (benchmarks add-on) |
| `companyLevelMedians` | string | Per-level median comp table for this role (benchmarks add-on) |
| `aiMarketPosition` | string | AI market-position read (AI add-on) |
| `aiNegotiationTips` | array | AI negotiation tips (AI add-on) |
| `aiLevelEquivalents` | string | AI comparable-level equivalents at other companies (AI add-on) |
| `aiSummary` | string | AI one-line summary (AI add-on) |
| `pageUrl` | string | Source page URL |
| `source` | string | Data source |
| `observedAt` | string | ISO timestamp collected |

### Example output record

See the record at the top of this page, which shows every field populated (including both optional add-ons).

### Run via API and CLI

Start a run with the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~levels-fyi-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"company":"Google","role":"Software Engineer","maxResults":25}'
```

Run with the Apify CLI:

```bash
apify call scrapers_lat/levels-fyi-scraper \
  --input '{"company":"Google","role":"Software Engineer","maxResults":25}'
```

### Fetch results

Download the dataset items once the run finishes:

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_TOKEN&format=json"
```

Swap `format=json` for `format=csv` or `format=xlsx` to export to CSV or Excel.

### Billing and limits

- Pay per result: you are charged for each compensation record returned.
- Events: an actor-start event, the primary compensation-record event, and two optional add-ons (company benchmarks and AI compensation insight) that are off by default and billed only when they return real data.
- Empty and failed runs are never billed.
- Free Apify plans are capped at 10 records per run; the paid add-ons are disabled on free plans.
- The actor respects your run spend limit and stops returning records once it is reached.

### FAQ and troubleshooting

**Do I need a company and a role?** No, at least one is enough. Company plus role gives the most records; role only fans out across the top-paying companies for that role.

**Why are some money fields the same across similar records?** The per-level median fields describe the whole level, so records at the same level and role share them.

**Can I filter by location or pay?** Yes, use `location` for a location contains match and `minTotalComp` for a floor on total compensation.

**Is a login or cookie needed?** No. Anti-bot handling is done for you internally.

**What do the add-ons add?** Company benchmarks add the company-wide median and the full per-level median table. AI compensation insight adds a market-position read, negotiation tips, comparable levels and a summary.

### More scrapers at scrapers.lat

Looking for related data? Browse the full catalog of company, jobs and lead-generation scrapers at [scrapers.lat](https://scrapers.lat).

This is an independent scraper and is not affiliated with, endorsed by, or sponsored by levels.fyi.

# Actor input Schema

## `company` (type: `string`):

Company to pull compensation for, e.g. Google, Meta, Amazon, Microsoft. Provide at least a Company or a Role. With a Company but no Role, all roles at that company are collected.

## `role` (type: `string`):

Job family to filter by, e.g. Software Engineer, Product Manager, Data Scientist. With a Role but no Company, the top-paying companies for that role are collected. Leave empty to include all roles at the given company.

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

Optional location filter. Only keep records whose location text contains this value, e.g. Seattle, New York, San Francisco. Leave empty for all locations.

## `minTotalComp` (type: `integer`):

Only keep records with total compensation at or above this amount in USD. Leave empty for no minimum.

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

Maximum number of compensation records to collect across the whole run. Free Apify plans are capped at 10 per run.

## `companyBenchmarks` (type: `boolean`):

Attach the company per-level median total compensation table and the company-wide median comp to each record. Charged only when real aggregate data is returned. Disabled on free plans.

## `aiCompInsight` (type: `boolean`):

Use AI to add a market-position read, negotiation tips, comparable-level equivalents at other companies and a one-line summary for each record. Charged only when a usable insight is returned. Disabled on free plans.

## Actor input object example

```json
{
  "company": "Google",
  "role": "",
  "maxResults": 10,
  "companyBenchmarks": false,
  "aiCompInsight": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "company": "Google",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/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 = {
    "company": "Google",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/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 '{
  "company": "Google",
  "maxResults": 10
}' |
apify call scrapers_lat/levels-fyi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/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/6jhgyU6SeCMnDkb7P/builds/OrxZjAXdVCojGhLhd/openapi.json
