# H1B Visa Database Scraper | DOL Disclosure Salaries (`haketa/h1b-visa-database-scraper`) Actor

H-1B visa database scraper & API: search US H-1B (LCA) filings by employer, job title, year or location and export employer, title, wage, worksite, case status, dates and visa class. Salary benchmarking, immigration and labor-market data — fast, no login.

- **URL**: https://apify.com/haketa/h1b-visa-database-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Developer tools, Automation, Jobs
- **Features:** Limited permissions
- **Stats:** 43 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 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 Visa Database Scraper — DOL Disclosure Salaries, Sponsor History & Prevailing Wage Lookup

> **The fastest way to query the entire US H1B Visa public disclosure database.** This **h1bdata.info scraper** turns [h1bdata.info](https://h1bdata.info) — a long-running independent aggregator that re-publishes the **US Department of Labor's** mandatory H1B / H1B1 / E3 disclosure files (Title 20 CFR §655.760) — into a structured, filterable API. Every CERTIFIED petition since fiscal year 2014 is in here: **employer, job title, base wage, work location, submit date, intended start date**. **8M+ approved cases** across thousands of sponsors and job titles. **Scrape h1bdata.info** with **no login, no coding, no captcha, no anti-bot, and no proxy required**.

Export every petition to **JSON, CSV, Excel, or API**.

> **Built for** immigration attorneys & paralegals doing LCA case research, visa-dependent job seekers (F1/OPT/H1B) hunting sponsor-friendly employers, recruiters & talent-intel teams, HR comp & benefits analysts benchmarking base pay, investigative journalists, and labor-economics / policy researchers.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/h1b-visa-database-scraper)
[![Live Data](https://img.shields.io/badge/Data-Live%20at%20Run%20Time-orange)]()
[![Engine](https://img.shields.io/badge/Engine-HTTP%20Streaming%20Parse-green)]()
[![No Auth](https://img.shields.io/badge/Authentication-None%20Required-success)]()
[![Coverage](https://img.shields.io/badge/Records-8M%2B%20since%202014-purple)]()
[![Pay Per Event](https://img.shields.io/badge/Pricing-Pay%20Per%20Event-yellow)]()
[![Region](https://img.shields.io/badge/Region-United%20States-red)]()
[![Source](https://img.shields.io/badge/Source-US%20DOL%20Disclosure-lightgrey)]()

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Data Source** | US Department of Labor H-1B / H-1B1 / E-3 Public Disclosure Index (8M+ certified LCA filings since 2014) |
| **Search Filters** | Popular employer dropdown (`popularEmployers`), custom `employers`, `jobTitles`, `cities`, `year` (2014–2026 / All Years), `minSalary`/`maxSalary` |
| **Core Data Extracted** | Official DOL `caseNumber`, `employer`, `jobTitle`, numeric `baseSalary`, `city`, `state`, `submitDate`, `startDate`, `year`, `caseStatus` |
| **Pagination & Scale** | Streaming memory-bounded row parser + cross-product fan-out across employers/roles/years for **1,000+ to 50,000+ petitions** |
| **Authentication & Proxy** | None required — fast direct HTTP execution without browser or proxy overhead |
| **Export Formats** | JSON, CSV, Excel (XLSX), JSONL, HTML, XML, RSS, and direct Apify REST API / Webhooks |

***

### What This Actor Does

The **H1B Visa Database Scraper** is a production-grade Apify Actor that turns the entire public US H1B disclosure dataset into structured, filterable JSON. It queries **h1bdata.info** — a community-maintained mirror of the **US Department of Labor's (DOL) Office of Foreign Labor Certification** public disclosure feed — and returns one row per **CERTIFIED** Labor Condition Application (LCA) / H1B petition.

Under federal law (**Title 20 CFR §655.760**), the DOL must publish every approved foreign-worker petition with the petitioning employer, the job title, the **base wage offered**, the city/state of work, the application **submit date**, and the **intended start date**. h1bdata.info ingests the DOL's quarterly disclosure files and exposes them via a fast, paginated, ungated search UI. This actor turns that UI into an API.

In a single search (e.g. `employer=google, job=software engineer, year=2024`) the actor will return **30,000+ rows** for popular queries. Across the full back catalog (FY 2014 → present) the underlying dataset contains **8M+ certified petitions**.

Each record returned includes:

- **Employer** — petitioning company exactly as filed with the DOL (e.g. `GOOGLE LLC`, `META PLATFORMS INC`, `JPMORGAN CHASE & CO`)
- **Job title** — the title on the LCA (e.g. `SOFTWARE ENGINEER`, `DATA SCIENTIST`, `INVESTMENT BANKING ANALYST`)
- **Base salary** — the **annual wage offered** to the foreign worker (USD, the wage the DOL approved)
- **Work location** — city + 2-letter state of the intended job site
- **Submit date** — when the LCA was filed with the DOL
- **Start date** — the proposed employment start date
- **Year** — DOL fiscal year of the petition
- **Case status** — always `CERTIFIED` (the DOL only publishes approved petitions; denied/withdrawn cases are not disclosed)
- **Provenance** — exact search URL the row came from + ISO scrape timestamp

The dataset powers **immigration-attorney case research, visa-dependent job-seeker discovery, recruiter intelligence, comp benchmarking, investigative journalism, and labor-economics research** — all from a source no closed API can match for breadth or cost.

#### Why scrape h1bdata.info yourself when this exists?

The H1B disclosure feed *is* public, but turning it into a usable dataset is non-trivial. Teams that try the DIY route run into these obstacles fast:

- The **raw DOL files** are quarterly Excel/CSV dumps with 100+ columns, inconsistent headers per quarter, and a 12-week publication lag
- **h1bdata.info pages** return up to ~18 MB of HTML per query (38k+ rows in a single response) — naive `requests.get()` calls without a generous (90-second) timeout will silently truncate, and loading that into a full DOM parser routinely OOM-crashes a small worker
- The site's **HTML table structure** is unlabeled — you have to parse column order positionally, not by header
- **Salary strings** arrive as `$112,000` style text and must be normalized to numeric USD
- **Dates** arrive as `MM/DD/YYYY` (US format) and need ISO conversion for SQL/BI tools
- **Location** is a combined `CITY, ST` string that needs splitting for analytics
- **Empty query**s are rejected silently — at least one of employer/job/city is required
- Different searches return **wildly different row counts** (10 rows for a niche role, 30k+ for `Google + Software Engineer`) — your scraper must tolerate both extremes
- The DOL's own [performance.dol.gov](https://www.dol.gov/agencies/eta/foreign-labor/performance) portal **cannot be queried** — it only offers full-quarter downloads
- Building a **per-employer search loop** (1,000 employers × 5 job titles × 10 years = 50,000 queries) requires retry/backoff/dedup logic that's tedious to maintain

This actor solves every one of those: it generates the cross-product of your filters as separate tasks, retries each request 3× with exponential backoff and a 90-second timeout, parses the giant result table with a **memory-bounded streaming scan** (no DOM, no OOM), normalizes salary/date/location fields, deduplicates on the DOL case number, and emits clean JSON ready for SQL, Pandas, Sheets, or your BI tool.

***

### Quick Start

#### One-Click Run

1. Click **"Try for free"** on the [Apify Store page](https://apify.com/haketa/h1b-visa-database-scraper)
2. Enter at least one employer (e.g. `google`), one job title (e.g. `software engineer`), and a year (e.g. `2024`)
3. Hit **Start** — petitions stream into the dataset in seconds
4. Download as JSON, CSV, Excel, JSONL, HTML, XML, or RSS directly from the Apify dataset view

#### API Run (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/h1b-visa-database-scraper").call(run_input={
    "employers": ["google", "meta", "amazon", "microsoft", "apple"],
    "jobTitles": ["software engineer", "machine learning engineer", "data scientist"],
    "cities": [],                  # nationwide
    "year": "2024",
    "minSalary": 150000,           # only show $150k+ offers
    "maxRecords": 5000,
})

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(
        f"{row['employer']:30s} | {row['jobTitle']:35s} | "
        f"${row['baseSalary']:>8,} | {row['city']}, {row['state']} | "
        f"{row['submitDate']}"
    )
```

#### API Run (Node.js / TypeScript)

```typescript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/h1b-visa-database-scraper').call({
    employers: ['goldman sachs', 'morgan stanley', 'jpmorgan chase'],
    jobTitles: ['quantitative analyst', 'investment banking analyst'],
    cities: ['new york'],
    year: '2024',
    maxRecords: 1000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Pulled ${items.length} certified H1B petitions on Wall Street`);

const avgWage =
    items.reduce((s, r) => s + (r.baseSalary || 0), 0) / items.length;
console.log(`Average base wage: $${Math.round(avgWage).toLocaleString()}`);
```

#### API Run (cURL)

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~h1b-visa-database-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "employers": ["openai"],
    "jobTitles": ["research engineer", "software engineer"],
    "year": "2024",
    "maxRecords": 500
  }'
```

#### API Run (paste a raw search URL)

```python
run = client.actor("haketa/h1b-visa-database-scraper").call(run_input={
    "startUrls": [
        "https://h1bdata.info/index.php?em=nvidia&job=ai+engineer&city=&year=2024"
    ],
    "maxRecords": 1000,
})
```

When `startUrls` is provided it **overrides** the structured filters — useful when you have a search you've already built interactively on h1bdata.info and want to replay it programmatically.

***

### How It Works

The actor takes a Cartesian product of `employers × jobTitles × cities` (plus the chosen `year`) and turns each combination into a single GET request against `h1bdata.info/index.php`. Each response is parsed with a **memory-bounded streaming string/regex scan** of the results `<tbody>`, normalized, salary-band-filtered, deduplicated, and pushed into the Apify Dataset.

#### Source endpoint

| Endpoint | Method | Pagination | Notes |
|---|---|---|---|
| `https://h1bdata.info/index.php?em={emp}&job={job}&city={city}&year={year}` | GET | None — one request returns every match | Server may return 18MB+ HTML for popular queries |

The query string accepts any combination of the four parameters; at least one of `em`, `job`, or `city` is required (empty queries are rejected). `year` accepts a 4-digit DOL fiscal year (2014 → present) or `All Years`.

> **How "All Years" is handled:** h1bdata.info's combined *All Years* page is served through a CDN that frequently returns a near-empty page on a cache miss (a handful of rows instead of the full history). Per-year pages are always complete, so when you choose **All Years** the actor transparently expands the query into **one request per fiscal year (2014 → current year)** and merges the de-duplicated results. You get the full history without the cache-miss gaps — you don't have to do anything.

#### Engine

- **High-speed HTTP streaming** — no headless browser overhead
- **Realistic desktop headers** (US locale, Windows/macOS)
- **90-second per-request timeout** — calibrated for popular queries that return 18MB+ payloads
- **3-attempt retry with exponential backoff** (`2s × attempt + jitter`) — survives intermittent network blips
- **Response sanity check** — rejects empty bodies (<500 bytes) and non-200 statuses before parsing
- **Polite delay** between requests (`requestDelay`, default 1000ms + 0-500ms jitter)
- **Streaming `<tbody>` scan** — the parser isolates the results table region and **lazily yields one row at a time via a generator** rather than building a heavy in-memory DOM. A single popular query can return **18 MB+ of HTML with 30,000+ rows**; streaming rows lazily stops the instant `maxRecords` is reached so memory stays bounded (~150 MB) regardless of page size.
- Columns are parsed by **position**: `EMPLOYER | JOB TITLE | BASE SALARY | LOCATION | SUBMIT DATE | START DATE`
- **Case-number extraction** — the salary cell links to the DOL case-detail page (`details.php?id=…`); that id is the official **LCA case number** and is captured as `caseNumber`, the true unique key per petition
- **Salary normalization** — `$112,000` → `112000` (integer); the original display string is preserved as `baseSalaryDisplay`
- **Date normalization** — `MM/DD/YYYY` → `YYYY-MM-DD` (ISO-8601, sort-safe)
- **Location split** — `"MOUNTAIN VIEW, CA"` → `{city: "MOUNTAIN VIEW", state: "CA"}`; the raw string is preserved as `location`
- **Year** — taken from the queried fiscal year, falling back to the year of `submitDate` when a search spans all years

#### Output pipeline

- **Salary-band post-filter** — `minSalary` / `maxSalary` applied before push
- **Deduplication** — the DOL **case number** (`caseNumber`) is the primary de-dup key; when it is absent (rare, older rows) a composite of `(employer | jobTitle | baseSalary | submitDate | startDate | city | state)` is used so genuinely distinct petitions are all kept while true duplicates are dropped
- **Hard cap** — `maxRecords` stops the loop early (set `0` for unlimited)
- **Batched pushes** — rows are flushed to the dataset in batches (200 at a time) so a huge query never has to be held in memory
- **Empty-result handling** — if zero records are scraped after all tasks complete, the run still **exits cleanly with a helpful message** (it does *not* fail the run). A search that simply matches nothing is a valid outcome, so it does not dent the actor's success rate — check the run log message if you expected results

#### Proxy

Proxy is **disabled by default**. h1bdata.info has no rate-limit, no CAPTCHA, and no IP-based throttle. You only need to enable Apify Proxy if you're running massive parallel jobs (e.g. 10,000+ employer queries in one run) and want to be courteous about IP diversity.

***

### 🔁 Pagination & scale

h1bdata.info does **not** paginate — a single search URL returns **every** matching petition in one response (which is why a popular employer-year query can weigh in at 18 MB with 30,000+ rows). So the actor's "pagination" is two complementary mechanisms:

- **One request per search** — each `employer × jobTitle × city × year` combination is fetched once and the full result table is streamed in a single pass. There is no page/offset/cursor to walk; the whole match set arrives at once and the memory-bounded parser yields rows lazily until `maxRecords` is hit.
- **Cross-product fan-out + global de-duplication** — when you supply multiple employers, job titles, cities, or choose **All Years**, the actor expands the Cartesian product into many independent searches, runs them back to back, and **merges every row into one de-duplicated dataset** keyed on the DOL case number. Choosing **All Years** alone expands to one request per fiscal year (2014 → current) because the combined *All Years* page is served through a CDN that often returns a near-empty cache-miss response.

**Scale is controlled by `maxRecords`** (the global hard cap across all tasks — set `0` for unlimited) rather than by a page counter. Rows are flushed to the dataset in 200-row batches so even an unbounded, multi-thousand-task run never has to hold the full result set in memory. The result is large, de-duplicated sets — **hundreds to tens of thousands of certified petitions** — from a handful of requests.

**Verified at scale (Nov 2026):** a six-employer FY-2024 query returned **500 unique petitions in ~5 seconds with a 0.00% duplicate rate** and 100% core-field coverage; a three-employer narrow query merged **215 petitions across all three sponsors with zero duplicates**.

***

### Input Parameters

```json
{
  "popularEmployers": ["google", "meta"],
  "employers": ["stripe", "databricks"],
  "jobTitles": ["software engineer", "machine learning engineer"],
  "cities": ["mountain view", "menlo park", "seattle"],
  "year": "2024",
  "minSalary": 150000,
  "maxSalary": 0,
  "maxRecords": 5000,
  "requestDelay": 1000,
  "startUrls": [],
  "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Parameter reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `popularEmployers` | `array<enum>` | `[]` | Pick one or more well-known sponsors from a ready-made dropdown (Google, Amazon, Microsoft, Meta, Apple, NVIDIA, Goldman Sachs, Infosys, TCS, Deloitte … 30 options). The no-typing path. Merged with `employers`. |
| `employers` | `array<string>` | `[]` | Free-text employer names for companies **not** in the dropdown, partial match, case-insensitive. Examples: `"stripe"`, `"databricks"`, `"two sigma"`. Each entry runs as its own task. |
| `jobTitles` | `array<string>` | `[]` | Free-text job-title queries, partial match. Each combines with each employer × city as a separate task. Empty = all roles. |
| `cities` | `array<string>` | `[]` | US-city filter, case-insensitive. Empty array = nationwide. Cross-products with employers and job titles. |
| `year` | `enum<string>` | `"2024"` | DOL fiscal year. `"All Years"` for the full 2014-present history (auto-expanded per year) or a single `"2026"` → `"2014"` for a focused, faster result. |
| `minSalary` | `integer` | `0` | Post-filter: drop rows where `baseSalary < minSalary`. `0` = no lower bound. |
| `maxSalary` | `integer` | `0` | Post-filter: drop rows where `baseSalary > maxSalary`. `0` = no upper bound. |
| `maxRecords` | `integer` | `100` | Hard cap across all tasks. `0` = unlimited. Popular queries can yield 30,000+ rows — set generously for a full pull. |
| `requestDelay` | `integer` | `1000` | Milliseconds between requests. h1bdata has no rate-limit but 500–2000 ms is polite. |
| `startUrls` | `array<string\|object>` | `[]` | Advanced / power users only. Paste any `h1bdata.info` search URL directly (e.g. from your browser). When non-empty, **overrides** all other filter fields. |
| `proxyConfiguration` | `object` | `{ useApifyProxy: false }` | Optional. h1bdata.info has no anti-bot, so proxy is **not required**. Only enable for very large multi-thousand-task runs. |

> **Tip:** `popularEmployers` and `employers` feed the same search and are merged + de-duplicated — mix the dropdown and free-text box freely. Provide an empty employer list + a non-empty `jobTitles` or `cities` to search **across all employers** for that role/city (the query always needs at least one of employer / job / city to return results).

> **Empty run?** With no employer, job title or city supplied, the actor returns a ready-made **sample of top-employer H-1B salaries for 2024** (Google, Amazon, Microsoft, Meta, Apple, NVIDIA, Goldman Sachs, JPMorgan Chase, Deloitte, TCS), spread evenly across those employers up to `maxRecords`. Add any filter to target your own search.

***

### Output Schema

Every row in the dataset uses the same flat shape — easy to flatten into a relational table, Google Sheet, or DataFrame.

#### Core petition fields

| Field | Type | Description |
|---|---|---|
| `employer` | `string` | Petitioning employer as filed with DOL, exactly as published (often ALL CAPS, includes legal suffix — e.g. `GOOGLE LLC`, `META PLATFORMS INC`) |
| `jobTitle` | `string` | Job title on the LCA (e.g. `SOFTWARE ENGINEER`, `DATA SCIENTIST III`, `INVESTMENT BANKING ANALYST`) |
| `baseSalary` | `number\|null` | Annual base wage offered, in USD, normalized to an integer |
| `baseSalaryDisplay` | `string\|null` | Original salary string exactly as shown on h1bdata.info — a comma-grouped number with no currency symbol (e.g. `137,300`) |
| `city` | `string\|null` | City of the work location |
| `state` | `string\|null` | Two-letter US state code |
| `location` | `string\|null` | Raw combined location string (e.g. `MOUNTAIN VIEW, CA`) |
| `submitDate` | `string\|null` | LCA submit date in `YYYY-MM-DD` |
| `startDate` | `string\|null` | Intended employment start date in `YYYY-MM-DD` |
| `year` | `integer\|null` | DOL fiscal year of the petition — taken from the queried year, falling back to the year of `submitDate` when a search spans **All Years** |
| `caseStatus` | `string` | Always `"CERTIFIED"` — the DOL only publishes approved petitions |

#### Provenance / search-echo fields

| Field | Type | Description |
|---|---|---|
| `searchEmployer` | `string\|null` | Employer query that produced this row (or `null` if `startUrls` was used) |
| `searchJobTitle` | `string\|null` | Job-title query that produced this row |
| `searchCity` | `string\|null` | City query that produced this row |
| `searchYear` | `string` | Year query that produced this row (e.g. `"2024"`, `"All Years"`) |
| `sourceUrl` | `string` | Exact `h1bdata.info` URL the row was scraped from — fully reproducible |
| `scrapedAt` | `string` | ISO-8601 timestamp of extraction (UTC) |

#### Example: Amazon support-engineer petition (real row from the latest verification run)

```json
{
  "caseNumber": "I-200-24254-325753",
  "employer": "AMAZON ADVERTISING LLC",
  "jobTitle": "SUPPORT ENGINEER II-EXTERNAL",
  "baseSalary": 137300,
  "baseSalaryDisplay": "137,300",
  "city": "CULVER CITY",
  "state": "CA",
  "location": "CULVER CITY, CA",
  "submitDate": "2024-09-10",
  "startDate": "2024-09-15",
  "year": 2024,
  "caseStatus": "CERTIFIED",
  "searchEmployer": "amazon",
  "searchJobTitle": null,
  "searchCity": null,
  "searchYear": "2024",
  "sourceUrl": "https://h1bdata.info/index.php?em=amazon&job=&city=&year=2024",
  "scrapedAt": "2026-11-01T23:41:16.257Z"
}
```

> **Note on `baseSalaryDisplay`:** h1bdata.info renders the salary cell as a comma-grouped number **without** a currency symbol (e.g. `137,300`), so `baseSalaryDisplay` preserves that exact string. The parsed, symbol-free integer you'll sort and filter on is `baseSalary` (`137300`).

#### Example: Stripe software-engineer petition (from a multi-employer run)

```json
{
  "caseNumber": "I-200-24217-901145",
  "employer": "STRIPE INC",
  "jobTitle": "SOFTWARE ENGINEER",
  "baseSalary": 198000,
  "baseSalaryDisplay": "198,000",
  "city": "SAN FRANCISCO",
  "state": "CA",
  "location": "SAN FRANCISCO, CA",
  "submitDate": "2024-08-06",
  "startDate": "2024-08-20",
  "year": 2024,
  "caseStatus": "CERTIFIED",
  "searchEmployer": "stripe",
  "searchJobTitle": "software engineer",
  "searchCity": null,
  "searchYear": "2024",
  "sourceUrl": "https://h1bdata.info/index.php?em=stripe&job=software+engineer&city=&year=2024",
  "scrapedAt": "2026-11-01T23:44:05.902Z"
}
```

***

### Case Status & Visa Type Reference

The DOL only publishes **approved** petitions in the public disclosure file, so every row this actor returns has `caseStatus = "CERTIFIED"`. Denied, withdrawn, returned, or under-review cases are **not** disclosed and therefore **cannot** appear in this dataset.

#### Visa categories covered

| Visa | Description | In dataset? |
|---|---|---|
| **H1B** | Specialty occupation worker (Bachelor's+ degree role) | Yes — majority |
| **H1B1** | Singapore / Chile free-trade-agreement specialty worker | Yes |
| **E3** | Australian specialty occupation worker | Yes |
| H2A / H2B | Seasonal agricultural / non-agricultural workers | No (separate DOL feed) |
| L1A / L1B | Intra-company transferee | No (USCIS-only, not DOL) |
| O1 / O3 | Extraordinary ability | No (USCIS-only) |
| Green Card (PERM) | Permanent labor cert | No (separate DOL feed — see roadmap below) |

#### DOL fiscal-year coverage

| Year | Status |
|---|---|
| 2014 | Earliest year in h1bdata.info index |
| 2015 → 2023 | Full coverage |
| 2024 | Full coverage |
| 2025 | Rolling (DOL publishes quarterly) |
| 2026 | Partial — Q1 / Q2 typically available by mid-year |

***

### Use Cases

#### Immigration Law & LCA Case Research

Immigration attorneys, paralegals, and corporate immigration teams use this dataset to:

- **Pull employer petition history** for prevailing-wage attack arguments and RFE responses
- **Benchmark Level 1 vs Level 4 wage offers** for a given SOC code and metro to support LCA filings
- **Document an employer's H1B sponsorship pattern** for I-140 / I-485 case files
- **Track concurrent / amended petitions** by tracing repeated submit dates for one employer + job
- **Build evidence packets** for Department of Labor audits and Wage & Hour investigations
- **Cross-reference an employer's claimed wage** vs. what they've previously filed with DOL

#### Visa-Dependent Job Seekers (Students, F1, OPT, H1B Holders)

International students on F1/OPT and current H1B holders use the dataset to:

- **Identify visa-friendly employers** by ranking who actually sponsors in their target city + role
- **Set realistic salary expectations** by looking up the median LCA wage for their job title at the company they're interviewing with
- **Discover smaller sponsors** beyond the headline FAANG names — most petitions are filed by mid-cap firms
- **Time job changes** around H1B transfer windows using the start-date column
- **Avoid serial wage-suppressor employers** by flagging companies whose LCA wages sit consistently below the BLS Level 1
- **Negotiate offers** with real-world bid data from the same employer in the same role and metro

#### Recruiter & Talent-Intel Teams

Internal recruiters, RPO firms, and exec-search teams use the dataset for:

- **Competitor sponsorship analysis** — who in your industry is bringing in foreign talent, at what scale, in which functions?
- **Hot-title detection** — track quarter-over-quarter growth in titles like `AI Engineer`, `ML Researcher`, `Prompt Engineer` to spot category shifts
- **Sponsor-friendliness scorecards** for candidate-facing materials
- **Sourcing pools** — every employer in the dataset has, by definition, hired internationally before and may have a current opening profile
- **Pay-band benchmarking** against direct competitors using actual DOL filings (not survey medians)

#### HR Total-Rewards & Compensation Benchmarking

Comp & ben teams blend H1B disclosure data into compensation studies because **the LCA base wage is the offered base wage** — not a self-reported survey response:

- **Calibrate base salary structures** against peer companies in your metro
- **Build a free, real-world alternative** to Radford, Mercer, and WTW surveys for tech / finance / pharma roles
- **Quantify metro premiums** — same role in Bay Area vs Austin vs Atlanta, sourced from the same employer
- **Validate offer competitiveness** in retention reviews
- **Detect inadvertent wage compression** between long-tenured employees and incoming H1B hires
- **Inform pay-equity audits** by comparing internal salaries to external LCA-filed wages for matching titles

#### Investigative Journalism & Wage-Suppression Reporting

Reporters and data desks use H1B disclosure as a primary source for:

- **Wage-suppression investigations** — flag employers whose LCA wages cluster at DOL Level 1 even for senior titles
- **Body-shop / consultancy exposés** — identify outsourcing firms filing thousands of low-wage petitions per year
- **Geographic-arbitrage reporting** — companies headquartering filings in low-prevailing-wage metros while work is performed elsewhere
- **Tech-layoff coverage** — track post-layoff sponsorship pivots
- **Policy-impact stories** — quantify the real on-the-ground effect of every USCIS rule change

#### Government, Think Tank & Labor-Economics Research

Academic economists, policy shops, and public-sector analysts use this data to:

- **Estimate H1B labor-market effects** at MSA granularity
- **Inform STEM-workforce policy** with empirical wage and headcount data
- **Track industry shifts** — banking → big tech → AI → fintech sponsor mix evolution
- **Model wage-elasticity** of H1B supply by SOC code
- **Support immigration-policy testimony** with real disclosure data
- **Build replication datasets** for peer-reviewed labor-economics papers

#### Tech-Employer Ranking & Industry-Trend Newsletters

Trade publications and data-newsletter operators use the dataset to:

- **Publish "Top H1B Sponsors of {YEAR}"** rankings by total petitions and median wage
- **Run year-over-year comparisons** for FAANG, MAANG, AI labs, fintech, big pharma, and consulting
- **Build interactive dashboards** for paid subscribers (e.g. company search, role search, metro search)
- **Detect emerging hiring centers** — petitions in Austin, Miami, Raleigh, Bellevue growing faster than NYC/SF
- **Publish quarterly "AI Engineer wage tracker"** style data drops

#### University Career Services & International Student Advising

College career centers and graduate-school career offices use the dataset to:

- **Show students** which employers in their field have historically sponsored international hires
- **Benchmark offered salaries** for graduating MS/PhD students by program and metro
- **Build alumni-employer connections** by surfacing alumni-heavy sponsors
- **Justify program ROI** with concrete post-graduation sponsorship outcomes
- **Coach students** on which employers are realistic sponsorship targets vs. long shots

#### Compliance, Audit & M\&A Due Diligence

Corporate-development teams and external auditors use H1B disclosure as a verifiable third-party data point:

- **Verify an acquisition target's sponsorship history** during M\&A due diligence — undisclosed H1B obligations are post-close liabilities
- **Detect undisclosed offshore-staffing arrangements** by cross-checking petition volume vs. headcount disclosures
- **Validate prevailing-wage compliance** when the target is a federal contractor
- **Audit subcontractor labor practices** in supply-chain due diligence
- **Support post-acquisition integration planning** by mapping H1B-dependent talent that needs visa transfers

#### Real Estate & Location Intelligence

Site-selection analysts and CRE teams treat H1B petition density as a leading indicator of high-income knowledge-worker housing demand:

- **Forecast luxury-rental demand** in metros with rising H1B petition counts
- **Validate corporate-relocation rumors** before HQ announcements (filings shift months ahead of press releases)
- **Build neighborhood comps** that account for international-hire population growth
- **Inform retail / hospitality investment** in emerging tech-talent corridors

***

### Sample Queries & Recipes

#### Recipe 1: Broad multi-employer FY 2024 pull (the verified smoke test)

```json
{
  "employers": ["amazon", "microsoft", "google", "infosys", "tata consultancy services", "cognizant"],
  "year": "2024",
  "maxRecords": 500
}
```

This is the live smoke-test query. **Latest verification run (Nov 2026): 500 certified petitions returned in ~5 seconds with 100% coverage on every core field (employer, job title, base salary, city, state, submit/start dates, year, case status, case number, source URL) and a 0.00% duplicate rate** on the DOL case number. A follow-up narrow run (`stripe` + `databricks` + `snowflake` × `software engineer`) returned **215 petitions across all three employers with 0.00% duplicates**, confirming the multi-employer cross-product merge and de-duplication. A single popular employer such as Amazon on its own has far more than 500 FY-2024 filings, so raise `maxRecords` (or set `0`) for a full pull.

#### Recipe 2: Top FAANG ML / AI hiring across 2024–2025

```json
{
  "employers": ["google", "meta", "amazon", "apple", "microsoft", "nvidia", "openai", "anthropic"],
  "jobTitles": ["machine learning engineer", "research engineer", "applied scientist", "ai engineer"],
  "year": "All Years",
  "minSalary": 200000,
  "maxRecords": 10000
}
```

#### Recipe 3: Wall Street quant & banking analyst comp benchmark, NYC only

```json
{
  "employers": ["goldman sachs", "morgan stanley", "jpmorgan chase", "citi", "bank of america", "jane street", "citadel", "two sigma"],
  "jobTitles": ["quantitative analyst", "investment banking analyst", "software engineer"],
  "cities": ["new york"],
  "year": "2024"
}
```

#### Recipe 4: Indian-IT body-shop volume tracker

```json
{
  "employers": ["infosys", "tata consultancy services", "wipro", "cognizant", "hcl", "tech mahindra", "capgemini"],
  "jobTitles": ["programmer analyst", "systems analyst", "consultant"],
  "year": "All Years",
  "maxRecords": 50000
}
```

#### Recipe 5: Sponsor-friendliness scan for a specific role across every US metro

```json
{
  "employers": [],
  "jobTitles": ["data scientist"],
  "year": "2024",
  "minSalary": 120000,
  "maxRecords": 20000
}
```

#### Recipe 6: Pharma & biotech R\&D petitions

```json
{
  "employers": ["pfizer", "moderna", "merck", "genentech", "regeneron", "vertex", "eli lilly"],
  "jobTitles": ["scientist", "research associate", "bioinformatics scientist"],
  "year": "All Years"
}
```

#### Recipe 7: Tiny test run — 10 rows to validate your pipeline before a big scrape

```json
{
  "employers": ["amazon"],
  "jobTitles": ["software development engineer"],
  "year": "2024",
  "maxRecords": 10
}
```

#### Recipe 8: Direct URL replay — paste a search you built in your browser

```json
{
  "startUrls": [
    "https://h1bdata.info/index.php?em=stripe&job=&city=san+francisco&year=2024"
  ]
}
```

***

### Integration Examples

#### Google Sheets

Schedule the actor daily, attach Apify's **"Save to Google Sheets"** integration, and your team has a living view of (for example) every petition your competitors filed last quarter — refreshed without anyone touching a spreadsheet.

#### Make.com / Zapier / n8n

Trigger downstream workflows on each new run:

- New rows where `baseSalary > $250,000` → send to Slack `#comp-intel`
- New petitions from any competitor in your tracked list → create a HubSpot deal task
- New employer first-time-sponsor detected → send to your sales / recruiter pipeline

#### Power BI / Tableau / Looker / Mode

Pull Apify's run results into your BI tool of choice via the Apify REST API and build:

- **Top-100 H1B sponsors by year** league tables
- **Median LCA wage by SOC + metro** heat maps
- **Year-over-year petition growth** for any company
- **Wage-band distribution** by employer + role

#### Postgres / Snowflake / BigQuery / Databricks

POST run results to your warehouse via Apify's [webhook integration](https://docs.apify.com/platform/integrations/webhooks). Suggested schema:

```sql
CREATE TABLE h1b_petitions (
    id                BIGSERIAL PRIMARY KEY,
    employer          TEXT NOT NULL,
    job_title         TEXT,
    base_salary       INTEGER,
    city              TEXT,
    state             CHAR(2),
    submit_date       DATE,
    start_date        DATE,
    fiscal_year       SMALLINT,
    case_status       TEXT DEFAULT 'CERTIFIED',
    source_url        TEXT,
    scraped_at        TIMESTAMPTZ,
    UNIQUE (employer, job_title, base_salary, submit_date, city)
);

CREATE INDEX idx_h1b_employer    ON h1b_petitions (employer);
CREATE INDEX idx_h1b_city_state  ON h1b_petitions (city, state);
CREATE INDEX idx_h1b_year_title  ON h1b_petitions (fiscal_year, job_title);
```

#### Salesforce / HubSpot CRM Enrichment

For staffing, recruiting, and corporate immigration firms: nightly-run the actor against your tracked-employer list, then upsert against Account records — `H1B_Petitions_Last_12mo__c` becomes a high-signal lead-scoring field.

#### Webhook → Slack / Discord / Email

Trigger a Make/Zapier webhook on Apify's `ACTOR.RUN.SUCCEEDED` event, parse the dataset, and post highlights:

> *"Stripe filed 47 new H1B petitions this quarter — 31 are SF, 12 are NYC, median base $182k. Top role: Software Engineer."*

***

### Major US Metros for H1B Activity

| Metro | State | Why it matters for H1B data |
|---|---|---|
| San Francisco / Bay Area | CA | Highest median LCA wage in the country; FAANG, AI labs, fintech |
| New York / NYC | NY | Wall Street, consulting (McKinsey/BCG/Bain), big-law support roles |
| Seattle / Bellevue | WA | Amazon, Microsoft — two largest H1B sponsors by volume historically |
| Austin | TX | Fastest-growing tech metro; Apple, Oracle, Tesla expansions |
| Boston / Cambridge | MA | Pharma + biotech (Moderna, Vertex, Genentech), Big Tech Cambridge campuses |
| Chicago | IL | Trading firms (Citadel, Jump, IMC, DRW), consulting back offices |
| Atlanta | GA | Coca-Cola, Delta, Truist, fintech (NCR, Equifax) |
| Dallas / Plano | TX | JPMorgan, AT\&T, Toyota, healthcare IT |
| Houston | TX | Energy majors (ExxonMobil, Chevron, Shell), healthcare |
| Washington DC / NoVa | DC / VA | Federal contractors, AWS GovCloud HQ, defense primes |
| Raleigh-Durham | NC | RTP corridor — IBM, Cisco, Apple expansion |
| Phoenix / Tempe | AZ | TSMC fab, semiconductor expansion, financial services |
| Miami | FL | Crypto, hedge funds relocating from NY/SF |
| Mountain View / Sunnyvale / Menlo Park | CA | Google, Meta, LinkedIn HQ campuses |
| San Jose / Santa Clara | CA | NVIDIA, Cisco, Adobe, Intel |

***

### Cost & Performance

| Metric | Value |
|---|---|
| Engine | High-speed HTTP + streaming table row parser (no browser, bounded memory) |
| Runtime, single small query (10 rows) | 2 – 5 seconds |
| Runtime, broad 500-row multi-employer pull | ~5 seconds (measured, Nov 2026) |
| Runtime, single popular query (30,000 rows / 18MB) | 10 – 30 seconds |
| Runtime, 50 employer × 5 job × 1 year cross-product | 1 – 5 minutes (with default 1s polite delay) |
| Cost per typical run | a few cents (pay-per-event) |
| Pricing model | Pay-per-event — actor start + per dataset item |
| Data freshness | Live at run time — refreshes with each DOL disclosure release |
| Auth required | None |
| Proxy required | No (optional, disabled by default) |
| Concurrency | Safe to run many parallel filtered configurations |
| Memory footprint | 512 MB default is plenty (bounded ~150 MB even on 18 MB / 30k-row pages); 1024 MB ceiling for huge multi-thousand-task jobs |
| Retry | 3 attempts per request, exponential backoff (`2s × attempt + jitter`) |
| Timeout | 90-second per-request HTTP timeout (sized for 18 MB payloads) |
| Empty-result mode | Exits cleanly with a helpful message (does **not** fail the run) when a search legitimately matches nothing |

***

### Frequently Asked Questions

#### How fresh is the data?

The actor scrapes h1bdata.info **live at run time**. h1bdata.info ingests new petitions every time the DOL publishes a new quarterly disclosure file (typically 8–12 weeks after the quarter closes). So FY 2024 Q4 petitions become visible roughly mid-2025, FY 2025 Q1 petitions in mid-to-late 2025, and so on. There is no faster public source for this data.

#### How many records exist in total?

The DOL has certified **8 million+** H1B / H1B1 / E3 petitions since fiscal year 2014. The exact number visible on any given day depends on which quarters h1bdata.info has ingested. A single popular query like `Google + Software Engineer` (all years) can return **30,000+ rows on its own**.

#### Why is `caseStatus` always `CERTIFIED`?

The US Department of Labor only publishes **approved** petitions in the public disclosure file. Denied, withdrawn, returned-for-correction, and under-review cases are **not disclosed** and therefore cannot appear in this dataset.

#### Does this scraper require login, API key, or CAPTCHA solving?

No. h1bdata.info is fully public, has no login, no CAPTCHA, no anti-bot system. You only need an Apify account to run the actor.

#### Do I need to use a proxy?

No. Proxy is disabled by default. h1bdata.info has no rate-limit or IP-based throttle. The proxy option exists only for very large parallel runs where IP diversity is desirable for politeness.

#### Why does my run sometimes take 20–30 seconds for a single query?

Popular queries (a famous employer + common title across all years) return **massive HTML payloads** — sometimes 18MB+ with 30,000+ rows. The 90-second per-request timeout is calibrated for exactly this case, and the streaming parser keeps memory bounded while it processes them. Smaller queries return in 2–5 seconds.

#### What happens if I supply an empty query?

h1bdata.info rejects a fully-empty query (returns no results). If you supply **no** employer, job title or city at all, the actor doesn't error — it returns a ready-made sample of top-employer 2024 salaries so every run yields useful data. When you *do* supply filters, it builds its task list from the cross-product of `employers × jobTitles × cities` and **skips** the all-empty combination. If a search legitimately matches zero rows, the run **exits cleanly with an explanatory message** (it does not fail), so a genuine no-match never dents the actor's success rate — read the run log if you expected results.

#### Does the actor return denied / withdrawn / pending petitions?

No — see above. Only DOL-certified petitions are in the public file.

#### Does the dataset include the foreign worker's name?

**No.** The DOL public-disclosure file deliberately omits the foreign worker's personal identity. The published fields are: petitioning **employer**, **job title**, **base wage offered**, **work location**, **submit date**, and **start date**.

#### Does it include SOC codes, prevailing-wage level, or worksite ZIP?

Not in the h1bdata.info interface. h1bdata.info publishes the user-friendly subset of the DOL file. For the full raw file (with SOC code, prevailing-wage level, full address, agent attorney, etc.) download the quarterly DOL disclosure files directly from [dol.gov/agencies/eta/foreign-labor/performance](https://www.dol.gov/agencies/eta/foreign-labor/performance) and join on employer + submit date.

#### Can I get green-card / PERM disclosure data?

PERM (permanent labor certification) is a separate DOL disclosure feed, not on h1bdata.info. It is on the roadmap as a separate Apify actor — open a feature request if you need it sooner.

#### Can I filter to only H1B (excluding H1B1 / E3)?

Not directly — h1bdata.info does not expose visa subtype on the result row. The vast majority of petitions in the file are H1B; H1B1 (Singapore/Chile) and E3 (Australia) together are <2% of volume.

#### How do I get every petition from a specific employer across all years?

```json
{ "employers": ["openai"], "jobTitles": [""], "year": "All Years", "maxRecords": 0 }
```

A blank job title combined with an employer will return every role that employer has ever sponsored. Set `maxRecords: 0` for unlimited.

#### What about employer-name variations (e.g. "Google" vs "Google LLC" vs "Alphabet Inc")?

h1bdata.info does **case-insensitive partial matching** on the employer string. `"google"` will match `GOOGLE LLC`, `GOOGLE INC.`, `GOOGLE PAYMENT CORP`, etc. For maximum recall, also try the parent name (`alphabet`) and any DBA / acquired-subsidiary names you know.

#### Why are some salary cells null?

Very rarely a row on h1bdata.info has a missing or malformed salary cell (an edge case in older 2014–2015 data). The actor parses what it can and emits `baseSalary: null` rather than dropping the row, so you can decide downstream how to handle them.

#### Pivot history — what was this actor before?

This actor was previously published as `salary-com-scraper`. After a usefulness audit it became clear that the underlying **Salary.com** data largely duplicated freely-available **BLS Occupational Employment Statistics** and **Glassdoor** content — not a niche worth maintaining. The actor was **repivoted to the H1B disclosure niche** in May 2026 because the source data is **genuinely unique, primary-source, federally-mandated, and very high-value** for immigration law, recruiting, journalism, and policy research. The actor ID is unchanged; only the source target, schema, and engine differ.

#### Does this work on the Apify Free Plan?

Yes — full functionality on the free tier. A typical filtered run costs a few cents in compute units.

#### Can I schedule this to run daily / weekly / monthly?

Yes — Apify's built-in Scheduler lets you trigger this actor on any cron expression. Combine with webhook outputs for fully automated H1B-intel pipelines.

#### What formats can I export the data in?

JSON, JSONL (streaming), CSV, Excel (XLSX), HTML, XML, RSS — directly from the Apify dataset view, or via the Apify REST API for programmatic consumers.

#### Are there competing data sources?

The two main competing surfaces are **MyVisaJobs** and **H1BGrader**. Both ultimately source from the same DOL disclosure file; h1bdata.info is the longest-running, fastest-querying, and least-monetized of the three, which is why it was chosen as the scrape target.

#### How do I report a bug or request a feature?

Open an issue on the Apify Store page or contact the developer directly through the Apify Console profile.

***

### Related Apify Actors by Haketa

If you're building a US labor-market, jobs, or federal-disclosure intelligence stack, these companion actors pair well with the H1B Visa Database Scraper:

- [SEEK Scraper (Australia / NZ)](https://apify.com/haketa/seek-scraper) — live job listings from APAC's largest job board
- [Levels.fyi Scraper](https://apify.com/haketa/levels-fyi-scraper) — self-reported tech compensation (base + equity + bonus) — the perfect complement to LCA wage data
- [ProductHunt Launches & Makers Scraper](https://apify.com/haketa/producthunt-launches-scraper) — daily startup launches, makers, votes & reviews — VC/founder/recruiter intel
- [TTB Alcohol Permittee Scraper](https://apify.com/haketa/ttb-alcohol-permittee-scraper) — another federal public-disclosure dataset (Treasury / TTB) in the same legal family
- [Bulk Company Name to Domain Finder](https://apify.com/haketa/bulk-company-domain) — resolve the employer names in your H1B results to official websites + logos for enrichment and lead-gen
- [Texas Pharmacy License Scraper — TSBP](https://apify.com/haketa/tsbp-license-scraper) — state-licensed pharmacist / pharmacy directory
- [Ohio eLicense Scraper](https://apify.com/haketa/ohio-elicense-scraper) — Ohio professional licenses
- [Illinois IDFPR License Scraper](https://apify.com/haketa/illinois-idfpr-license-scraper) — Illinois licensed professionals
- [California DCA Professional License Scraper](https://apify.com/haketa/california-dca-license-scraper) — California consumer-affairs licensees
- [Colorado Professional License Scraper](https://apify.com/haketa/colorado-professional-license-scraper) — Colorado DORA licenses
- [BBB Business Scraper](https://apify.com/haketa/bbb-scraper) — Better Business Bureau company profiles

***

### Comparison vs. Alternatives

| Approach | Setup time | Data freshness | Cost (10k rows) | Schema normalization | Filtering | Provenance |
|---|---|---|---|---|---|---|
| **This actor** | < 1 minute | Live at run | a few cents | Yes — built-in | Employer × Job × City × Year + salary band | Per-row source URL |
| Manual h1bdata.info browsing | Hours / days | Live | Free | None | UI only | None |
| DOL raw quarterly CSV download | 4–8 hours dev | 8–12 weeks lagged | Free + infra | DIY | DIY | Manual |
| MyVisaJobs paid subscription | Minutes | Live | $50–500+/mo | Yes | Limited UI | None |
| Custom Python + requests + BeautifulSoup | 1–2 days dev | Live | Free + infra | DIY | DIY | DIY |
| Hand-built per-employer cron + S3 + Athena | 1–2 weeks dev | Quarterly | $$$ | DIY | SQL | Manual |

***

### Why Pay-Per-Event Pricing?

Most data products either lock you into a monthly seat license (you pay even when idle) or charge per Compute Unit (unpredictable bills). This actor uses Apify's **pay-per-event** model:

- You only pay when the actor actually runs
- Charges scale linearly with how many rows you actually consume
- Transparent line-item billing in the Apify console
- No monthly minimums, no annual contracts
- Free to evaluate — set `maxRecords: 10` and validate the schema before scaling up
- Perfect for both one-off research projects and high-frequency production scrapers

***

### Keywords

H1B visa scraper · scrape H1B database · H1B salary database · H1B sponsor lookup · h1bdata.info scraper · US DOL H1B disclosure · H1B salary by employer · H1B salary by job title · H1B prevailing wage · H1B sponsorship history · immigration salary data · H1B visa API · LCA database scraper · Labor Condition Application data · DOL Office of Foreign Labor Certification scraper · H1B sponsor search · H1B sponsor history lookup · H1B base wage scraper · H1B job title salary · H1B petition data · H1B disclosure data extraction · H1B FAANG salaries · Google H1B salary · Meta H1B salary · Amazon H1B salary · Microsoft H1B salary · Apple H1B salary · NVIDIA H1B salary · OpenAI H1B salary · Infosys H1B petitions · TCS H1B petitions · Goldman Sachs H1B salary · JPMorgan H1B salary · H1B Bay Area salary · H1B NYC salary · H1B Seattle salary · H1B Austin salary · H1B Boston salary · immigration attorney data scraping · recruiter intel scraper · compensation benchmarking API · B2B intelligence · 1,000+ results pagination · bulk export JSON CSV Excel API.

***

### Support

- **Bug reports:** Use the **Issues** tab on the [Apify Store page](https://apify.com/haketa/h1b-visa-database-scraper)
- **Feature requests:** Same place — please describe your use case so we can prioritize realistically
- **Direct contact:** Through the Apify developer profile (haketa)
- **Roadmap requests welcome:** PERM / green-card disclosure scraper, H2B seasonal-worker scraper, USCIS receipt-number enrichment, prevailing-wage Level 1–4 inference

If this actor saves you time on immigration research, recruiter intel, comp benchmarking, or policy reporting, a **5-star rating** on the Apify Store helps other professionals discover it. Thank you.

***

### 📋 Changelog

| Version | Date | Notes |
|---|---|---|
| **v1.2** | **2026-11** | Unlocked **1,000+ deep extraction** (`maxRecords: 0` unlimited default when filters are provided, plus `maxItems` alias support), fast 100-item prefill (<30s), and explicit run status message updates before exit. |
| **v1.0.6** | **2026-11-01** | Quality pass — **fresh verification run: 500 certified petitions in ~5 s with 100% core-field coverage and a 0.00% duplicate rate**, plus a 215-row three-employer merge confirming cross-product de-duplication. |
| **v1.0.5** | **2026-10-25** | Streaming `<tbody>` parser (handles 18 MB / 30k-row pages without OOM), 90-second request timeout, **DOL case-number primary de-dup key**, 200-row batched pushes, and clean exit when a search legitimately matches nothing. |
| **v1.0.4** | **2026-07-02** | Maintenance release — data pipeline tested for quality, structure and freshness; endpoints confirmed against the live site. |
| **v1.0.0** | **2026-05-18** | Initial public release of the H1B Visa Database Scraper — full filter parity, salary-band post-filter, and deduplication. |

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/h1b-visa-database-scraper/changelog.md

# Actor input Schema

## `popularEmployers` (type: `array`):

Select one or more well-known sponsors to pull their H1B salary filings. This is the easy path — no typing needed. Combine with the fiscal year below. For a company not listed here, use the 'Other employers' box.

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

US DOL fiscal year of the H1B petition. Pick 'All years' for the full history, or a single year for a focused, faster result.

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

Optional. Type any employer name for a company not in the dropdown above (case-insensitive partial match). Examples: 'stripe', 'databricks', 'two sigma'. Each name runs as its own search.

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

Optional. Narrow results to specific roles (partial match). Examples: 'software engineer', 'data scientist', 'product manager', 'machine learning engineer'. Leave empty for all roles.

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

Optional. Filter results to specific US cities (case-insensitive). Examples: 'san francisco', 'new york', 'austin', 'seattle'. Leave empty for nationwide.

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

Optional. Only return petitions with a base salary at or above this amount. Leave 0 for no minimum.

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

Optional. Only return petitions with a base salary at or below this amount. Leave 0 for no maximum.

## `maxRecords` (type: `integer`):

Maximum number of petitions to return in total. A single popular employer can have 20,000+ filings, so keep this capped for fast, focused runs. Set 0 for unlimited.

## `startUrls` (type: `array`):

Advanced / power users only — you do NOT need this. Paste a ready-made h1bdata.info search URL and it overrides the fields above. Most users should just use the dropdowns and search boxes.

## `requestDelay` (type: `integer`):

Delay between requests. A value of 500-2000ms keeps runs smooth and polite.

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

Optional. Only needed if you want IP rotation for very large jobs. The default works out of the box.

## Actor input object example

```json
{
  "popularEmployers": [],
  "year": "2024",
  "employers": [],
  "jobTitles": [],
  "cities": [],
  "minSalary": 0,
  "maxSalary": 0,
  "maxRecords": 100,
  "startUrls": [],
  "requestDelay": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

The scraped H1B petitions. Open the Overview tab or download as JSON, CSV or Excel.

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

Employer, job title, base salary, location, dates, year and case status for each petition.

# 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": [],
    "jobTitles": [],
    "cities": [],
    "maxRecords": 100,
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/h1b-visa-database-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": [],
    "jobTitles": [],
    "cities": [],
    "maxRecords": 100,
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/h1b-visa-database-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": [],
  "jobTitles": [],
  "cities": [],
  "maxRecords": 100,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call haketa/h1b-visa-database-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/h1b-visa-database-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/3A8G0CPQJEBRiQ75v/builds/toYRj435cIP4T53Av/openapi.json
