# H-1B Visa Salary Disclosures Scraper (LCA Wages) (`scrapers_lat/h1b-salary-disclosures-scraper`) Actor

Scrape US H-1B / LCA visa salary disclosures from public DOL filings. Get employer, job title, base salary (USD), city, state and dates. Filter by employer, job title, city, year and min salary. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/h1b-salary-disclosures-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.48 / 1,000 results

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/platform/actors/running/actors-in-store#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

[![H-1B Visa Salary Disclosures Scraper](https://scrapers.lat/banners/h1b-salary-disclosures-scraper.png)](https://console.apify.com/actors/IKAR5aK4tEl6VdfFd/input)

## H-1B Visa Salary Disclosures Scraper

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

```json
{
  "employer": "GOOGLE LLC",
  "jobTitle": "ACCESSIBILITY ANALYST",
  "baseSalary": "105,000",
  "baseSalaryUsd": 105000,
  "location": "MOUNTAIN VIEW, CA",
  "city": "MOUNTAIN VIEW",
  "state": "CA",
  "submitDate": "2024-01-08",
  "startDate": "2024-01-25",
  "year": 2024,
  "caseNumber": "I-200-24008-624300",
  "salaryTrend": [
    { "year": 2023, "count": 5000, "medianSalaryUsd": 151000, "minSalaryUsd": 72000, "maxSalaryUsd": 419000 },
    { "year": 2022, "count": 5000, "medianSalaryUsd": 144000, "minSalaryUsd": 54517, "maxSalaryUsd": 395000 },
    { "year": 2021, "count": 5000, "medianSalaryUsd": 140000, "minSalaryUsd": 66518, "maxSalaryUsd": 398000 }
  ],
  "standardizedRole": "Accessibility Analyst",
  "seniorityLevel": "Mid",
  "jobFamily": "User Experience",
  "salaryBand": "Market",
  "observedAt": "2026-08-19T22:24:43.911Z",
  "error": null
}
```

The most complete H-1B / LCA salary disclosure scraper available. It returns every field the public filing exposes (employer, job title, base salary, work location, submit and start dates), plus derived fields (numeric annualized `baseSalaryUsd`, split `city` and `state`, ISO dates, `year`, DOL `caseNumber`), and gives you five filters (employer, job title, city, year, minimum salary) to target exactly the disclosures you need.

**📥 [Input](https://console.apify.com/actors/IKAR5aK4tEl6VdfFd/input-schema) · 📤 [Output](https://console.apify.com/actors/IKAR5aK4tEl6VdfFd/output-schema) · 💰 [Pricing](https://console.apify.com/actors/IKAR5aK4tEl6VdfFd/pricing) · ▶️ [Examples](https://console.apify.com/actors/IKAR5aK4tEl6VdfFd/examples)**

![Platform](https://img.shields.io/badge/platform-Apify-6C4CF1) ![Coverage](https://img.shields.io/badge/coverage-USA%20H--1B%20%2F%20LCA-2E9BF0) ![Output](https://img.shields.io/badge/output-JSON%20%7C%20CSV%20%7C%20Excel-16A34A) ![Billing](https://img.shields.io/badge/billing-pay%20per%20result-F59E0B)

### 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)
- [Use cases](#use-cases)
- [FAQ and troubleshooting](#faq-and-troubleshooting)
- [More scrapers at scrapers.lat](#more-scrapers-at-scraperslat)

### What it does

US employers that sponsor H-1B workers must file a Labor Condition Application (LCA) with the Department of Labor that discloses the offered wage. This actor extracts those public salary disclosures: for any employer, job title, city or year you get the employer name, job title, base salary, work location and the submit and start dates.

On top of the raw fields it adds analytics-ready derived data: a numeric annualized salary (`baseSalaryUsd`), the location split into `city` and `state`, ISO-formatted dates, the filing `year` and the DOL `caseNumber`. Two optional paid add-ons attach a per-employer multi-year salary trend and AI role normalization.

### Quickstart

Search a company for a given year:

```json
{
  "employer": "Google",
  "year": "2024",
  "maxResults": 100
}
```

Filter to senior compensation only, across all years, for a role in one city:

```json
{
  "jobTitle": "Software Engineer",
  "city": "New York",
  "year": "All Years",
  "minSalary": 200000,
  "maxResults": 250
}
```

### Input reference

| Name | Type | Required | Description | Example |
|------|------|----------|-------------|---------|
| `employer` | string | one of employer / jobTitle / city | Employer / company name to search. | `"Google"` |
| `jobTitle` | string | one of employer / jobTitle / city | Job title to search. | `"Data Scientist"` |
| `city` | string | one of employer / jobTitle / city | Work-location city to filter by. | `"Mountain View"` |
| `year` | string | no | Filing year, or `"All Years"`. Data from 2013 onward. Default `"2024"`. | `"2024"` |
| `minSalary` | integer | no | Only return disclosures with annualized base salary at or above this (USD). | `200000` |
| `maxResults` | integer | no | Max records to return. Default `100`. Free accounts capped at 10. | `100` |
| `multiYearHistory` | boolean | no | Paid add-on. Attach a per-employer multi-year salary trend. Default `false`. | `true` |
| `aiRoleNormalization` | boolean | no | Paid add-on. AI-normalize each job title. Default `false`. | `true` |
| `proxyConfiguration` | object | no | Optional proxy. Datacenter works; use Apify RESIDENTIAL (US) if rate limited. | `{ "useApifyProxy": true }` |

If you leave employer, job title and city all blank, a year is required and the run is hard-capped to keep it bounded.

### Output reference

| Name | Type | Description |
|------|------|-------------|
| `employer` | string | Employer / sponsoring company. |
| `jobTitle` | string | Job title on the filing. |
| `baseSalary` | string | Base salary as shown on the page. |
| `baseSalaryUsd` | number | Annualized base salary, numeric (USD). |
| `location` | string | Work location as shown (city, state). |
| `city` | string | Work-location city (derived). |
| `state` | string | Work-location state, 2-letter (derived). |
| `submitDate` | string | LCA submit date, ISO `YYYY-MM-DD`. |
| `startDate` | string | Employment start date, ISO `YYYY-MM-DD`. |
| `year` | number | Filing year (derived). |
| `caseNumber` | string | DOL case number from the disclosure link. |
| `salaryTrend` | array | Per-year `{year, count, medianSalaryUsd, minSalaryUsd, maxSalaryUsd}` (multi\_year\_history add-on; `null` otherwise). |
| `standardizedRole` | string | AI standardized role (ai\_role\_normalization add-on; `null` otherwise). |
| `seniorityLevel` | string | AI seniority level (ai\_role\_normalization add-on). |
| `jobFamily` | string | AI job family (ai\_role\_normalization add-on). |
| `salaryBand` | string | AI salary band (ai\_role\_normalization add-on). |
| `observedAt` | string | Scrape timestamp, ISO. |
| `error` | string | Error message, if any (`null` on success). |

### Example output record

```json
{
  "employer": "GOOGLE LLC",
  "jobTitle": "ACCESSIBILITY ANALYST",
  "baseSalary": "123,000",
  "baseSalaryUsd": 123000,
  "location": "AUSTIN, TX",
  "city": "AUSTIN",
  "state": "TX",
  "submitDate": "2024-09-30",
  "startDate": "2025-03-28",
  "year": 2024,
  "caseNumber": "I-200-24275-375561",
  "salaryTrend": null,
  "standardizedRole": null,
  "seniorityLevel": null,
  "jobFamily": null,
  "salaryBand": null,
  "observedAt": "2026-08-19T22:24:07.020Z",
  "error": null
}
```

### Run via API and CLI

Start a run with the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~h1b-salary-disclosures-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "employer": "Google", "year": "2024", "maxResults": 100 }'
```

Or with the Apify CLI:

```bash
apify call scrapers_lat/h1b-salary-disclosures-scraper \
  --input '{ "employer": "Google", "year": "2024", "maxResults": 100 }'
```

### Fetch results

Pull 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 `csv` or `xlsx` to export to CSV or Excel.

### Billing and limits

This actor is pay per result. You are billed only for records actually returned, and never on failure.

| Event | Price (USD) | When it charges |
|-------|-------------|-----------------|
| `result` | $0.012 | Per salary disclosure record returned. |
| `multi_year_history` | $0.008 | Once per employer query, only when a non-empty multi-year salary trend is produced (extra fetches for the prior 3 years). Opt-in via `multiYearHistory`. |
| `ai_role_normalization` | $0.012 | Per record, only when the AI returns usable role normalization. Opt-in via `aiRoleNormalization`. |

- Free Apify accounts are capped at 10 billable results per run, and the two paid add-ons are disabled for free accounts.
- Both add-ons are opt-in and off by default. They charge only on genuine success (a real trend, or usable AI output).
- A spend guard stops emitting and charging once your configured `maxTotalChargeUsd` limit is reached, so you never receive data beyond what you pay for.
- Errors are written as a non-billable row and are never charged.

### Use cases

- **Salary benchmarking**: compare offered wages for a role across employers, cities and years.
- **Compensation intelligence**: build pay bands from real disclosed base salaries with the numeric `baseSalaryUsd` field and the multi-year trend add-on.
- **Immigration and visa research**: track H-1B / LCA sponsorship activity by company, role and location.
- **Recruiting leads**: find employers actively sponsoring specific roles and the salaries they disclose.
- **Pay-transparency and market research**: analyze wage distributions, medians and ranges across the US labor market.

### FAQ and troubleshooting

**Which years are available?** 2013 through the current year, plus `"All Years"`.

**Do I have to pass an employer?** No. You can search by job title or city instead. If all three are blank, set a year and the run is hard-capped.

**Why is `salaryTrend` null?** The multi-year trend is a paid opt-in add-on (`multiYearHistory`), requires an employer query, and is disabled for free accounts.

**Why are the AI fields null?** AI role normalization is a paid opt-in add-on (`aiRoleNormalization`), disabled for free accounts, and only populates when the model returns usable output.

**I hit rate limiting.** Set `proxyConfiguration` to Apify RESIDENTIAL in the US and retry.

### More scrapers at scrapers.lat

Explore the full catalog of company registry, compliance, finance and lead-generation scrapers at [scrapers.lat](https://scrapers.lat).

# Actor input Schema

## `employer` (type: `string`):

Employer / company name to search (e.g. "Google", "Amazon"). Matches the sponsoring company on the LCA filing. Leave blank to search across all employers.

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

Job title to search (e.g. "Software Engineer", "Data Scientist"). Matches the role on the filing.

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

Work-location city to filter by (e.g. "New York", "Mountain View").

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

Filing year to search. Pick a single year or "All Years". Data is available from 2013 onward.

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

Only return disclosures with an annualized base salary at or above this amount (USD). Leave blank for no minimum.

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

Maximum number of salary disclosure records to return. Free Apify accounts are capped at 10 per run.

## `multiYearHistory` (type: `boolean`):

When searching by employer, fetch the prior 3 years for the SAME employer and attach a per-year salary trend (count, median, min, max). Extra HTTP fetches. Charged once per employer query only when a non-empty trend is produced. Off for free accounts.

## `aiRoleNormalization` (type: `boolean`):

Use AI to normalize each messy job title into a standardized role, seniority level, job family and salary band. Charged only when the model returns usable output. Off for free accounts.

## `proxyConfiguration` (type: `object`):

Optional proxy. Datacenter works; switch to Apify RESIDENTIAL (US) if you hit rate limiting.

## Actor input object example

```json
{
  "employer": "Google",
  "year": "2024",
  "maxResults": 100,
  "multiYearHistory": false,
  "aiRoleNormalization": false,
  "proxyConfiguration": {
    "useApifyProxy": 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/h1b-salary-disclosures-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/h1b-salary-disclosures-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 '{}' |
apify call scrapers_lat/h1b-salary-disclosures-scraper --silent --output-dataset

```

## MCP server setup

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