Persistfolio
DATASET

H-1B LCA disclosure data, FY2010-FY2025, without cleaning 34 Excel files.

8,918,577 case rows, 8,238,223 unique applications, 9,375,219 worksite rows and a 1,916,599-row employer x occupation x fiscal-year panel, each row traceable to its DOL source file and row.

H-1B LCA Employer x Occupation Dataset, FY2010-FY2025

US$149 one time — Individual / Academic (one named individual)

US$399 one time — Business / Commercial internal use (one legal entity)

The free sample is not an excerpt of one year: it spans all sixteen fiscal years and deliberately includes hard records (unresolved SOC mappings, uncertain employer identity, applications with repeated histories), so its rates are not the dataset’s rates. It is a separate download, not part of the paid ZIP. It has the same redactions as the full dataset. No email is required. It contains: cases (all 16 fiscal years, with sample tags for difficult records), worksites and applications for those cases, the full history and panel rows of 282 employers, the audited employer-identity groups with labels, data dictionary and README.

Read the known limitations before you buy

Who is this dataset for?

  • Immigration-policy, labor-economics and workforce researchers who need sixteen years of LCA filings in one schema
  • Compensation and talent-intelligence analysts benchmarking offered wages by occupation, state and employer
  • Data engineers who would otherwise reconcile 34 DOL spreadsheets with changing layouts and cumulative quarterly files

What can you do with it?

Benchmark offered wages by occupation and state

Filter ORIGINAL_DECISION rows in the case files by soc_code_std and primary_ws_state, and compare wage_annual_from_calc with the prevailing-wage level where it is filed.

Study sponsor volume without double counting

Count unique filings with row_role and the applications table instead of raw rows, so repeated year-to-date snapshots are not counted twice.

Trace any figure back to the DOL file

Every row keeps source_file and source_row; the SOURCE_INVENTORY lists the 34 DOL files with SHA-256 so a result can be checked against the original workbook.

How to use the files

  1. Download the free sample and open README.md and the data dictionary to learn the columns, row roles and identity flags.
  2. Read LIMITATIONS and the ZIP corrections before you rely on a number; check employer_id quality for the employers you care about.
  3. Query the Parquet files directly with DuckDB or pandas; start from the applications and panel tables for counts.
Example: median offered wage for software developers in Texas, FY2025

Filter cases_fy2025 to row_role = ORIGINAL_DECISION, primary_ws_state = TX and soc_code_std in (15-1252); take the median of wage_annual_from_calc over the rows where it is not null, and report the row count next to it.

Try real records before buying

The table below uses actual rows from this release’s free sample, not simulated data. Blank cells are left blank as supplied. The preview is shortened for readability; download the sample for all columns and complete cell values.

source_fycase_statussoc_code_stdemployer_name_rawprimary_ws_statewage_annual_from_calc
2024CERTIFIED-WITHDRAWN15-1299Entergy Services, LLCTX106000.0
2024CERTIFIED-WITHDRAWN15-1299Entergy Services, LLCLA125000.0
2024CERTIFIED15-1211Shared Technology Services Group LLCMA131999.0
2024CERTIFIED15-1252Resolve Tech Solutions LLCTX120000.0
2024CERTIFIED15-1252Resolve Tech Solutions LLCTX180000.0
2024CERTIFIED19-1029DICERNA PHARMACEUTICALS, INC.MA155000.0
2024CERTIFIED17-2074UT-BATTELLE, LLC (OAK RIDGE NATIONAL LABORATORY)TN108000.0
2024CERTIFIED15-1252KODESYSTEMS LLCTX101192.0

Download sample CSV — no account or email required → · Full sample package (ZIP) →

Which edition and license should you buy?

One fixed edition (2026-10-09) covering DOL fiscal years 2010 to 2025, delivered as Parquet only. The Individual / Academic tier is for one named person’s academic or professional work; the Business / Commercial tier is for internal use within one legal entity. Neither allows redistribution.

Why buy this instead of using free source data?

The free DOL files must otherwise be found, converted from Excel, mapped across layout changes and SOC vintages, de-duplicated across cumulative quarterly files and reconciled to DOL totals. This edition does that once and documents where it still falls short.

What happens after payment?

After secure checkout you receive a private download link for one ZIP (49 files) with the Parquet tables, data dictionary, methodology, limitations, QA files and checksums. Read the ZIP corrections: some documents inside the ZIP are older than the ones on this site.

8,918,577
case rows (H-1B)
8,238,223
unique applications
1,916,599
panel rows
16
fiscal years, 34 source files

What You Get

  • Case files, one per fiscal year (8,918,577 rows, 71 columns)
  • Worksites (9,375,219 rows)
  • Applications (8,238,223 rows, one per case number)
  • Employer x occupation x fiscal-year panel (1,916,599 rows, 45 columns)
  • SOC 2000-to-2010 and 2010-to-2018 crosswalk tables
  • Data dictionary, methodology, limitations, release notes, patch notes, quality report, certification report, changelog, release metadata, SHA-256 checksums and manifest, and the 34-file source inventory
  • QA files: reconciliation to DOL published totals, tie-out and verification results, the identity audit, the independent review report, and the privacy redaction ledger (the 4,608 changed cells, without their values)

What This Does Not Contain

  • FEIN, contact-person, attorney/agent and preparer columns, employer street addresses and phones, and law-firm fields.
  • Any claim that an employer id is a legal entity or corporate family.
  • CSV files (this edition is Parquet only).
  • Updates after FY2025, or an API.

What the file does that the raw DOL files do not

  • Unique applications and status records are separate columns, so counts are not double-counted across fiscal years or cumulative quarterly files.
  • Every row carries its source file and row; filed values stay next to the normalized ones.
  • SOC vintage and mapping class are explicit; split mappings list candidates instead of inventing one code.
  • Known limitations and reconciliation exceptions are published, not hidden.

Coverage & Product Facts

Coverage
2009-10-01 – 2025-09-30
Source
U.S. Department of Labor, Office of Foreign Labor Certification (OFLC), LCA disclosure data (H-1B rows; the FY2010 file has no visa-class column, so every FY2010 row is assumed to be H-1B); 34 source files with SHA-256 recorded in the package.
Observation Frequency
One row per filing/status record in each DOL fiscal-year or quarterly disclosure file
Release
h1b-lca-fy2010-fy2025-2026-10-09 (2026-10-09)
Formats
Parquet (no CSV files in this edition)
Update Policy
No updates are promised. A later edition is a separate release with its own release id.

Methodology & QA

H-1B rows of 34 DOL disclosure files are mapped to one schema with source file and row kept on every row. Unique applications are keyed on case number; repeated year-to-date snapshots and later status events are separate row roles. The certified/withdrawn classification is a provisional rule (and an estimate for FY2010-FY2015). Employer ids follow the provisional R5-v1 policy and can be undone through employer_id_l1. The material limitations known to us are listed on this page and in LIMITATIONS.md in the package; the redaction, identity and reconciliation exceptions are explained there in full.

Read the full methodology →

Certification status: Engineering: certified with documented exceptions, based on builder QA and one AI reviewer; no human audit has been done. No independent human audit and no legal opinion on rights or license have been obtained; the license is the Persistfolio Data License v1.0. — read the full certification report →

Data Dictionary

FileFieldTypeDescription
casescase_numberVARCHARDOL LCA case number as filed (format I-200-YYDDD-NNNNNN). One application has one case number; the same case number can appear in several rows (status records).
casessource_keyVARCHARWhich DOL file this row came from: fiscal year (2010-2019 annual) or year+quarter (2020Q1-2025Q4). Lineage key with source_row.
casessource_quarterINTEGERQuarter number (1-4) for quarterly files; empty for annual files.
casessource_fyINTEGERU.S. federal fiscal year (Oct 1 - Sep 30) of the DOL file.
casessource_fileVARCHAROriginal DOL file name. SHA-256 of each file is in SOURCE_INVENTORY.csv.
casessource_rowBIGINTWorksheet row number in the original DOL workbook, header = row 1; non-H-1B rows and blank padding rows are counted, so values have gaps. With source_key it identifies the row uniquely.
casescase_statusVARCHARDOL case status as filed, upper-cased; 'Certified - Withdrawn' is written CERTIFIED-WITHDRAWN from FY2020 on (CERTIFIED, DENIED, WITHDRAWN, CERTIFIED-WITHDRAWN; a few other filed values in FY2013-FY2014). Meaning is not otherwise changed.
casesdol_stats_statusVARCHARPersistfolio's classification of the row into DOL's four published status counts (CERTIFIED, DENIED, WITHDRAWN). CERTIFIED-WITHDRAWN rows are split by a rule that is PROVISIONAL (not documented by DOL); for FY2010-FY2015 it uses a submit-date proxy. Empty for statuses outside the four.
casesdol_stats_status_basisVARCHARHow dol_stats_status was decided (STATUS_AS_FILED, ORIGINAL_CERT_DATE_VS_FY_START, SUBMIT_DATE_PROXY_NO_ORIGINAL_CERT_DATE_IN_SOURCE, NO_ORIGINAL_CERT_DATE_IN_SOURCE_ASSUMED_CERTIFIED). Rows classified without an original certification date are estimates.
casescase_submittedTIMESTAMPDate the LCA was submitted, as filed (FY2010-FY2015 files use a differently named column; mapped here).
casesdecision_dateTIMESTAMPDate DOL decided the case, as filed.
casesoriginal_cert_dateTIMESTAMPORIGINAL_CERT_DATE as filed. Present in FY2016 onward; empty for FY2010-FY2015 (column does not exist in those files).
casesfirst_seen_fyINTEGEREarliest fiscal year in which this case number appears in the loaded files.
casesn_fy_appearancesBIGINTNumber of fiscal years in which this case number appears in the loaded files.
casesrow_roleVARCHARORIGINAL_DECISION (first decision record of an application in the loaded files); LATER_STATUS_EVENT (a later status record, for example certified then withdrawn); REPEATED_SNAPSHOT (identical copy of an earlier file's row, produced by cumulative year-to-date files; not a new event). Count applications with ORIGINAL_DECISION only.
casesrow_role_evidenceVARCHARWhy the role was assigned (tokens joined by +): ORIG_CERT_DATE_BEFORE_PERIOD, SUBMIT_DATE_PROXY_BEFORE_PERIOD, EARLIER_LOADED_ROW, DUPLICATE_CASE_NUMBER_WITHIN_FILE, IDENTICAL_TO_EARLIER_FILE_ROW. Empty for ORIGINAL_DECISION.
casesvisa_classVARCHARVisa class as filed. All rows in this product are H-1B. FY2010 has no visa-class column: all FY2010 rows are ASSUMED H-1B (see LIMITATIONS).
casesjob_titleVARCHARJob title as typed by the employer. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesfull_time_positionVARCHARFull-time position flag as filed (Y/N).
casestotal_worker_positionsINTEGERNumber of worker positions requested, as filed (TOTAL_WORKER_POSITIONS / TOTAL WORKERS). Does NOT reproduce DOL published position totals (+2% to +4%); unsupported for reconciliation.
casesperiod_startTIMESTAMPIntended employment begin date, as filed.
casesperiod_endTIMESTAMPIntended employment end date, as filed.
casessoc_code_rawVARCHARSOC code as filed, with any Excel formula wrapper removed. Some FY2010-FY2012 and FY2022 values were converted to dates by Excel inside DOL's files and are unreadable; they are kept as filed.
casessoc_title_rawVARCHARSOC occupation title as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casessoc_code_stdVARCHARFiled SOC code standardized only in format (e.g. 15-1132; O*NET suffix .00 removed). Never mapped to a different code. Empty if unparseable.
casessoc_std_methodVARCHARHow soc_code_std was produced (AS_FILED, ONET_8DIGIT_TRUNCATED, UNPARSEABLE, ...).
casessoc_vintage_usedVARCHARSOC classification vintage in which soc_code_std was found: 2000, 2010 or 2018. Empty when the code is in no vintage (for example legacy 15-1799).
casessoc_vintage_basisVARCHARWhy that vintage was chosen (expected vintage for the file from code evidence, then fallback order).
casessoc_vintage_evidenceVARCHARThe code evidence behind the vintage choice (which vintages contain the code).
casessoc_mapping_classVARCHARResult of mapping the filed code to SOC 2018: ONE_TO_ONE, SPLIT_UNRESOLVED (several 2018 codes possible), NOT_IN_CROSSWALK_*, INVALID_OR_MISSING, and others. Check before aggregating across vintages.
casessoc2018_codeVARCHARSOC 2018 code, filled ONLY for one-to-one mappings.
casessoc2018_candidatesVARCHARFor split mappings: the candidate SOC 2018 codes (pipe separated). A candidate list, not a choice.
casesemployer_name_rawVARCHAREmployer legal name as filed, whitespace-trimmed. May contain filer-typed text such as numbers (see LIMITATIONS 12). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesemployer_dba_rawVARCHAREmployer trade name (d/b/a) as filed. May contain filer-typed text such as numbers (see LIMITATIONS 12). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesemployer_idVARCHARPersistfolio employer key after the R5-v1 identity rule. PROVISIONAL analytical key, not a statement about corporate identity. For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
casesemployer_id_l1VARCHAREmployer key from the name-normalization step before any R5 split. Join on this to undo every split. For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
casesevidence_component_idVARCHAROpaque id of the disconnected evidence component (address, phone, sector) the row belongs to inside its name group. Not derivable from any published column (LIMITATIONS 15).
casesidentity_split_statusVARCHARSPLIT_R5 (name split into several ids by R5-v1), MERGED_BACK_NO_POSITIVE_DISTINCTNESS, NOT_APPLICABLE_SINGLE_COMPONENT, NOT_EVALUABLE_MISSING_INDUSTRY_OR_STATE.
casesidentity_policy_versionVARCHARIdentity rule version (R5-v1).
casesemployer_key_l1VARCHARNormalized employer name key (upper-case, punctuation and accents removed, HTML artifacts cleaned). Derived, not a legal name. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesidentity_statusVARCHARAS_FILED (single spelling), NORMALIZED (several spellings merged by name rule), UNRESOLVED_REVIEW (name with unresolved variants or disconnected evidence).
casesidentity_flagsVARCHARPipe-separated flags, for example MULTI_SPELLING_MERGED_BY_L1, LEGAL_SUFFIX_VARIANT_CANDIDATE_UNMERGED, SPACING_VARIANT_CANDIDATE_UNMERGED, SAME_NAME_DISCONNECTED.
casesn_evidence_componentsBIGINTNumber of disconnected evidence components in the name group (more than 1 means one name spans separate addresses/phones).
casescandidate_group_idVARCHAROptional link to possibly related names (shared looser name key). NEVER an assertion that the names are one company. For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
casesemployer_cityVARCHAREmployer city as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesemployer_stateVARCHAREmployer state as filed.
casesemployer_postal5_cleanVARCHAREmployer ZIP reduced to 5 digits when the filed value is a valid ZIP.
casesemployer_postal_methodVARCHARHow the 5-digit ZIP was derived.
casesnaics_codeVARCHARNAICS code as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesh1b_dependentVARCHARH-1B dependent employer flag as filed for this filing (Y/N). A per-filing fact, not an attribute of a company.
caseswillful_violatorVARCHARWillful violator flag as filed for this filing (Y/N). A per-filing fact, not an attribute of a company.
casesprimary_ws_cityVARCHARCity of the first worksite listed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casesprimary_ws_stateVARCHARState of the first worksite listed.
casesprimary_ws_postal5_cleanVARCHAR5-digit ZIP of the first worksite when valid.
casesprimary_ws_postal_methodVARCHARHow the worksite ZIP was derived.
casesn_worksites_with_locationBIGINTNumber of worksite slots with a location in the filing.
casesn_wage_only_dup_slotsBIGINTWorksite slots that repeat only a wage line (not counted as separate locations).
casesn_distinct_wage_tuples_locatedBIGINTDistinct located wage tuples across worksites.
casesworksite_statesVARCHARPipe-separated worksite states.
caseswage_from_rawVARCHAROffered wage (low end) as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
caseswage_to_rawVARCHAROffered wage (high end) as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
caseswage_unit_rawVARCHAROffered wage unit as filed (Year, Hour, Week, Bi-Weekly, Month). FY2010 has no unit column: the unit is INFERRED from the prevailing-wage unit.
caseswage_annual_from_calcDOUBLEOffered wage low end converted to an annual amount. Use ONLY where wage_status starts with OK_. Rows with wage_status AMBIGUOUS can carry a populated but unreliable value (some absurd); ignore it.
caseswage_annual_to_calcDOUBLEOffered wage high end annualized under the same rule; use only where wage_status starts with OK_.
caseswage_statusVARCHAROK_AS_FILED_ANNUAL, OK_CONVERTED, AMBIGUOUS, UNSUPPORTED_*, MISSING. Use the OK_* values for wage statistics.
caseswage_flagsVARCHARPipe-separated wage plausibility flags.
caseswage_unit_correction_candidate_not_appliedVARCHARSet when the filed unit looks wrong (for example hourly figure with Year unit). Reported, never applied.
casespw_rawVARCHARPrevailing wage as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
casespw_unit_rawVARCHARPrevailing wage unit as filed.
casespw_level_rawVARCHARPrevailing wage level as filed (FY2015, FY2017-FY2019 'Level I-IV'; FY2020 on 'I'-'IV'). Empty for FY2010-FY2014 and FY2016 (no such column in those files).
casespw_annualDOUBLEPrevailing wage annualized when the unit is supported.
worksitescase_numberVARCHARDOL LCA case number as filed (format I-200-YYDDD-NNNNNN). One application has one case number; the same case number can appear in several rows (status records).
worksitessource_keyVARCHARWhich DOL file this row came from: fiscal year (2010-2019 annual) or year+quarter (2020Q1-2025Q4). Lineage key with source_row.
worksitessource_fyINTEGERU.S. federal fiscal year (Oct 1 - Sep 30) of the DOL file.
worksitessource_rowBIGINTWorksheet row number in the original DOL workbook, header = row 1; non-H-1B rows and blank padding rows are counted, so values have gaps. With source_key it identifies the row uniquely.
worksitesslotINTEGERWorksite slot number (1-N) within the filing.
worksitesworksite_workers_rawVARCHARWorkers at this worksite as filed.
worksitesws_cityVARCHARWorksite city as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksitesws_countyVARCHARWorksite county as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksitesws_stateVARCHARWorksite state as filed.
worksitesws_postalVARCHARWorksite postal code as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksitesis_location_bearingBOOLEANTrue when the slot carries a worksite location.
worksiteswage_from_rawVARCHAROffered wage (low end) as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksiteswage_to_rawVARCHAROffered wage (high end) as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksiteswage_unit_rawVARCHAROffered wage unit as filed (Year, Hour, Week, Bi-Weekly, Month). FY2010 has no unit column: the unit is INFERRED from the prevailing-wage unit.
worksitespw_rawVARCHARPrevailing wage as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksitespw_unit_rawVARCHARPrevailing wage unit as filed.
worksitespw_level_rawVARCHARPrevailing wage level as filed (FY2015, FY2017-FY2019 'Level I-IV'; FY2020 on 'I'-'IV'). Empty for FY2010-FY2014 and FY2016 (no such column in those files).
worksitespw_source_rawVARCHARPrevailing wage source as filed (for example OES). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksitespw_source_year_rawVARCHARPrevailing wage source year as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
worksitesis_wage_only_dup_of_slot1BOOLEANTrue when the slot only repeats a wage line of slot 1 (not a separate location).
applicationscase_numberVARCHARDOL LCA case number; one row per case number across all loaded files.
applicationsn_status_records_loadedBIGINTNumber of distinct status records for the case in the loaded files (repeated snapshots excluded).
applicationsn_repeated_snapshot_rows_loadedBIGINTRows for the case that are identical copies of earlier file rows (cumulative files). Not events.
applicationsstatus_history_loadedVARCHARStatus history across files, "source_key:status > source_key:status", repeated snapshots excluded.
applicationsemployer_idVARCHAREmployer key (R5-v1; provisional) of the case. For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
applicationssoc_code_stdVARCHARFiled SOC code, format-standardized.
applicationspositions_requestedINTEGERMaximum worker positions requested across the case's records, as filed.
applicationsn_distinct_positions_across_recordsBIGINTNumber of distinct position counts across records; more than 1 means the filings disagree.
applicationsoriginal_decision_fy_loadedINTEGERFiscal year of the case's original decision record, if loaded.
applicationsoriginal_decision_source_key_loadedVARCHARSource file of the original decision record, if loaded.
applicationsoriginal_row_statusVARCHARORIGINAL_LOADED, or ORPHAN_ORIGINAL_PERIOD_NOT_LOADED when only later status records exist in the loaded files.
applicationsoriginal_cert_fy_inferredINTEGERFiscal year implied by ORIGINAL_CERT_DATE, when present.
applicationslatest_status_in_loaded_filesVARCHARLatest status in the loaded files. Not necessarily the final status.
applicationslatest_loaded_fyINTEGERLatest fiscal year in which the case appears.
applicationsfinal_status_confidenceVARCHARTERMINAL_IN_LOADED_FILES, or OPEN_FINAL_STATUS_UNKNOWN_LATER_PERIODS_NOT_LOADED (a CERTIFIED case could still be withdrawn later; the last file ends at FY2025).
panelemployer_idVARCHAREmployer key (R5-v1; provisional). For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
panelemployer_name_displayVARCHARMost frequent filed spelling of the employer name. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
panelidentity_statusVARCHARSee cases.identity_status.
panelidentity_flagsVARCHARSee cases.identity_flags.
panelemployer_id_n_disconnected_evidence_componentsBIGINTNumber of disconnected evidence components the id spans.
panelcandidate_group_idVARCHARLink to possibly related names. Not an assertion of one company. For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
panelemployer_id_l1VARCHARPre-split employer key; join on it to undo splits. For the employers listed in LIMITATIONS 15 the value is opaque (not derivable from published columns); otherwise it is a hash of the normalized name key.
panelidentity_split_statusVARCHARSee cases.identity_split_status.
panelidentity_policy_versionVARCHARIdentity rule version.
panelsoc_code_filed_stdVARCHARFiled SOC code (format-standardized) or INVALID_OR_MISSING.
panelsoc_vintage_usedVARCHARSOC vintage of the filed code (2000, 2010, 2018) or NONE.
panelsoc_mapping_classVARCHARMapping class to SOC 2018 (see cases).
panelsoc2018_code_if_uniqueVARCHARSOC 2018 code for one-to-one mappings only.
panelsoc2018_candidates_if_splitVARCHARCandidate SOC 2018 codes for split mappings.
panelsoc_title_modal_filedVARCHARMost frequent filed SOC title. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12).
panelfiscal_year_processedINTEGERFiscal year of the DOL file (not the year of the original decision for later status events).
panelsource_files_includedVARCHARPipe-separated source_key values feeding the cell.
panelfiscal_year_coverageVARCHARCOMPLETE_FY when an annual file or all four quarters are loaded. Every fiscal year in this edition is COMPLETE_FY.
panelunique_applications_original_decision_this_fyBIGINTUNIQUE LCA applications whose original decision falls in this fiscal year. Additive across years. Use this to count filings.
panelunique_applications_originally_certifiedBIGINTOf those, DOL status CERTIFIED at the original decision.
panelunique_applications_originally_deniedBIGINTOf those, DENIED.
panelunique_applications_withdrawn_before_certificationBIGINTOf those, WITHDRAWN before certification.
panelworker_positions_requested_unique_applicationsHUGEINTSum of positions requested over those unique applications, as filed. Unsupported for reconciliation with DOL totals.
panelworker_positions_requested_originally_certifiedHUGEINTSame, for originally certified applications.
panelfy_status_records_dol_processed_basisBIGINTStatus records in the fiscal year on DOL's decision-event basis, repeated snapshots excluded. NOT unique filings: includes later status events on earlier applications. Use only to compare with DOL fiscal-year statistics.
panelfy_repeated_snapshot_rows_excludedBIGINTRows in the cell excluded from the fy_* columns because they are identical copies of earlier rows from cumulative files.
panelfy_later_status_events_on_earlier_fy_applicationsBIGINTLater status events (for example certified then withdrawn) recorded in this fiscal year.
panelfy_dol_basis_certifiedBIGINTRecords classified CERTIFIED on DOL's basis (provisional rule for certified-withdrawn).
panelfy_dol_basis_deniedBIGINTRecords classified DENIED.
panelfy_dol_basis_withdrawnBIGINTRecords classified WITHDRAWN.
panelfy_cw_classified_without_original_cert_dateBIGINTRecords whose certified/withdrawn class is an estimate because the source has no original certification date (FY2010-FY2015).
panelfy_status_records_positions_may_repeat_across_yearsHUGEINTSum of positions over fy status records; positions of one application may repeat across records and years, so this is not additive.
panelwage_stat_n_casesBIGINTOriginally certified applications with a usable annual wage (the n behind the wage statistics).
panelwage_offered_annual_medianDOUBLEMedian offered annual wage (low end) over those cases, rounded to whole dollars.
panelwage_offered_annual_p25DOUBLE25th percentile, rounded to whole dollars.
panelwage_offered_annual_p75DOUBLE75th percentile, rounded to whole dollars.
panelwage_excluded_ambiguous_nBIGINTOriginally certified applications excluded from wage statistics because the unit was ambiguous.
panelwage_excluded_unsupported_nBIGINTExcluded because the unit was unsupported.
panelwage_stat_n_converted_from_non_annual_unitBIGINTCases in the statistic whose wage was converted from an hourly/weekly/monthly unit.
panelpw_level_i_nBIGINTOriginally certified applications at prevailing wage Level I (matches 'Level I' and 'I'). 0 where the year has no level column (FY2010-FY2014, FY2016).
panelpw_level_ii_nBIGINTLevel II (same rule).
panelpw_level_iii_nBIGINTLevel III (same rule).
panelpw_level_iv_nBIGINTLevel IV (same rule).
panelsoc_cases_with_standardization_appliedBIGINTRecords where SOC format standardization changed the filed text.
panelcases_multi_worksiteBIGINTRecords with more than one located worksite.
soc_crosswalk_2010_to_2018soc2010_codeBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018soc2010_titleBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018soc2018_codeBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018soc2018_titleBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018fanout_2010_to_2018BLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018fanin_2018_from_2010BLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018mapping_typeBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018same_codeBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2010_to_2018same_titleBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010soc2000BLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010title2000BLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010soc2010BLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010title2010BLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010n_2010_for_2000codeBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010n_2000_for_2010codeBLS/Census SOC crosswalk column as published; see METHODOLOGY.
soc_crosswalk_2000_to_2010pair_classBLS/Census SOC crosswalk column as published; see METHODOLOGY.

Full data dictionary (JSON) → · Complete dictionary with enumerated values and date semantics (Markdown) →

Pricing & License

Individual / Academic: US$149 one time — Individual / Academic (one named individual)

Commercial / Business: US$399 one time — Business / Commercial internal use (one legal entity)

Persistfolio Data License v1.0 (one-time, non-exclusive, no redistribution). Individual / Academic: one named person, professional or academic use. Business / Commercial: internal use within one legal entity. Full text at the license link; no legal opinion has been obtained on it.

View full license terms →

Corrections to the documents inside the ZIP (read first) →

Full limitations →

Buy dataset

Known Limitations

  • FY2010 has no visa-class or offered-wage-unit column; H-1B status and the wage unit are assumed and labeled.
  • The certified/withdrawn classification is a provisional rule. For FY2010-FY2015 it rests on a submit-date proxy that agrees with DOL totals in aggregate only; no error bound is claimed.
  • Eight source files differ from DOL’s published totals (six by 0.9% to 2.4% of certified; cause not proven). Worker-position totals are not reproduced.
  • Employer ids are provisional. One company can carry several ids and some ids span several offices; a name-variant link is never an assertion of one company.
  • SOC codes are kept as filed. DOL’s FY2011 and FY2012 files hold Excel-corrupted codes, some FY2022 codes are not standardized, and split SOC 2010-to-2018 mappings are not resolved to one code.
  • Prevailing wage level is absent in FY2010-FY2014 and FY2016 files.
  • Free-text fields are kept as filed except 4,608 cells in which pattern matching found e-mail addresses, tax-id-format numbers, phone numbers or long digit runs; those are replaced by tokens and the original values are not in the files. The redaction is pattern-based: it is not a guarantee that no personal data remains, it does not detect personal names, and it has not been reviewed by a human or by a lawyer.
  • 84,759 ids (employer, evidence-component and candidate-group ids) are opaque replacements for ids that had been derived from excluded fields. The replacement is one-to-one, so joins and counts are unchanged, but those ids cannot be recomputed from the published columns.
  • An application whose last loaded status is CERTIFIED may be withdrawn later; the data ends with the FY2025 files, and 22,593 case numbers have no original decision in the loaded files.
  • willful-violator and H-1B-dependent flags are as filed on each filing and are not attributes of a company.
  • Source-file defects (blank padding rows, truncated names, odd status values) are kept, not repaired. DOL may have restated records after publication; this is a snapshot of the 34 listed files.
  • FY2025 Q1 differs from DOL’s published certified count by +1,733 and the cause is unresolved.
  • Not independently reviewed: SOC vintage assignment, employer-id quality and wage annualization correctness.
  • Verification is the builder’s QA plus one independent AI reviewer (same vendor). No human has audited the data, the redaction or the identity audit, and no lawyer has reviewed the rights position or the license.
  • Employer names are reproduced from DOL’s public files, including some that are or contain an individual’s name (sole proprietors, professional practices). A heuristic screen found about 8,500 such-looking distinct names with many false positives; the redaction does not detect personal names. Public availability does not remove every legal obligation that may apply to your use. Correction and removal requests: info@persistfolio.com (see the license, section 7).
  • The files are Parquet only; there are no CSV files in this edition.

FAQ

Is this an official Department of Labor product?

No. It is derived from public DOL disclosure data and is not endorsed by the DOL.

Does it include company contact details?

No. Contact-person, attorney/agent, street-address, phone and FEIN columns are not released.

Are all original values preserved?

No. Filed values are kept as filed except 4,608 free-text cells where identifier-like strings (e-mail addresses, tax-id-format numbers, phone numbers, long digit runs) are replaced by tokens, and 84,759 ids that had been derived from excluded fields are replaced by opaque ids. The changed cells are listed, without their values, in the package.

Has the data been audited by a person?

No. It has had builder QA and one independent AI review; no independent human audit has been done and no legal opinion has been obtained on the rights position or the license.

Does it contain employer names, and can I ask for one to be corrected or removed?

Yes. Employer names come from DOL’s public disclosure files. Some are or contain the name of an individual (for example sole proprietors). We keep them, because naming the employer is the purpose of the data, and we do not claim that public availability removes every legal obligation. To ask for a correction or removal, write to info@persistfolio.com; we acknowledge within 5 business days, decide within 30 days and suppress accepted records in future editions by opaque id. Copies already delivered cannot be recalled (license section 7).

Can I use it to decide whether to hire or reject a person?

No. The data describes employer filings, not individuals, and must not be used for eligibility decisions about individuals.

Persistfolio is independent and is not affiliated with or endorsed by the U.S. Department of Labor. Derived from public DOL OFLC disclosure data. Not legal, immigration or employment advice.