H-1B LCA & PERM Wage Data API – Employer Salaries (US DOL)
Pricing
from $1.40 / 1,000 cases
H-1B LCA & PERM Wage Data API – Employer Salaries (US DOL)
Employer wages from US DOL H-1B LCA & PERM disclosure files: employer, job title, worksite, offered wage, decision date. For immigration, staffing & salary research. Free sample (100 rows, real output): https://drive.google.com/uc?export=download&id=1KYPawajTeWfvgxUcHDtBwaqXC3MiQrUv
Pricing
from $1.40 / 1,000 cases
Rating
0.0
(0)
Developer
Groundplane Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Security
Limited permissionsShare
H-1B LCA & PERM Employer Salary Data Scraper (US DOL)
Filter official quarterly U.S. Department of Labor (DOL) Office of Foreign Labor Certification (OFLC) disclosure workbooks (LCA_Disclosure_Data_FY*.xlsx and PERM_Disclosure_Data_FY*.xlsx) by sponsoring employer, job title keyword, SOC occupation code, worksite state, case status, and minimum annualized offered wage.
Free sample
Download a free sample (100 rows, real actor output, CSV): https://drive.google.com/uc?export=download&id=1KYPawajTeWfvgxUcHDtBwaqXC3MiQrUv — check the columns and data quality before you run anything.
What it does
Every employer sponsoring an H-1B, H-1B1, or E-3 specialty occupation worker must file a Labor Condition Application (Form ETA-9035/9035E), and employers sponsoring employment-based green cards file Application for Permanent Employment Certification (Form ETA-9089 / PERM). The DOL OFLC publishes cumulative fiscal-year disclosure data quarterly, but the raw .xlsx files exceed 150–240 MB and contain nearly 100 columns whose names shift across fiscal years.
This Actor:
- Automatically discovers and streams the newest quarterly
LCA_Disclosure_Data_FY*.xlsxorPERM_Disclosure_Data_FY*.xlsxdisclosure file fromdol.gov/agencies/eta/foreign-labor/performanceto temporary disk. - Parses the workbook with a streaming reader built for these files (the sheet XML alone can exceed 1 GB) and maps columns through a cross-year alias dictionary (
WAGE_RATE_OF_PAY_FROMvsWAGE_RATE_OF_PAY_FROM_1, etc.). If a core column disappears from a future DOL file, the run fails loudly naming the missing column instead of returning rows with silently empty fields. - Annualizes hourly (
×2,080), weekly (×52), bi-weekly (×26), and monthly (×12) wage rates intowageAnnualFromUsdandprevailingWageAnnualUsdfor consistent salary filtering and comparison. - Prevailing wage is an LCA-only field. DOL OFLC does not publish a prevailing-wage amount in the PERM disclosure file (the official PERM record layout contains only the offered wage,
JOB_OPP_WAGE_*), soprevailingWageandprevailingWageAnnualUsdare alwaysnullon PERM rows — usewageFrom/wageAnnualFromUsdfor PERM salary benchmarking. PERM runs say this in their final status message so the empty fields are never a surprise. - Keeps employer point-of-contact and immigration attorney fields (
pocName,pocEmail,pocPhone,attorneyName,attorneyEmail) off by default (includeContacts: false), outputting them only when explicitly requested.
Found a problem or need a field? Open an issue on the Issues tab; we respond quickly.
Who it's for
- Compensation, people-analytics, and recruiting teams benchmarking verified base salaries — and, for LCA cases, prevailing wage levels — by job title, SOC code, and worksite city/state.
- HRTech, global mobility, and relocation providers identifying companies that actively sponsor H-1B and PERM talent.
- Corporate immigration law firms analyzing employer sponsorship volumes and outside counsel representation (
lawFirmName). - Job seekers and labor economists researching visa-sponsoring employers and salary ranges.
Input
programType(string enum) —"LCA_H1B"(default; H-1B, H-1B1, and E-3 Labor Condition Applications) or"PERM"(Permanent Employment Certification).employerNames(array of strings) — Optional list of case-insensitive employer name substrings (e.g.["Intel", "American Express"]). Default:[](all employers).jobTitleKeyword(string) — Case-insensitive keyword matched againstjobTitle. Default:"software".socCodePrefix(string) — Optional Standard Occupational Classification prefix (e.g."15-"for Computer and Mathematical Occupations). Default:"".worksiteStates(array of strings) — Two-letter US state codes for the worksite. Default:["AZ"]. Leave empty ([]) for all states.caseStatuses(array of strings) — Case statuses to include ("Certified","Certified - Withdrawn","Certified-Expired","Denied","Withdrawn"). Default:["Certified"].minWageAnnualUsd(integer) — Minimum annualized offered base wage in USD. Default:0.decisionDateFrom(string, YYYY-MM-DD) — Optional earliest decision date filter. Default:"".includeContacts(boolean) — Defaults tofalseto omit employer point-of-contact and attorney contact fields (pocName,pocEmail,pocPhone,attorneyName,attorneyEmail).maxItems(integer) — Maximum rows to return. Default:200.
Example input JSON
{"programType": "LCA_H1B","employerNames": [],"jobTitleKeyword": "software","socCodePrefix": "","worksiteStates": ["AZ"],"caseStatuses": ["Certified"],"minWageAnnualUsd": 0,"decisionDateFrom": "","includeContacts": false,"maxItems": 200}
Example run options (default max charge $50)
Set a default maximum charge of $50 ("maxTotalChargeUsd": 50) in your run options (the Actor's default memory is preconfigured to 4,096 MB in actor.json):
{"maxTotalChargeUsd": 50,"memoryMbytes": 4096}
Output
Results are deduplicated by caseNumber and sorted newest first by decisionDate descending.
| Field | Type | Description |
|---|---|---|
caseNumber | string | Unique DOL OFLC case number. |
programType | string | "LCA_H1B" or "PERM". |
caseStatus | string | null | Case adjudication status (Certified, Denied, Withdrawn, etc.). |
receivedDate | string | null | Application filing date (YYYY-MM-DD). |
decisionDate | string | null | Adjudication decision date (YYYY-MM-DD). |
employerName | string | null | Legal business name of the sponsoring employer. |
employerCity | string | null | Employer headquarters city. |
employerState | string | null | Employer headquarters 2-letter state code. |
employerFein | string | null | Employer FEIN if published in the disclosure file (null when redacted by DOL). |
jobTitle | string | null | Offered job title. |
socCode | string | null | SOC occupational code (e.g. 15-1252.00). |
socTitle | string | null | SOC occupational title (e.g. Software Developers). |
fullTime | boolean | null | Whether the position is full-time (true/false). |
wageFrom | number | null | Offered base wage (lower bound). |
wageTo | number | null | Offered base wage (upper bound, if range). |
wageUnit | string | null | Pay unit (Year, Hour, Month, Bi-Weekly, Week). |
wageAnnualFromUsd | number | null | Annualized offered base wage in USD. |
prevailingWage | number | null | Prevailing wage rate on the application. LCA only — DOL does not publish a prevailing wage for PERM, so PERM rows are always null. |
prevailingWageAnnualUsd | number | null | Annualized prevailing wage in USD. LCA only — always null for PERM. |
worksiteCity | string | null | Primary worksite city. |
worksiteState | string | null | Primary worksite 2-letter state code. |
lawFirmName | string | null | Representing immigration law firm business name. |
sourceFile | string | Name of the DOL OFLC disclosure workbook parsed. |
pocName | string | null | Employer point-of-contact name (only when includeContacts is true). |
pocEmail | string | null | Employer point-of-contact email (only when includeContacts is true). |
pocPhone | string | null | Employer point-of-contact phone (only when includeContacts is true). |
attorneyName | string | null | Representing attorney name (only when includeContacts is true). |
attorneyEmail | string | null | Representing attorney email (only when includeContacts is true). |
Sample output row (synthetic example)
{"caseNumber": "I-200-26150-999999","programType": "LCA_H1B","caseStatus": "Certified","receivedDate": "2026-06-01","decisionDate": "2026-06-08","employerName": "EXAMPLE SEMICONDUCTOR SYSTEMS INC","employerCity": "CHANDLER","employerState": "AZ","employerFein": "99-9999999","jobTitle": "Senior Systems Software Engineer","socCode": "15-1252.00","socTitle": "Software Developers","fullTime": true,"wageFrom": 168000.0,"wageTo": 195000.0,"wageUnit": "Year","wageAnnualFromUsd": 168000.0,"prevailingWage": 146200.0,"prevailingWageAnnualUsd": 146200.0,"worksiteCity": "CHANDLER","worksiteState": "AZ","lawFirmName": "Example Global Immigration LLP","sourceFile": "LCA_Disclosure_Data_FY2026_Q3.xlsx"}
How pricing works
Pay per result. You only pay for rows returned. Set "maxTotalChargeUsd": 50 in your run options to cap spend automatically.
Data source and terms
- Official source: U.S. Department of Labor ETA — Office of Foreign Labor Certification (OFLC) Performance Data.
- Update frequency: Cumulative fiscal-year disclosure files are published quarterly by DOL OFLC (not daily or real-time).
- Affiliation disclaimer: This Actor is an independent tool and is not affiliated with or endorsed by the U.S. Department of Labor (DOL) or the Employment and Training Administration (ETA).
Compliance
When includeContacts is enabled, the dataset includes corporate employer point-of-contact and immigration counsel contact fields published in the official DOL OFLC disclosure files. Buyers are solely responsible for complying with the Telephone Consumer Protection Act (TCPA), the National Do-Not-Call Registry, the CAN-SPAM Act, and all applicable federal and state privacy laws before any business outreach. Do not use this Actor for consumer or individual targeting.
Troubleshooting
- The run ends PARTIAL with a "stale" note. DOL OFLC publishes cumulative disclosure files quarterly, so the newest decisions in the file can be weeks or months old. When the newest decision in the file is more than ~4 months old, the run reports PARTIAL and tells you the exact date, rather than calling old data current.
prevailingWageis empty on PERM rows. That's the source, not a bug: DOL OFLC does not publish a prevailing-wage amount in the PERM disclosure file. Prevailing-wage fields are populated for LCA runs only; PERM runs note this in their final status message.- The run ends with "0 cases matched your filters". The whole file was scanned and nothing matched. Widen
worksiteStates, clearemployerNames/jobTitleKeyword/socCodePrefix, or lowerminWageAnnualUsd. An empty result is a completed run, not an error. - The run stops early at the max charge limit. Results are newest-first, so you already have the most recent cases. Raise
maxTotalChargeUsdin the run options to get more. - Canary / smoke-test input:
{ "maxItems": 5 }with the other defaults (LCA, "software", AZ, Certified). A healthy canary returns 5 rows and ends Complete, or PARTIAL with the stale note above while the current quarterly file is old.
Limits and FAQ
- Why is memory set to 4,096 MB?
Quarterly DOL OFLC
.xlsxworkbooks are 150–240+ MB compressed Archives containing 400,000+ rows and a large XML shared-strings table. Running with 4 GB RAM ("memoryMbytes": 4096) prevents out-of-memory errors while streaming rows. - How are hourly or monthly wages compared against
minWageAnnualUsd? The Actor convertsHour(× 2,080),Week(× 52),Bi-Weekly(× 26), andMonth(× 12) pay units into an annualized USD figure (wageAnnualFromUsd).
Changelog
-
v0.4 (2026-10-27): docs: free-sample section + store refresh; no code changes.
-
v0.3 (2026-10-27): Red Team fix round. PERM prevailing wage is now disclosed instead of silently empty: DOL does not publish it for PERM, the README and PERM run status say so, and the prevailing-wage amount/unit pair is guarded (an LCA file missing either fails loudly; the prevailing wage is never annualized with the offered wage's unit).
worksiteCityandsocCodejoined the core-column drift check (a rename could silently lose rows / zero a filtered run). Charge-limit PARTIALs carry the Issues CTA only when a source-caused reason coexists. The post-push dataset count check now reads the real stored count (it previously read 0 on every run and warned spuriously). A workbook with a missing shared-strings table fails with a schema-drift diagnosis, and an empty/truncated source file fails instead of reporting "0 cases matched". -
v0.2 (2026-10-26): Hardening pass. Core-column schema-drift check (a renamed DOL column now fails the run loudly instead of silently nulling fields); state prefilter can no longer drop every row if the file's string table changes; zero-match runs complete honestly instead of failing; charge-limit stops and stale quarterly files report PARTIAL with the reason; dataset count verified after push.
-
v0.1 (2026-10-23): Initial release supporting dynamic quarterly LCA & PERM
.xlsxdiscovery, cross-year column aliases, wage annualization, and contact privacy controls.