# H-1B Visa Sponsorship Salary Data: PERM & Prevailing Wage (`conserving_celerytop/h1b-perm-salary-data`) Actor

H-1B salary data and PERM prevailing wages from the US Department of Labor public LCA and PERM disclosure files: employer, job title, offered wage, prevailing wage, work location and decision date. Filter by company, title, state and year, or get summaries. $2 per 1,000 cases. No login.

- **URL**: https://apify.com/conserving\_celerytop/h1b-perm-salary-data.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Categories:** Jobs, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 salary records

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?

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

For AI agents: pass jobTitles, employers, socCodes, states, cities, fiscalYears and programs (lca, perm); get one JSON row per H-1B, E-3 or PERM case with employer, job title, SOC code, offered wage converted to a yearly amount, prevailing wage and wage level, or set outputMode to summary for median and percentile salaries per job and state.

Cost: $0.002 per case row ($2 per 1,000) and $0.02 per summary row. Rows left out by your filters are free. No login or API key.

### What does H-1B & PERM Salary Data do?

It reads the official public disclosure files of the US Department of Labor, Office of Foreign Labor Certification, and returns the salaries employers filed for foreign workers:

- **LCA (H-1B, H-1B1 and E-3)**: every labor condition application with the offered wage, the prevailing wage and its level (I to IV), fiscal year 2020 onward.
- **PERM (green card)**: permanent labor certifications with the offered wage range, fiscal year 2024 onward.

Each row has the case number, status, decision date, employer, employer city and state, NAICS industry code, job title, SOC occupation code and title, full-time flag, offered wage and unit, the wage converted to a yearly amount, the prevailing wage, and the worksite city, county, state and postal code.

The data comes only from dol.gov, not from third-party salary sites, and it is read fresh on every run, so new quarters appear as soon as DOL publishes them.

- **Job seekers and people on a visa** check what employers really pay for a role and city before an offer or a negotiation.
- **Recruiters and HR teams** benchmark pay by job title, SOC code and state, and see what competitors file.
- **Immigration attorneys and employers** compare offered wages with prevailing wages and levels.
- **Analysts, journalists and researchers** pull clean tables without opening 250 MB spreadsheets.
- **AI agents** call it through the Apify API or Apify's MCP server.

**Try it now.** The form opens with 50 certified H-1B software engineer salaries in Washington State from the latest fiscal year. Click **Start**; it takes a few seconds and costs about $0.10.

### Salary summary: median and percentiles

Set **Output** to **Summary** and choose how to group: SOC code and state, job title and state, SOC code, job title, employer, or employer and job title. Each row gives the number of cases and employers, the median, 25th, 75th and 90th percentile annual wage, the lowest and highest wage seen, and the median prevailing wage. Groups with fewer cases than **Minimum cases per group** (3 by default) are left out. For example: the median H-1B salary of software developers (SOC 15-1252) in every state, or the PERM salary range of the 20 largest green card sponsors.

### Input

| Field | What it does |
|---|---|
| Programs | LCA (H-1B, H-1B1, E-3), PERM (green card), or both |
| Job title keywords | Words to find in the job title, any one of them |
| Employers | Company names or parts of them |
| SOC codes | Occupation codes such as 15-1252, or a prefix such as 15-12 |
| Worksite states and cities | Two-letter state codes; city names as filed |
| Fiscal years and quarters | US federal fiscal year (October to September); empty means the latest year |
| Visa classes | H-1B, H-1B1 Chile, H-1B1 Singapore, E-3 Australian |
| Case status | Certified by default; also Certified - Withdrawn, Certified - Expired, Denied, Withdrawn |
| Prevailing wage levels | I to IV |
| Full-time only | Leave out part-time positions |
| Minimum and maximum annual wage | In US dollars, after conversion to a yearly amount |
| Output | Cases, or summary |
| Maximum results | Case rows or summary rows, up to 100,000 |

Example:

```json
{
  "programs": ["lca"],
  "jobTitles": ["data scientist"],
  "states": ["NY"],
  "fiscalYears": ["2025"],
  "minAnnualWage": 120000,
  "maxResults": 500
}
```

### Output

One row per case (view **Cases**):

```json
{
  "rowType": "case",
  "program": "LCA",
  "caseNumber": "I-200-25266-329529",
  "caseStatus": "Certified",
  "visaClass": "H-1B",
  "decisionDate": "2025-09-30",
  "fiscalYear": 2025,
  "fiscalQuarter": 4,
  "employerName": "Pipe Technologies Inc.",
  "employerCity": "SAN FRANCISCO",
  "employerState": "CA",
  "naicsCode": "541511",
  "jobTitle": "Data Scientist",
  "socCode": "15-2051.00",
  "socTitle": "Data Scientists",
  "fullTime": true,
  "wageFrom": 169541,
  "wageTo": 220000,
  "wageUnit": "Year",
  "annualWage": 169541,
  "annualWageTo": 220000,
  "annualPrevailingWage": 169541,
  "pwWageLevel": "IV",
  "worksiteCity": "LONG ISLAND CITY",
  "worksiteState": "NY",
  "worksitePostalCode": "11101",
  "sourceFile": "LCA_Disclosure_Data_FY2025_Q4.xlsx"
}
```

Summary rows (view **Salary summary**) have `cases`, `employers`, `medianAnnualWage`, `p25AnnualWage`, `p75AnnualWage`, `p90AnnualWage`, `minAnnualWageSeen`, `maxAnnualWageSeen` and `medianAnnualPrevailingWage` for each group. Download as JSON, CSV or Excel, or read the dataset through the API. A **STATS** record lists the files read, rows scanned, rows delivered and any warnings.

### How wages are converted

Yearly wages are used as filed. Monthly wages are multiplied by 12, bi-weekly by 26, weekly by 52 and hourly by 2,080 (40 hours a week). `annualWage` uses the lower end of the offered range and `annualWageTo` the upper end. A converted amount above $3,000,000 is a filing error (usually a yearly salary entered as hourly), so it is left empty and such cases do not count in summaries.

### Personal data

The DOL files also name employer contacts, attorneys, agents and preparers, with their e-mail addresses and phone numbers. This Actor never reads or returns those columns, nor street addresses or tax IDs. Cases whose employer name looks like a private person, and PERM cases for live-in household work, are left out. A few small organisations whose name looks like a person's may be left out too.

### Good to know

- **Fiscal years.** The US federal fiscal year 2026 runs from 1 October 2025 to 30 September 2026. DOL publishes a new file each quarter, a few weeks after the quarter ends.
- **One row per case.** An LCA can cover several positions and worksites; the file lists the main worksite. The same case is returned once even when it appears in two files.
- **Offered, not paid.** The wage is what the employer filed, which is at least the prevailing wage. It is not the final paid salary, bonus or equity.
- **Certified - Withdrawn** means the employer withdrew a case after certification. Leave it out (the default) for the cleanest salary picture.
- **Speed.** Case searches stop reading as soon as **Maximum results** is reached, usually in a few seconds. A summary reads the whole year, about 25 seconds for a full year of LCA cases.

### FAQ

**Is this the same data as H-1B salary websites?** Those sites republish these DOL files. This Actor reads the DOL files directly, so it is as current as DOL, and you choose the filters and the columns.

**Does it show whether an H-1B petition was approved?** No. DOL certifies the labor condition application; the petition itself is decided by USCIS, which is a different data set.

**Can I get all cases of a company?** Yes: put the company in **Employers**, empty the job title keywords and raise **Maximum results**.

**Is it legal to use?** The files are public records published by the US Department of Labor for anyone to download. This Actor returns no personal contact data.

### Support

Open an issue on the Actor's Issues tab. Include the run ID and what you expected; I usually answer within a day.

# Actor input Schema

## `programs` (type: `array`):

LCA covers H-1B, H-1B1 and E-3 labor condition applications (fiscal year 2020 on). PERM covers green card labor certifications (fiscal year 2024 on).

## `jobTitles` (type: `array`):

Words to find in the job title, such as software engineer or data scientist. A case matches when its title contains any one of them.

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

Company names or parts of them, such as Google or Amazon. A case matches when the employer name contains any one of them.

## `socCodes` (type: `array`):

Occupation codes such as 15-1252 (software developers), or a prefix such as 15-12 or 15.

## `states` (type: `array`):

Two-letter codes such as CA, NY or TX (full names work too).

## `cities` (type: `array`):

City names as filed, such as Seattle or New York. Exact match, not case sensitive.

## `fiscalYears` (type: `array`):

US federal fiscal years, such as 2026 (October 2025 to September 2026). Empty: the latest year DOL has published.

## `quarters` (type: `array`):

Limit to quarters of the fiscal year by decision date. Q1 is October to December. Empty: all quarters.

## `visaClasses` (type: `array`):

Empty: all visa classes.

## `caseStatuses` (type: `array`):

Certified by default. Certified - Withdrawn means the employer withdrew a certified case.

## `wageLevels` (type: `array`):

Level I is entry level, IV is fully competent. Empty: all levels.

## `fullTimeOnly` (type: `boolean`):

Leave out part-time positions.

## `minAnnualWage` (type: `integer`):

Offered wage converted to a yearly amount (hourly times 2,080).

## `maxAnnualWage` (type: `integer`):

Offered wage converted to a yearly amount.

## `outputMode` (type: `string`):

Cases: one row per case. Summary: median, 25th, 75th and 90th percentile annual wage per group.

## `groupBy` (type: `string`):

Used in summary mode.

## `minCasesPerGroup` (type: `integer`):

Groups with fewer cases are left out.

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

Case rows, or summary rows in summary mode.

## Actor input object example

```json
{
  "programs": [
    "lca"
  ],
  "jobTitles": [
    "software engineer"
  ],
  "states": [
    "WA"
  ],
  "caseStatuses": [
    "Certified"
  ],
  "fullTimeOnly": false,
  "outputMode": "cases",
  "groupBy": "socState",
  "minCasesPerGroup": 3,
  "maxResults": 50
}
```

# Actor output Schema

## `cases` (type: `string`):

One row per case: employer, job title, SOC code, annual wage, prevailing wage, wage level, worksite and dates.

## `summary` (type: `string`):

Summary mode: median, 25th, 75th and 90th percentile annual wage per group.

## `stats` (type: `string`):

JSON record with rows scanned, delivered and charged, files read, time, warnings and errors.

# 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 = {
    "programs": [
        "lca"
    ],
    "jobTitles": [
        "software engineer"
    ],
    "states": [
        "WA"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/h1b-perm-salary-data").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 = {
    "programs": ["lca"],
    "jobTitles": ["software engineer"],
    "states": ["WA"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/h1b-perm-salary-data").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 '{
  "programs": [
    "lca"
  ],
  "jobTitles": [
    "software engineer"
  ],
  "states": [
    "WA"
  ],
  "maxResults": 50
}' |
apify call conserving_celerytop/h1b-perm-salary-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/h1b-perm-salary-data"
        }
    }
}
```

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/Iq4SFamLgchHARwzY/builds/tXY7YNMfojJB1aX3n/openapi.json
