# H1B Salary Scraper \[$2.50/1K💰] | Prevailing Wage | LCA Cases (`ahmed_jasarevic/h1bdata-info-scraper`) Actor

Scrape H-1B LCA salary data from h1bdata.info: employer, job title, base salary, prevailing wage, wage level, worksite, case status and fiscal year. Optional 28-field case details.

- **URL**: https://apify.com/ahmed_jasarevic/h1bdata-info-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 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/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

## H1B Salary Data Scraper – Employer Wages, Job Titles & Sponsorship Records

Extract **H-1B salary and sponsorship data** from h1bdata.info, built on DOL OFLC LCA disclosure filings: employer, job title, base salary, prevailing wage, wage level, worksite city and state, case number, case status, submit date and fiscal year. **$2.50 per 1,000 cases, $1 per 1,000 full case details.**

### What Can You Do With H-1B Salary Data?

- **Salary benchmarking** – compare base and prevailing wages for a role across employers, cities and years
- **Sponsorship research for job seekers** – check which employers filed LCAs for a title in a metro area and at what wage
- **Recruiter and compensation intelligence** – build a wage-ladder view by level (I–IV) for a target skill
- **Immigration case analysis** – count certified, denied and withdrawn filings by employer and fiscal year
- **Workforce and location analytics** – map hiring by worksite city and state
- **Academic and policy research** – LCA disclosures are public records and a defensible basis for labour-market studies

### How It Works

![How the H1B Salary Data Scraper works: from an employer search to structured LCA case rows.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-h1bdata-info-scraper.webp)

h1bdata.info renders server-side search results for an employer, year, job title and city. The actor requests those result pages over plain HTTP and parses the table rows into records — case number, employer, title, salary, prevailing wage, wage level, worksite, status and date.

When `includeDetails` is on, each case's own detail page is fetched as well, which adds the full 28-field record: SOC code, employer address and FEIN, NAICS industry, full-time flag and the complete set of dates. Detail pages are billed as a separate event because they are a separate request per case.

### Scrape H-1B Disclosure Data Without An Immigration Data API

DOL publishes LCA disclosure files as quarterly bulk archives that are large, differently shaped each quarter, and full of duplicate filings. h1bdata.info already indexes them as a searchable table. This actor reads that index and returns rows you can filter, sort and join.

That makes it an API-shaped substitute for both routes: no quarterly file wrangling, and no paid immigration-data vendor.

### H-1B Salary Benchmarks By Employer, Title, City And Year

`employers` takes names as they appear in the filings (`Google LLC`, `Microsoft`, `Amazon`). `years` takes fiscal years (`2026`, `2025`, `2024`) and defaults to the current and previous year. `jobTitles` and `cities` narrow the search further; leave them empty to collect every title or worksite for the employer.

Wages come straight from the filing: `baseSalary` is the offered wage, `prevailingWage` the DOL prevailing wage for the occupation and area, and `wageLevel` the I–IV level. Comparing the two is the fastest way to see whether an employer pays above the prevailing rate for a metro.

### Case Status, Dates And Fiscal Year Fields

Every row carries `caseNumber`, `status` (CERTIFIED, DENIED, WITHDRAWN and the source's other states), `submitDate` and `fiscalYear`. That is enough to compute approval rates by employer and year, or to match a case to its public disclosure record.

Turning on `includeDetails` adds the SOC code (occupation), employer address, FEIN, NAICS industry, full-time flag and the start/end dates of the intended employment period.

### Input – Configure An H-1B Extract

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `employers` | array | No | — | Employer names as filed, e.g. `["Google LLC","Microsoft","Amazon"]`. **Empty uses a built-in list of major tech employers** |
| `years` | array | No | current + previous | Fiscal years, e.g. `[2026, 2025, 2024]` |
| `jobTitles` | array | No | — | Filter by title; empty = all titles for the employer |
| `cities` | array | No | — | Filter by worksite city; empty = all cities |
| `maxItems` | integer | No | `1000` | Max cases saved; `0` = unlimited |
| `includeDetails` | boolean | No | `false` | Fetch each case page for the full 28-field record (extra charge per case) |
| `proxy` | object | No | — | Proxy configuration for the crawler |

### Output – H-1B Case Fields

Overview (always present):

| Field | Type | Description |
|---|---|---|
| `caseNumber` | string | LCA case number |
| `employer` | string | Employer name as filed |
| `jobTitle` | string | Job title as filed |
| `baseSalary` | number | Offered base wage (USD/year) |
| `prevailingWage` | number | DOL prevailing wage for the occupation and area |
| `wageLevel` | string | Wage level I–IV |
| `worksiteCity` | string | Worksite city |
| `worksiteState` | string | Worksite state code |
| `status` | string | Case status (CERTIFIED, DENIED, WITHDRAWN, …) |
| `submitDate` | string | Filing date |
| `fiscalYear` | integer | Fiscal year of the filing |

Added by `includeDetails` (28 fields in total): SOC code and occupation name, employer address, FEIN, NAICS industry, full-time flag, employment start and end dates, and the remaining detail-page fields.

### Example Input – Software Engineers At Three Employers

```json
{
  "employers": ["Google LLC", "Microsoft", "Amazon"],
  "years": [2026, 2025],
  "jobTitles": ["Software Engineer"],
  "maxItems": 500,
  "includeDetails": true
}
```

### Example Output – One LCA Case

```json
{
  "caseNumber": "I-200-26001-123456",
  "employer": "Google LLC",
  "jobTitle": "Software Engineer",
  "baseSalary": 185000,
  "prevailingWage": 172000,
  "wageLevel": "II",
  "worksiteCity": "Mountain View",
  "worksiteState": "CA",
  "status": "CERTIFIED",
  "submitDate": "2026-01-08",
  "fiscalYear": 2026,
  "socCode": "15-1252",
  "naicsCode": "541511",
  "fullTime": true
}
```

### Export H-1B Data To JSON, CSV Or Excel And Schedule Runs

LCAs are filed continuously and the site's index updates as new quarters are processed. A **monthly schedule** is a sensible cadence for sponsorship monitoring; a **quarterly run** matches the DOL release cycle.

At $0.0025 per case, 1,000 cases cost $2.50; adding details for all of them adds $1.00. `maxItems` defaults to 1000, so a broad employer list will not run away with cost.

### Related Actors

- [CSLB Scraper](https://apify.com/ahmed_jasarevic/cslb-scraper) – another US public-record dataset (California contractor licences) with the same row-per-record shape
- [Google Maps Scraper](https://apify.com/apify/google-maps-scraper) – geocode worksite cities and enrich employer locations
- [Google Search Scraper](https://apify.com/apify/google-search-scraper) – find layoff notices, H-1B news and employer filings commentary
- [Website Content Crawler](https://apify.com/apify/website-content-crawler) – pull employer career pages and immigration policy pages into clean text

### FAQ

#### Why use this actor instead of the official DOL disclosure files?

The DOL publishes quarterly LCA archives as large, inconsistently shaped files with duplicate filings. This actor gives you a filtered, row-level result for a specific employer, year, title or city — which is what most analyses actually need — without downloading and normalising gigabytes.

#### Is h1bdata.info an official source?

No. It is a third-party index of **public DOL OFLC LCA disclosure data**. The actor reads that index; the underlying filings are public records. For legal or compliance decisions, verify against the official DOL disclosure data.

#### What happens if I leave `employers` empty?

The actor falls back to a built-in list of major tech employers. That default is convenient for a demo but misleading for research — always pass explicit employer names.

#### Does this actor show H-1B lottery results or approvals?

No. LCA filings are a pre-filing step: they show the wage and worksite an employer intends to use, and whether that LCA was certified. They are not visa approvals and say nothing about the lottery. `status` refers to the LCA, not the petition.

#### What is the difference between base salary and prevailing wage?

`baseSalary` is the wage the employer offered in the filing. `prevailingWage` is the DOL's market rate for that occupation in that area. A base salary above the prevailing wage is common in tech; a base salary at or near it suggests the filing is anchored to the minimum required.

#### What are alternatives for H-1B salary data?

Other Apify actors cover h1bdata.info with different pricing, and DOL's own disclosure files are free but raw. Commercial compensation datasets (Levels.fyi, Glassdoor) measure self-reported or posted pay, not filed LCAs — a different population.

#### Do I need a proxy?

Not for moderate volumes. Large multi-employer, multi-year runs will make thousands of requests; enable a proxy group if the site starts throttling.

### SEO Keywords

h1b data, h1b salary data, h1bdata scraper, h1b sponsor list, lca disclosure data, h1b prevailing wage data, h1b job titles, us salary benchmarking data, dol oflc data, h1b employer database, visa sponsorship data, immigration data api, h1b api, h1bdata alternative, tech salary data, h1b case status, workforce analytics data, compensation benchmarking dataset, h1b filings by employer

### For AI Agents & LLM Apps

Returns one row per H-1B LCA filing from h1bdata.info: employer, title, base and prevailing wage, wage level, worksite, case status, submit date and fiscal year; `includeDetails` adds SOC, FEIN, NAICS and dates.

Minimal working input:

```json
{ "employers": ["Google LLC"], "years": [2025], "maxItems": 50 }
```

Variant — full 28-field records for one metro:

```json
{ "employers": ["Amazon"], "years": [2026, 2025], "cities": ["Seattle"], "includeDetails": true, "maxItems": 200 }
```

Output fields: `caseNumber, employer, jobTitle, baseSalary, prevailingWage, wageLevel, worksiteCity, worksiteState, status, submitDate, fiscalYear` — plus `socCode, naicsCode, fullTime`, employer address/FEIN and employment dates when `includeDetails` is on.

Behaviors an agent should know:

- **`employers` empty is not "all employers"** — it uses a built-in list of major tech employers. Always pass names explicitly.
- `years` defaults to the current and previous fiscal year, not to all history.
- `includeDetails` adds **one extra billed event per case** (`case-detail`, $0.001) and roughly doubles runtime.
- `maxItems` defaults to **1000**, unlike most actors where 0 means unlimited; `0` here means truly unlimited.
- `jobTitles` and `cities` are filters applied during search; empty means no filter, not "no results".
- `status` is the LCA status (certified/denied/withdrawn), not a visa or lottery outcome.

Billing: **$0.0025 per case row** plus **$0.001 per case detail**, plus a small actor-start event.

### Legal & Compliance Disclaimer

This actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by h1bdata.info, the US Department of Labor, or the Office of Foreign Labor Certification.

It accesses publicly available LCA disclosure pages — records that US employers are legally required to publish as part of the H-1B process. No login, no paywall bypass, no CAPTCHA solving. The output describes employers and job offers, not individual workers: LCA disclosures do not contain employee names.

Users are responsible for complying with h1bdata.info's Terms of Service and with applicable law. If you use the data for hiring, compensation or immigration decisions, note that LCA filings are not visa approvals, and employment decisions based on them may be subject to US anti-discrimination and immigration rules. This section is a factual disclosure, not legal advice.

# Actor input Schema

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

List of employer names to search for (e.g., \['Google LLC', 'Microsoft', 'Amazon']). If empty, uses a default list of major tech employers.

## `years` (type: `array`):

Fiscal years to scrape (e.g., \[2026, 2025, 2024]). Defaults to current and previous year.

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

Filter by specific job titles. If empty, scrapes all job titles for the employer.

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

Filter by worksite cities. If empty, scrapes all cities.

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

Maximum number of LCA cases to save to the dataset. The Actor keeps scraping until it reaches this number. Use 0 for unlimited.

## `includeDetails` (type: `boolean`):

Fetch each case's detail page for the full 28-field record (SOC code, prevailing wage, wage level, status, dates, employer address/FEIN, etc.). Each saved detail triggers a 'case-detail' charge. When off, only basic search results are saved (employer, job title, base salary, location, submit/start date, case number).

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "employers": [],
  "years": [
    "2026",
    "2025"
  ],
  "jobTitles": [],
  "cities": [],
  "maxItems": 1000,
  "includeDetails": false,
  "proxy": {
    "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 = {
    "employers": [],
    "years": [
        "2026",
        "2025"
    ],
    "jobTitles": [],
    "cities": [],
    "maxItems": 1000,
    "includeDetails": false,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/h1bdata-info-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": [],
    "years": [
        "2026",
        "2025",
    ],
    "jobTitles": [],
    "cities": [],
    "maxItems": 1000,
    "includeDetails": False,
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/h1bdata-info-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": [],
  "years": [
    "2026",
    "2025"
  ],
  "jobTitles": [],
  "cities": [],
  "maxItems": 1000,
  "includeDetails": false,
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/h1bdata-info-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/h1bdata-info-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/DekorsQRY4UaQC6bv/builds/obfH14wWDgqc8q5zi/openapi.json
