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.
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
- Download the free sample and open README.md and the data dictionary to learn the columns, row roles and identity flags.
- Read LIMITATIONS and the ZIP corrections before you rely on a number; check employer_id quality for the employers you care about.
- Query the Parquet files directly with DuckDB or pandas; start from the applications and panel tables for counts.
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_fy | case_status | soc_code_std | employer_name_raw | primary_ws_state | wage_annual_from_calc |
|---|---|---|---|---|---|
| 2024 | CERTIFIED-WITHDRAWN | 15-1299 | Entergy Services, LLC | TX | 106000.0 |
| 2024 | CERTIFIED-WITHDRAWN | 15-1299 | Entergy Services, LLC | LA | 125000.0 |
| 2024 | CERTIFIED | 15-1211 | Shared Technology Services Group LLC | MA | 131999.0 |
| 2024 | CERTIFIED | 15-1252 | Resolve Tech Solutions LLC | TX | 120000.0 |
| 2024 | CERTIFIED | 15-1252 | Resolve Tech Solutions LLC | TX | 180000.0 |
| 2024 | CERTIFIED | 19-1029 | DICERNA PHARMACEUTICALS, INC. | MA | 155000.0 |
| 2024 | CERTIFIED | 17-2074 | UT-BATTELLE, LLC (OAK RIDGE NATIONAL LABORATORY) | TN | 108000.0 |
| 2024 | CERTIFIED | 15-1252 | KODESYSTEMS LLC | TX | 101192.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.
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.
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
| File | Field | Type | Description |
|---|---|---|---|
| cases | case_number | VARCHAR | DOL 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). |
| cases | source_key | VARCHAR | Which DOL file this row came from: fiscal year (2010-2019 annual) or year+quarter (2020Q1-2025Q4). Lineage key with source_row. |
| cases | source_quarter | INTEGER | Quarter number (1-4) for quarterly files; empty for annual files. |
| cases | source_fy | INTEGER | U.S. federal fiscal year (Oct 1 - Sep 30) of the DOL file. |
| cases | source_file | VARCHAR | Original DOL file name. SHA-256 of each file is in SOURCE_INVENTORY.csv. |
| cases | source_row | BIGINT | Worksheet 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. |
| cases | case_status | VARCHAR | DOL 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. |
| cases | dol_stats_status | VARCHAR | Persistfolio'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. |
| cases | dol_stats_status_basis | VARCHAR | How 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. |
| cases | case_submitted | TIMESTAMP | Date the LCA was submitted, as filed (FY2010-FY2015 files use a differently named column; mapped here). |
| cases | decision_date | TIMESTAMP | Date DOL decided the case, as filed. |
| cases | original_cert_date | TIMESTAMP | ORIGINAL_CERT_DATE as filed. Present in FY2016 onward; empty for FY2010-FY2015 (column does not exist in those files). |
| cases | first_seen_fy | INTEGER | Earliest fiscal year in which this case number appears in the loaded files. |
| cases | n_fy_appearances | BIGINT | Number of fiscal years in which this case number appears in the loaded files. |
| cases | row_role | VARCHAR | ORIGINAL_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. |
| cases | row_role_evidence | VARCHAR | Why 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. |
| cases | visa_class | VARCHAR | Visa 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). |
| cases | job_title | VARCHAR | Job 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). |
| cases | full_time_position | VARCHAR | Full-time position flag as filed (Y/N). |
| cases | total_worker_positions | INTEGER | Number of worker positions requested, as filed (TOTAL_WORKER_POSITIONS / TOTAL WORKERS). Does NOT reproduce DOL published position totals (+2% to +4%); unsupported for reconciliation. |
| cases | period_start | TIMESTAMP | Intended employment begin date, as filed. |
| cases | period_end | TIMESTAMP | Intended employment end date, as filed. |
| cases | soc_code_raw | VARCHAR | SOC 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. |
| cases | soc_title_raw | VARCHAR | SOC occupation title as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| cases | soc_code_std | VARCHAR | Filed SOC code standardized only in format (e.g. 15-1132; O*NET suffix .00 removed). Never mapped to a different code. Empty if unparseable. |
| cases | soc_std_method | VARCHAR | How soc_code_std was produced (AS_FILED, ONET_8DIGIT_TRUNCATED, UNPARSEABLE, ...). |
| cases | soc_vintage_used | VARCHAR | SOC 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). |
| cases | soc_vintage_basis | VARCHAR | Why that vintage was chosen (expected vintage for the file from code evidence, then fallback order). |
| cases | soc_vintage_evidence | VARCHAR | The code evidence behind the vintage choice (which vintages contain the code). |
| cases | soc_mapping_class | VARCHAR | Result 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. |
| cases | soc2018_code | VARCHAR | SOC 2018 code, filled ONLY for one-to-one mappings. |
| cases | soc2018_candidates | VARCHAR | For split mappings: the candidate SOC 2018 codes (pipe separated). A candidate list, not a choice. |
| cases | employer_name_raw | VARCHAR | Employer 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). |
| cases | employer_dba_raw | VARCHAR | Employer 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). |
| cases | employer_id | VARCHAR | Persistfolio 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. |
| cases | employer_id_l1 | VARCHAR | Employer 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. |
| cases | evidence_component_id | VARCHAR | Opaque 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). |
| cases | identity_split_status | VARCHAR | SPLIT_R5 (name split into several ids by R5-v1), MERGED_BACK_NO_POSITIVE_DISTINCTNESS, NOT_APPLICABLE_SINGLE_COMPONENT, NOT_EVALUABLE_MISSING_INDUSTRY_OR_STATE. |
| cases | identity_policy_version | VARCHAR | Identity rule version (R5-v1). |
| cases | employer_key_l1 | VARCHAR | Normalized 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). |
| cases | identity_status | VARCHAR | AS_FILED (single spelling), NORMALIZED (several spellings merged by name rule), UNRESOLVED_REVIEW (name with unresolved variants or disconnected evidence). |
| cases | identity_flags | VARCHAR | Pipe-separated flags, for example MULTI_SPELLING_MERGED_BY_L1, LEGAL_SUFFIX_VARIANT_CANDIDATE_UNMERGED, SPACING_VARIANT_CANDIDATE_UNMERGED, SAME_NAME_DISCONNECTED. |
| cases | n_evidence_components | BIGINT | Number of disconnected evidence components in the name group (more than 1 means one name spans separate addresses/phones). |
| cases | candidate_group_id | VARCHAR | Optional 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. |
| cases | employer_city | VARCHAR | Employer city as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| cases | employer_state | VARCHAR | Employer state as filed. |
| cases | employer_postal5_clean | VARCHAR | Employer ZIP reduced to 5 digits when the filed value is a valid ZIP. |
| cases | employer_postal_method | VARCHAR | How the 5-digit ZIP was derived. |
| cases | naics_code | VARCHAR | NAICS code as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| cases | h1b_dependent | VARCHAR | H-1B dependent employer flag as filed for this filing (Y/N). A per-filing fact, not an attribute of a company. |
| cases | willful_violator | VARCHAR | Willful violator flag as filed for this filing (Y/N). A per-filing fact, not an attribute of a company. |
| cases | primary_ws_city | VARCHAR | City of the first worksite listed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| cases | primary_ws_state | VARCHAR | State of the first worksite listed. |
| cases | primary_ws_postal5_clean | VARCHAR | 5-digit ZIP of the first worksite when valid. |
| cases | primary_ws_postal_method | VARCHAR | How the worksite ZIP was derived. |
| cases | n_worksites_with_location | BIGINT | Number of worksite slots with a location in the filing. |
| cases | n_wage_only_dup_slots | BIGINT | Worksite slots that repeat only a wage line (not counted as separate locations). |
| cases | n_distinct_wage_tuples_located | BIGINT | Distinct located wage tuples across worksites. |
| cases | worksite_states | VARCHAR | Pipe-separated worksite states. |
| cases | wage_from_raw | VARCHAR | Offered 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). |
| cases | wage_to_raw | VARCHAR | Offered 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). |
| cases | wage_unit_raw | VARCHAR | Offered wage unit as filed (Year, Hour, Week, Bi-Weekly, Month). FY2010 has no unit column: the unit is INFERRED from the prevailing-wage unit. |
| cases | wage_annual_from_calc | DOUBLE | Offered 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. |
| cases | wage_annual_to_calc | DOUBLE | Offered wage high end annualized under the same rule; use only where wage_status starts with OK_. |
| cases | wage_status | VARCHAR | OK_AS_FILED_ANNUAL, OK_CONVERTED, AMBIGUOUS, UNSUPPORTED_*, MISSING. Use the OK_* values for wage statistics. |
| cases | wage_flags | VARCHAR | Pipe-separated wage plausibility flags. |
| cases | wage_unit_correction_candidate_not_applied | VARCHAR | Set when the filed unit looks wrong (for example hourly figure with Year unit). Reported, never applied. |
| cases | pw_raw | VARCHAR | Prevailing wage as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| cases | pw_unit_raw | VARCHAR | Prevailing wage unit as filed. |
| cases | pw_level_raw | VARCHAR | Prevailing 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). |
| cases | pw_annual | DOUBLE | Prevailing wage annualized when the unit is supported. |
| worksites | case_number | VARCHAR | DOL 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). |
| worksites | source_key | VARCHAR | Which DOL file this row came from: fiscal year (2010-2019 annual) or year+quarter (2020Q1-2025Q4). Lineage key with source_row. |
| worksites | source_fy | INTEGER | U.S. federal fiscal year (Oct 1 - Sep 30) of the DOL file. |
| worksites | source_row | BIGINT | Worksheet 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. |
| worksites | slot | INTEGER | Worksite slot number (1-N) within the filing. |
| worksites | worksite_workers_raw | VARCHAR | Workers at this worksite as filed. |
| worksites | ws_city | VARCHAR | Worksite city as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| worksites | ws_county | VARCHAR | Worksite county as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| worksites | ws_state | VARCHAR | Worksite state as filed. |
| worksites | ws_postal | VARCHAR | Worksite postal code as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| worksites | is_location_bearing | BOOLEAN | True when the slot carries a worksite location. |
| worksites | wage_from_raw | VARCHAR | Offered 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). |
| worksites | wage_to_raw | VARCHAR | Offered 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). |
| worksites | wage_unit_raw | VARCHAR | Offered wage unit as filed (Year, Hour, Week, Bi-Weekly, Month). FY2010 has no unit column: the unit is INFERRED from the prevailing-wage unit. |
| worksites | pw_raw | VARCHAR | Prevailing wage as filed (text). Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| worksites | pw_unit_raw | VARCHAR | Prevailing wage unit as filed. |
| worksites | pw_level_raw | VARCHAR | Prevailing 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). |
| worksites | pw_source_raw | VARCHAR | Prevailing 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). |
| worksites | pw_source_year_raw | VARCHAR | Prevailing wage source year as filed. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| worksites | is_wage_only_dup_of_slot1 | BOOLEAN | True when the slot only repeats a wage line of slot 1 (not a separate location). |
| applications | case_number | VARCHAR | DOL LCA case number; one row per case number across all loaded files. |
| applications | n_status_records_loaded | BIGINT | Number of distinct status records for the case in the loaded files (repeated snapshots excluded). |
| applications | n_repeated_snapshot_rows_loaded | BIGINT | Rows for the case that are identical copies of earlier file rows (cumulative files). Not events. |
| applications | status_history_loaded | VARCHAR | Status history across files, "source_key:status > source_key:status", repeated snapshots excluded. |
| applications | employer_id | VARCHAR | Employer 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. |
| applications | soc_code_std | VARCHAR | Filed SOC code, format-standardized. |
| applications | positions_requested | INTEGER | Maximum worker positions requested across the case's records, as filed. |
| applications | n_distinct_positions_across_records | BIGINT | Number of distinct position counts across records; more than 1 means the filings disagree. |
| applications | original_decision_fy_loaded | INTEGER | Fiscal year of the case's original decision record, if loaded. |
| applications | original_decision_source_key_loaded | VARCHAR | Source file of the original decision record, if loaded. |
| applications | original_row_status | VARCHAR | ORIGINAL_LOADED, or ORPHAN_ORIGINAL_PERIOD_NOT_LOADED when only later status records exist in the loaded files. |
| applications | original_cert_fy_inferred | INTEGER | Fiscal year implied by ORIGINAL_CERT_DATE, when present. |
| applications | latest_status_in_loaded_files | VARCHAR | Latest status in the loaded files. Not necessarily the final status. |
| applications | latest_loaded_fy | INTEGER | Latest fiscal year in which the case appears. |
| applications | final_status_confidence | VARCHAR | TERMINAL_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). |
| panel | employer_id | VARCHAR | Employer 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. |
| panel | employer_name_display | VARCHAR | Most 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). |
| panel | identity_status | VARCHAR | See cases.identity_status. |
| panel | identity_flags | VARCHAR | See cases.identity_flags. |
| panel | employer_id_n_disconnected_evidence_components | BIGINT | Number of disconnected evidence components the id spans. |
| panel | candidate_group_id | VARCHAR | Link 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. |
| panel | employer_id_l1 | VARCHAR | Pre-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. |
| panel | identity_split_status | VARCHAR | See cases.identity_split_status. |
| panel | identity_policy_version | VARCHAR | Identity rule version. |
| panel | soc_code_filed_std | VARCHAR | Filed SOC code (format-standardized) or INVALID_OR_MISSING. |
| panel | soc_vintage_used | VARCHAR | SOC vintage of the filed code (2000, 2010, 2018) or NONE. |
| panel | soc_mapping_class | VARCHAR | Mapping class to SOC 2018 (see cases). |
| panel | soc2018_code_if_unique | VARCHAR | SOC 2018 code for one-to-one mappings only. |
| panel | soc2018_candidates_if_split | VARCHAR | Candidate SOC 2018 codes for split mappings. |
| panel | soc_title_modal_filed | VARCHAR | Most frequent filed SOC title. Identifier-like strings (e-mail, tax-id format, phone, long digit runs) are redacted to [REDACTED-...] tokens (LIMITATIONS 12). |
| panel | fiscal_year_processed | INTEGER | Fiscal year of the DOL file (not the year of the original decision for later status events). |
| panel | source_files_included | VARCHAR | Pipe-separated source_key values feeding the cell. |
| panel | fiscal_year_coverage | VARCHAR | COMPLETE_FY when an annual file or all four quarters are loaded. Every fiscal year in this edition is COMPLETE_FY. |
| panel | unique_applications_original_decision_this_fy | BIGINT | UNIQUE LCA applications whose original decision falls in this fiscal year. Additive across years. Use this to count filings. |
| panel | unique_applications_originally_certified | BIGINT | Of those, DOL status CERTIFIED at the original decision. |
| panel | unique_applications_originally_denied | BIGINT | Of those, DENIED. |
| panel | unique_applications_withdrawn_before_certification | BIGINT | Of those, WITHDRAWN before certification. |
| panel | worker_positions_requested_unique_applications | HUGEINT | Sum of positions requested over those unique applications, as filed. Unsupported for reconciliation with DOL totals. |
| panel | worker_positions_requested_originally_certified | HUGEINT | Same, for originally certified applications. |
| panel | fy_status_records_dol_processed_basis | BIGINT | Status 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. |
| panel | fy_repeated_snapshot_rows_excluded | BIGINT | Rows in the cell excluded from the fy_* columns because they are identical copies of earlier rows from cumulative files. |
| panel | fy_later_status_events_on_earlier_fy_applications | BIGINT | Later status events (for example certified then withdrawn) recorded in this fiscal year. |
| panel | fy_dol_basis_certified | BIGINT | Records classified CERTIFIED on DOL's basis (provisional rule for certified-withdrawn). |
| panel | fy_dol_basis_denied | BIGINT | Records classified DENIED. |
| panel | fy_dol_basis_withdrawn | BIGINT | Records classified WITHDRAWN. |
| panel | fy_cw_classified_without_original_cert_date | BIGINT | Records whose certified/withdrawn class is an estimate because the source has no original certification date (FY2010-FY2015). |
| panel | fy_status_records_positions_may_repeat_across_years | HUGEINT | Sum of positions over fy status records; positions of one application may repeat across records and years, so this is not additive. |
| panel | wage_stat_n_cases | BIGINT | Originally certified applications with a usable annual wage (the n behind the wage statistics). |
| panel | wage_offered_annual_median | DOUBLE | Median offered annual wage (low end) over those cases, rounded to whole dollars. |
| panel | wage_offered_annual_p25 | DOUBLE | 25th percentile, rounded to whole dollars. |
| panel | wage_offered_annual_p75 | DOUBLE | 75th percentile, rounded to whole dollars. |
| panel | wage_excluded_ambiguous_n | BIGINT | Originally certified applications excluded from wage statistics because the unit was ambiguous. |
| panel | wage_excluded_unsupported_n | BIGINT | Excluded because the unit was unsupported. |
| panel | wage_stat_n_converted_from_non_annual_unit | BIGINT | Cases in the statistic whose wage was converted from an hourly/weekly/monthly unit. |
| panel | pw_level_i_n | BIGINT | Originally certified applications at prevailing wage Level I (matches 'Level I' and 'I'). 0 where the year has no level column (FY2010-FY2014, FY2016). |
| panel | pw_level_ii_n | BIGINT | Level II (same rule). |
| panel | pw_level_iii_n | BIGINT | Level III (same rule). |
| panel | pw_level_iv_n | BIGINT | Level IV (same rule). |
| panel | soc_cases_with_standardization_applied | BIGINT | Records where SOC format standardization changed the filed text. |
| panel | cases_multi_worksite | BIGINT | Records with more than one located worksite. |
| soc_crosswalk_2010_to_2018 | soc2010_code | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | soc2010_title | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | soc2018_code | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | soc2018_title | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | fanout_2010_to_2018 | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | fanin_2018_from_2010 | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | mapping_type | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | same_code | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2010_to_2018 | same_title | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | soc2000 | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | title2000 | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | soc2010 | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | title2010 | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | n_2010_for_2000code | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | n_2000_for_2010code | BLS/Census SOC crosswalk column as published; see METHODOLOGY. | |
| soc_crosswalk_2000_to_2010 | pair_class | BLS/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.
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.
