# H1B Salary Scraper: Employers, Jobs & Pay Data (`recordsdata/h1b-salaries-scraper`) Actor

Scrape H1B visa salary data from public DOL LCA filings: employer, job title, base salary, city, dates and per-employer median, average and max pay. Fiscal years 2012-2026. Export CSV, Excel, JSON or XML. No login or API key. Netflix 2026 returns 2,157 filings.

- **URL**: https://apify.com/recordsdata/h1b-salaries-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 salary filings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

## 💼 H1B Salary Scraper: Employers, Jobs & Pay Data

> H1B Salary Scraper pulls US Department of Labor LCA filings from two sources: the fast h1bdata.info search (certified filings, fiscal years 2012 to 2026) or the official DOL OFLC disclosure workbooks (fiscal years 2020 to 2026, all case statuses, up to 74 fields per filing). Filter by employer, job title, city, state, salary band, visa class, wage level or SOC code and get one row per filing plus an optional employer summary of minimum, median, average and maximum pay. Export CSV, Excel, JSON or XML. No login, no API key. Priced $0.01 per filing, verified 2026-10-10.

The **H1B salary scraper** turns an employer, job title, city or state search into a spreadsheet of real, employer-stated wages, for job seekers, recruiters, compensation teams, immigration attorneys and researchers. A DOL-source run for Google, fiscal year 2025, California matched 5,634 filings with a median base salary of $186,000.

### 📋 What does the H1B Salary Scraper do?

- Looks up H1B salary data by one or several employers, with filters for job title, city, state, yearly salary band and case status.
- Two sources in one actor: `h1bdata` (default, fast, certified filings only) and `dol` (official Department of Labor files, including withdrawn and denied cases).
- DOL source only: fiscal quarter, visa class, prevailing wage level I to IV, H-1B dependent employers, SOC code prefix and employer name match.
- Converts hourly, weekly, bi-weekly and monthly wages to a yearly figure on DOL rows, keeping the raw wage and unit.
- Adds an optional employer summary row with filing count, minimum, median, average, maximum salary and top job titles.

### 📊 What data can you extract from H1B LCA filings?

The dataset schema has 77 typed properties and four views. h1bdata fills about a dozen; DOL fills up to 74.

| Group | Fields |
|---|---|
| Row basics | `recordType`, `employerSearched`, `employer`, `jobTitle`, `baseSalary`, `location`, `city`, `state`, `submitDate`, `startDate`, `caseStatus`, `year`, `quarter`, `source` |
| Case and visa (DOL) | `caseNumber`, `visaClass`, `decisionDate`, `originalCertDate`, `endDate`, `socCode`, `socTitle`, `fullTimePosition`, `publicDisclosure`, `statutoryBasis` |
| Positions (DOL) | `totalWorkerPositions`, `newEmployment`, `continuedEmployment`, `changePreviousEmployment`, `newConcurrentEmployment`, `changeEmployer`, `amendedPetition` |
| Employer and worksite (DOL) | `tradeName`, `employerCity`, `employerState`, `employerPostalCode`, `employerCountry`, `employerFein`, `naicsCode`, `agentRepresentingEmployer`, `lawFirmName`, `worksiteCounty`, `worksitePostalCode`, `worksiteWorkers`, `secondaryEntity`, `secondaryEntityName`, `totalWorksiteLocations` |
| Wages (DOL) | `wageFrom`, `wageTo`, `wageUnit`, `annualizedWageTo`, `prevailingWage`, `prevailingWageUnit`, `annualizedPrevailingWage`, `wageLevel`, `abovePrevailingWagePercent`, `oesYear` |
| Prevailing wage source (DOL) | `pwOtherSource`, `pwOtherYear`, `pwSurveyPublisher`, `pwSurveyName` |
| Flags (DOL) | `h1bDependent`, `willfulViolator`, `supportH1b` |
| Summary row | `filings`, `minSalary`, `medianSalary`, `averageSalary`, `maxSalary`, `topJobTitles`, `summaryFilesScanned`, `summaryFilesTotal`, `summaryComplete` |
| Always | `sourceUrl`, `scrapedAt`; error rows add `error`, `errorType`, `hint` |

Fields that do not apply to a row are omitted, not left empty. Employer and attorney contact names, phones, emails, preparer fields and street addresses are not output on purpose, because they can identify private individuals.

### 🧾 Sample output

Rows shortened to the main fields, from a DOL-source run on 2026-10-10 (Google, fiscal year 2025, California).

```json
{
  "recordType": "salary",
  "source": "dol",
  "employer": "Google LLC",
  "jobTitle": "Technical Program Manager",
  "baseSalary": 212000,
  "city": "Sunnyvale",
  "state": "CA",
  "caseNumber": "I-200-25266-329244",
  "submitDate": "2025-09-23",
  "startDate": "2026-03-18",
  "year": "2025"
}
```

Summary row of the same run (salary at most $250,000):

```json
{
  "recordType": "employer-summary",
  "source": "dol",
  "filings": 5634,
  "medianSalary": 186000,
  "summaryFilesScanned": 4,
  "summaryFilesTotal": 4,
  "summaryComplete": true
}
```

### 💵 How much does it cost to scrape H1B salary data?

Pay per event, no subscription. Live prices, the same on every Apify plan tier:

| Event | Price |
|---|---|
| Salary filing (one row, either source) | $0.01 ($10 per 1,000) |
| Employer salary summary (one per search, optional) | $0.02 |

A 10-filing run with the summary costs $0.12. A 1,000-filing run costs 1,000 x $0.01 = $10.00, or $10.02 with a summary. DOL rows use the same filing price. Rows with errors, searches with no matches, invalid input and runs that fail are not charged. Set a maximum total charge in the run options and the Actor stops cleanly when it is reached. Free users get a 10-row preview.

### 🚀 How to scrape H1B salaries in 3 steps

1. Click **Try for free**, pick the data source and enter employers (or a job title, city or state).
2. Choose the fiscal year.
3. Click **Start** and download the dataset as CSV, Excel, JSON or XML.

### ⚙️ Input

| Field | Default | Meaning |
|---|---|---|
| `dataSource` | `h1bdata` | `h1bdata` or `dol` |
| `employers` | \["Google"] | Company names, one search each |
| `jobTitle`, `city` | empty | Job title keyword and worksite city |
| `state` | any | Worksite state or territory (two letters) |
| `year` | 2026 | Fiscal year, or "All Years" (DOL: 2020 to 2026) |
| `maxItems` | 10 | Maximum salary rows (summary rows not counted) |
| `minSalary`, `maxSalary` | 0 | Yearly salary band, 0 = no bound |
| `caseStatus` | any | Certified, certified-withdrawn, withdrawn, denied (last three need DOL) |
| `includeEmployerSummary` | true | Add the per-employer statistics row |
| `quarter` / `visaClass` | any | DOL only: fiscal quarter 1 to 4; H-1B, H-1B1 Chile, H-1B1 Singapore, E-3 Australian |
| `wageLevel` / `h1bDependent` | any | DOL only: wage level I, II, III, IV or N/A; dependent employer yes or no |
| `socCode` | empty | DOL only: SOC prefix such as 15-1252 or 15-1 |
| `employerMatch` | contains | DOL only: contains, startsWith or exact legal name |

With h1bdata, `state`, `minSalary`, `maxSalary` and `caseStatus` run client-side on the downloaded table; with DOL they run before a row is built. Using a DOL-only field with h1bdata stops the run with a free error row that says so.

```json
{ "dataSource": "dol", "employers": ["Google"], "year": "2025", "state": "CA", "maxSalary": 250000, "maxItems": 5 }
```

Provide at least one employer or another filter, otherwise the run ends as SUCCEEDED with one free error row (`errorType: invalid-input`) and nothing is charged.

### 📦 Output

One dataset with four views: salary rows first, then the employer summary row when enabled. Dates are MM/DD/YYYY in h1bdata rows and ISO (YYYY-MM-DD) in DOL rows. If a search matches nothing, the run finishes with a status message and zero charge. If the source layout changes or the site is unreachable, the run fails instead of reporting an empty success.

#### How fast is it, and what is slow?

h1bdata runs finish in seconds (about 10 seconds for 10 rows). The DOL source reads quarterly workbooks of 53 to 290 MB, so a four-file fiscal year scan took about 80 to 140 seconds. The worst case is "All Years" with an employer that matches few or no filings: the actor must read all 25 files, which can take up to about 14 minutes. Choose a year or quarter to avoid it.

### 📈 H1B salary scraper vs alternatives

Read from the public Apify Store pages on 2026-10-10:

| Capability | This Actor | scrapesage | pink_comic |
|---|---|---|---|
| Source | h1bdata.info or official DOL files | h1bdata.info index of DOL data | Official DOL workbooks |
| Employer summary row | Yes, min, median, average, max | Yes, with percentiles | Not stated in their listing |
| Only-new monitoring | Not offered | Yes, monitor mode | Not stated in their listing |
| Contact names and emails | Not output on purpose | Yes, from the filing | Not output |
| Price per filing | $0.01 | $0.004 | $0.002 |

Other H1B actors on the Store: haketa ($0.005 per item, optional live WARN layoff check), inexhaustible_glass ($0.005), nexgendata ($0.05, opt-in email and SEC add-ons). Several are cheaper per row, and scrapesage adds monitoring and contact data that we leave out. We fit better for official DOL fields (denied cases, wage level, annualized pay) or a summary row, with free failed and empty runs. If you only need cheap rows or contacts, pick a rival.

### 💼 Use cases

Salary negotiation, compensation benchmarking, recruiting research and wage evidence for immigration cases.

### 🔌 Run via API and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/recordsdata~h1b-salaries-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"employers":["Netflix"],"year":"2026","maxItems":10}'
```

Works with the Apify API, Python and JavaScript clients, schedules, webhooks, Zapier, Make, n8n and Google Sheets. There is no only-new mode, so a scheduled run returns the same filings again.

### ⚖️ Is it legal to scrape H1B salary data?

LCA disclosure data is published by the US Department of Labor and is public by law. This Actor reads the public h1bdata.info pages and DOL disclosure files politely and exports no worker names. You remain responsible for the source terms and local law.

### 🤖 H1B Salary Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/h1b-salaries-scraper`, which loads only this Actor as a tool.

Add this to your MCP client configuration (Claude Desktop, Cursor, VS Code):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/h1b-salaries-scraper"
    }
  }
}
```

Example agent prompt:

> Use the H1B Salary Scraper with the DOL source to find fiscal year 2025 H1B filings for Google in California under $250,000, include the employer summary, and tell me the median base salary.

Tool description: choose this Actor when an agent needs employer-filed H1B wage data (base salary, wage level, SOC code, case status, location, dates and median statistics) rather than self-reported estimates. The tool takes the same fields as the Input table.

### ❓ Frequently asked questions

#### 💼 How do I look up H1B salaries by company?

Enter the company name in the Employers field of the H1B Salary Scraper, choose a fiscal year and click Start. You get one dataset row per filing, with employer, job title, base salary, worksite location and submit and start dates. Add a job title, city or state to narrow results.

#### 💵 Are the H1B Salary Scraper salaries real?

Yes. The H1B Salary Scraper returns the base salaries that employers stated on LCA filings to the US Department of Labor, through h1bdata.info or straight from the DOL files, not survey guesses. Each row keeps a `sourceUrl`, and DOL rows carry the case number so you can check them.

#### 🗓 Which fiscal years does the H1B Salary Scraper cover?

The h1bdata source covers fiscal years 2012 to 2026, or all years with "All Years", but it holds very little 2024 data, so 2022, 2023, 2025 and 2026 work best. The DOL source covers fiscal year 2020 Q1 to fiscal year 2026 Q1 (25 workbooks). The default year is 2026.

#### 🏙 Can I combine employer, job title and city in the H1B Salary Scraper?

Yes. The scraper applies the employer, job title, city and state filters together in one search, for example Software Engineer in Seattle at a chosen company. You need at least one filter. Set `minSalary` and `maxSalary` to keep only filings inside a yearly salary band.

#### 📊 How is the H1B median salary calculated?

The optional employer summary row is calculated across every filing the search matched, not only the rows you export. With h1bdata, `maxItems` does not change it. With the DOL source the same holds only when the scan finishes inside the bound described below, and `summaryComplete` tells you whether it did.

#### 🔢 Why did the H1B Salary Scraper return 0 results?

The search matched nothing, for example a misspelled employer name, a state with no filings for that employer, or a fiscal year with sparse data. Try a shorter employer name or another year. A run with no matches finishes with a status message, saves no rows and costs nothing.

#### 💸 Do I pay for the H1B Salary Scraper summary if it is off?

No. The employer salary summary is a separate $0.02 event, billed once per search and only when `includeEmployerSummary` is enabled and a summary row is actually produced. With it off you pay only the $0.01 per salary filing, and rows with errors are never charged.

#### 🧯 What happens if I send an empty or invalid input to the H1B Salary Scraper?

Wrong values for dropdowns or number fields are rejected by the Apify platform with a 400 error before any run starts. Valid but unusable inputs, such as no filter at all, a DOL-only filter with h1bdata or a minimum salary above the maximum, end as SUCCEEDED with one free error row and no charge.

#### ⚙️ Does the H1B Salary Scraper need an API key or login?

No. The H1B Salary Scraper reads public pages and public DOL files, so it needs no login and no API key. You only need an Apify account to run it and export the data as CSV, Excel, JSON or XML. It exports no worker names, only public LCA disclosure fields.

#### 📦 How many H1B filings can one scraper run return?

One run can return up to 1,000,000 salary filings on paid Apify plans, controlled by the `maxItems` field, which defaults to 10. Free Apify users get a 10-row preview. You can also set a maximum total charge in the run options and the actor stops cleanly when it is reached.

#### 🏛 Which source should I choose, h1bdata or DOL?

Use h1bdata for quick salary lookups: certified filings in seconds with about a dozen fields. Use the DOL source when you need denied or withdrawn cases, wage level, prevailing wage, SOC code, visa class, FEIN or NAICS. DOL runs read large files and take minutes, so set a year or quarter.

#### 🧮 How is the annualized wage calculated?

On DOL rows `baseSalary` is the offered wage-from value as a yearly integer: year x1, month x12, bi-weekly x26, week x52, hour x2,080. The raw `wageFrom` and `wageUnit` stay in the row, so a $33.63 hourly wage shows as $69,950 a year. Check `wageUnit` before trusting outliers.

#### 📉 Is the employer summary always complete on the DOL source?

Not always. With the summary on, the actor reads at most four more quarterly files after `maxItems` is reached. If the scan finishes inside that bound the summary is exact (`summaryComplete` true). Otherwise the row is still delivered with `summaryComplete` false; raise `maxItems` for a complete summary.

#### 🔒 What data does the H1B Salary Scraper not output?

It leaves out employer and attorney contact names, phones and emails, preparer fields and street addresses, because they can identify private individuals. It also adds no WARN layoff checks or SEC company data. You still get the law firm name and employer and worksite city, state, county and postal code.

### 🆘 Support

Questions or custom needs: Issues tab or contact.punkrecordsdata@gmail.com.

> **⚠️ Disclaimer:** independent tool, not affiliated with the US Department of Labor or h1bdata.info. It exports only publicly available disclosure data.

Last updated: 2026-10-11

# Actor input Schema

## `dataSource` (type: `string`):

h1bdata.info = fast salary search (certified filings, 6 fields, fiscal years 2012 to 2026). DOL OFLC files = the official Labor Condition Application disclosure data straight from the US Department of Labor: 60+ fields per filing, all case statuses (certified, denied, withdrawn), prevailing wage and wage level, SOC code, visa class, FEIN, NAICS. DOL covers fiscal years 2020 to 2026 and reads whole quarterly files, so broad searches take longer.

## `employers` (type: `array`):

Company names to search on H1B LCA filings, one search per employer (e.g. Google, Microsoft, Deloitte). Combine with job title, city and state. Leave empty only if you set another filter (job title, city, state and so on).

## `jobTitle` (type: `string`):

Filter H1B salary filings by job title keyword (e.g. Software Engineer, Data Scientist). Optional.

## `city` (type: `string`):

Filter H1B salary filings by work city (e.g. New York, Seattle). Optional.

## `state` (type: `string`):

Keep only filings whose worksite is in this US state or territory. Applied after the search, so it also works together with the h1bdata.info source. Leave on Any state for no filter.

## `year` (type: `string`):

LCA filing fiscal year (October to September). h1bdata.info source: 2012 to 2026 (the source has very little 2024 data; 2022, 2023, 2025 and 2026 are fully populated). DOL source: 2020 to 2026 or All years; FY2026 holds the quarters the DOL has published so far.

## `maxItems` (type: `integer`):

Maximum number of salary filing rows to export per run (1 to 1,000,000). Free users are limited to 10. The employer summary row is separate and not counted.

## `minSalary` (type: `integer`):

Skip filings below this annual base salary. With the DOL source, hourly, weekly, bi-weekly and monthly wages are first converted to a yearly figure (hour x 2,080, week x 52, bi-weekly x 26, month x 12). 0 = no minimum.

## `maxSalary` (type: `integer`):

Skip filings above this annual base salary. Same yearly conversion as the minimum. 0 = no maximum.

## `caseStatus` (type: `string`):

Keep only filings with this outcome. h1bdata.info lists certified filings only, so denied, withdrawn and certified-withdrawn need the DOL source. Leave on Any status for no filter.

## `includeEmployerSummary` (type: `boolean`):

One extra row per employer search: filing count, min/median/average/max base salary and top job titles, computed over all matched filings. Billed as its own event. With the DOL source, after maxItems is reached the actor reads at most 4 more quarterly files to feed the summary: the numbers are exact only when the scan finishes inside that bound (summaryComplete is true, summaryFilesScanned equals summaryFilesTotal). Otherwise the row is still delivered with summaryComplete false and the files counts; raise maxItems for a complete summary. Turn it off to stop right at maxItems.

## `quarter` (type: `string`):

Read only one fiscal quarter of the DOL files (Q1 = October to December). Leave on All quarters for the whole year. Only valid with the DOL source.

## `visaClass` (type: `string`):

Keep only one visa class. Only valid with the DOL source.

## `wageLevel` (type: `string`):

Keep only filings at this prevailing wage level (I = entry, IV = fully experienced). Only valid with the DOL source.

## `socCode` (type: `string`):

Keep only filings whose SOC code starts with this value, e.g. 15-1252 (software developers), 15-1 (computer occupations) or 29 (healthcare practitioners). Only valid with the DOL source.

## `h1bDependent` (type: `string`):

Keep only filings by H-1B dependent employers (yes) or by employers that are not dependent (no). Only valid with the DOL source.

## `employerMatch` (type: `string`):

How the employer names you entered are compared with the legal employer name in the DOL files (case and punctuation are ignored). Contains finds Google in GOOGLE LLC and in subsidiaries; exact needs the full legal name. Only valid with the DOL source.

## Actor input object example

```json
{
  "dataSource": "h1bdata",
  "employers": [
    "Google"
  ],
  "jobTitle": "",
  "city": "",
  "state": "",
  "year": "2026",
  "maxItems": 10,
  "minSalary": 0,
  "maxSalary": 0,
  "caseStatus": "",
  "includeEmployerSummary": true,
  "quarter": "",
  "visaClass": "",
  "wageLevel": "",
  "socCode": "",
  "h1bDependent": "",
  "employerMatch": "contains"
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per filing

## `fullData` (type: `string`):

Complete dataset with all fields

# 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 = {
    "employers": [
        "Google"
    ],
    "jobTitle": "",
    "city": "",
    "maxItems": 10,
    "socCode": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/h1b-salaries-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 = {
    "employers": ["Google"],
    "jobTitle": "",
    "city": "",
    "maxItems": 10,
    "socCode": "",
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/h1b-salaries-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 '{
  "employers": [
    "Google"
  ],
  "jobTitle": "",
  "city": "",
  "maxItems": 10,
  "socCode": ""
}' |
apify call recordsdata/h1b-salaries-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/h1b-salaries-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/qJ6XENGNmcMknul8p/builds/G1gnXsIaAcam2mO4x/openapi.json
