US Mine Safety and Health Administration (MSHA)
US metal/non-metal + coal mines - active + historical (~92K; ~47K with coords)
Source
Feed (what to expect)
Weekly Friday bulk ZIP (no auth); live-fetched each run.
Quirks
Reconciliation
Schema
Feeds (axes)
Record kinds
Identifier schemes
Phase 1 desk landscape, written 2026-05-06. Reference document for the MSHA Mines fetcher built against the v1 multi-dimensional Classification schema. Cross-references:
docs/adr/007-multi-dimensional-classification.md,docs/DATASOURCES.md,src/strata/fetchers/msha/, the official schema definition file athttps://arlweb.msha.gov/OpenGovernmentData/DataSets/Mines_Definition_File.txt.
Live-data observations (verified 2026-05-06 against the 2026-05-01 bulk dump):
- The bulk URL is
https://arlweb.msha.gov/OpenGovernmentData/DataSets/Mines.zip(~7 MB; weekly Friday refresh per MSHA's Open-Government-Data programme). The companionMines_Definition_File.txt(~10 KB) is the canonical schema dictionary. A siblingMines.txtfile served from the same directory is a stale legacy mirror (Last-Modified frozen at 2021-03-22) - always consume the ZIP.- The pipe-delimited file has malformed RFC-4180 quoting. The free-form
DIRECTIONS_TO_MINEfield carries unescaped internal double-quotes; quote-aware parsing silently merges ~58 % of rows. The fetcher reads withquote_char=None(literal pipes only) and strips the surviving outer quotes per cell in_values.clean_text. Verified row count after the fix: 91,746 (matches the published record count).- 51.6 % of rows have lat/lon; 48.4 % don't. Mostly historical Abandoned mines (78,009 of 91,746) lack coordinates because MSHA began capturing geolocation only on more recent inspections. Admission drops the no-coords subset; live first-fetch admitted 47,330 facilities. Phase 1.5 may add a county-centroid fallback when cross-source resolution against MRDS proves out.
This is the reference for the v1 MSHA fetcher: slim Facility +
multi-row Classification + FacilityIdentifier +
OperatorReference + LifecycleEvent + FacilityAttribute.
Publisher. US Mine Safety and Health Administration (MSHA), an agency within the US Department of Labor. The Mines table is the authoritative US registry of coal + metal/non-metal mines under MSHA's jurisdiction - both currently active sites and historical (abandoned, sealed, idled) ones.
License. US federal-government work - public domain (17 U.S.C. § 105). No registration, attribution, or fees required; courtesy citation per MSHA's Open-Government-Data conventions.
Citation (canonical). U.S. Mine Safety and Health Administration (MSHA), Mines Dataset, Open Government Data programme. https://www.msha.gov/data-and-reports/mine-data-retrieval-system. Edition: 2026-05-01.
Public landing page. https://catalog.data.gov/dataset/msha-mines-dataset (data.gov catalog entry); the MDRS portal at https://www.msha.gov/data-and-reports/mine-data-retrieval-system houses the search UI + a 20-table flat-file collection.
Vintage. Weekly refresh, Fridays. The Mines table's
Last-Modified HTTP header is the de-facto vintage stamp; the fetcher
records it as edition_tag. As of 2026-05-06 the latest is 2026-05-01.
Coverage. ~92K rows (91,746 verified 2026-05-06): 13,737 currently operating-ish (Active + Intermittent + Temporarily Idled + NonProducing + New Mine) plus 78,009 historical (Abandoned + Abandoned and Sealed). 56,024 Metal/Non-Metal vs 35,722 Coal.
The ZIP. Mines.zip (~7 MB). Contains one pipe-delimited text
file Mines.txt (~37 MB uncompressed). Header row carries 60 columns
in the order described in §3.
Encoding. ASCII text with CRLF line endings. Some rows carry
non-ASCII bytes (apparent CP-1252 → UTF-8 mismatches) inside the
DIRECTIONS_TO_MINE field; the fetcher reads with encoding='utf8-lossy'
to substitute U+FFFD without losing rows.
Quoting. Text cells are wrapped in double quotes ("…"); numerics
DIRECTIONS_TO_MINE carries unescaped
internal quotes. Standard RFC-4180 readers (polars quote_char='"',
pandas default) silently merge ~58 % of rows. The fetcher disables
quote interpretation entirely (quote_char=None) and strips the
surviving outer quotes per cell in _values.clean_text.Sibling tables. MSHA's MDRS programme publishes ~20 flat files
(Inspections, Accidents, Violations, Quarterly Employ/Prod, Annual
Employ/Prod, etc.) keyed on the same MINE_ID. None are consumed
here - the Mines table alone covers FF's identity / classification /
operator needs. Phase 2 may pull Annual Employ/Prod for production
time series enrichment (analogous to MRDS' Production_detail).
The bulk Mines file publishes 60 columns. The fetcher extracts a subset (~30 columns) - the rest are operational metadata (inspection-office assignment, hazard-classification dates, free-form directions) that don't fit the FF schema cleanly. The "v1 destination" column points each consumed MSHA field to where it lands.
| Column | Type | v1 destination | Notes |
|---|---|---|---|
MINE_ID | str (7-dig) | FacilityIdentifier(scheme=msha_mine_id) | MSHA's canonical primary key; never reused. |
CURRENT_MINE_NAME | str | Facility.canonical_name | Trimmed; outer quotes stripped. |
COAL_METAL_IND | str (1) | JM (msha_coal_metal_ind) | C / M discriminator; informs canvass-code interpretation. |
CURRENT_MINE_TYPE | str | JM (msha_mine_type) + drives process_role + tech | Surface / Underground / Facility (mill). Empty for ~196 rows; admission still proceeds. |
CURRENT_MINE_STATUS | str | Facility.status + LifecycleEvent | Active / Intermittent / Temporarily Idled / NonProducing / New Mine / Abandoned / Abandoned and Sealed. Drives commissioned / decommissioned / suspended event payload. |
CURRENT_STATUS_DT | str (M/D/Y) | LifecycleEvent.event_date + commissioning year | Parsed via parse_mdy_date; out-of-range (year < 1700 or > 2100) drops. |
| Column | Type | v1 destination | Notes |
|---|---|---|---|
LATITUDE | str (decimal) | Facility.latitude | Parsed via parse_lat_lon; empty for 48 % of rows. Range-check [-90, 90]; 0.0 treated as sentinel "unknown". |
LONGITUDE | str (decimal) | Facility.longitude | Same coercion. Both lat AND lon required for admission. |
STATE | str (2) | Facility.region | Standard US state abbreviation (AL, WV, etc.). |
FIPS_CNTY_NM | str | Facility.locality | County or sub-state district name. Free-form. |
NEAREST_TOWN | str | JM (msha_nearest_town) | Free-form; useful disambiguator. |
country_iso2 is hard-coded to "US" - MSHA's jurisdiction is
US-only by statute.
| Column | Type | v1 destination | Notes |
|---|---|---|---|
PRIMARY_CANVASS_CD | str (1) | Classification(industry, NAICS + ISIC) | Six-valued enum (1=Anthracite Coal, 2=Bituminous Coal, 5=Sand & Gravel, 6=Stone, 7=NonMetal, 8=Metal). Drives 212111 / 212114 / 212230 / 212312 / 212321 / 212390 NAICS codes (HIGH confidence - direct field). |
PRIMARY_SIC | str | Classification(commodity_or_product) | Free-form description ("Lime", "Crushed, Broken Limestone NEC", "Gold Ores", "Bituminous Coal-Underground"…). Mapped through ~37-entry table; ~95 % coverage. |
SECONDARY_SIC | str | Classification(commodity_or_product) | Same mapping; emits non-primary is_primary=False rows. |
| Column | Type | v1 destination | Notes |
|---|---|---|---|
CURRENT_OPERATOR_NAME | str | OperatorReference(role=operator) | Day-to-day operator. Always emits when populated. |
CURRENT_OPERATOR_ID | str (7-dig) | OperatorReference.entity_id key | MSHA's internal Legal-Entity ID; preferred over name-hash for entity_id. |
CURRENT_CONTROLLER_NAME | str | OperatorReference(role=parent_guarantor) | MSHA's "controller" - the parent legal entity. Closest analogue to FF's parent_guarantor. |
CURRENT_CONTROLLER_ID | str (7-dig) | OperatorReference.entity_id key | Same fallback rule. |
CURRENT_CONTROLLER_BEGIN_DT | str (M/D/Y) | OperatorReference.valid_from | Falls back to CURRENT_STATUS_DT when missing. |
entity_id follows the lineage convention <scheme>:<value>:
msha_legal_entity_id:<id> when MSHA's internal entity ID is
populated; msha_operator_name:<sha1[:16]> deterministic fallback
otherwise.
| Column | v1 destination | Unit |
|---|---|---|
NO_EMPLOYEES | employee_count (int) | - |
DAYS_PER_WEEK | days_per_week (int) | days |
HOURS_PER_SHIFT | hours_per_shift (int) | hours |
PROD_SHIFTS_PER_DAY | production_shifts_per_day (int) | - |
MAINT_SHIFTS_PER_DAY | maintenance_shifts_per_day (int) | - |
NO_PRODUCING_PITS | producing_pits_count (int) | - |
NO_NONPRODUCING_PITS | nonproducing_pits_count (int) | - |
NO_TAILING_PONDS | tailing_ponds_count (int) | - |
AVG_MINE_HEIGHT | avg_mine_height (int) | in |
PORTABLE_OPERATION | is_portable_operation (bool) | - |
PILLAR_RECOVERY_USED | uses_pillar_recovery (bool) | - |
HIGHWALL_MINER_USED | uses_highwall_miner (bool) | - |
MULTIPLE_PITS | has_multiple_pits (bool) | - |
MINERS_REP_IND | has_miners_representative (bool) | - |
SAFETY_COMMITTEE_IND | has_safety_committee (bool) | - |
rows scanned: 91,746
admitted: 47,330 (51.6 %)
dropped (no coords): 44,416 (48.4 %)
records persisted: 996,726
facility: 47,330
facility_identifier: 47,330
classification: 238,957
lifecycle_event: 47,279
operator_reference: 94,316
facility_attribute: 521,514
Status distribution among admitted facilities: 33,946 decommissioned (Abandoned / Abandoned and Sealed with coords), 12,157 operating, 1,176 suspended, 51 commissioning.
Top NAICS industry codes among admitted facilities:
22,712 212111 (Bituminous Coal Surface), 12,408 212321 (Sand &
Gravel), 8,152 212312 (Stone Quarrying), 1,849 212390 (NonMetal),
1,208 212114 (Anthracite), 989 212230 (Metal Ores).
A spot-check of Bingham Canyon coordinates (UT, ~40.55, ~-112.10):
MSHA admits Bingham Canyon Mine + Kennecott Keystone Underground +
Copperton Concentrator + Kennecott Barneys Canyon Mining + Jaw Crusher
Cedar Rapids 3042 at the same complex. MRDS has a single
Bingham Open Pit Mine (dep_id 10069296) at slightly offset
coordinates (40.52077, -112.1458) - same physical site, different
sub-facility granularity, different lat/lon precision.
This is exactly the cross-source identity-resolution scenario ADR 005
is designed for. Phase 1 ingest preserves both sources' identities
(separate facility_ids minted by each fetcher); Phase 2 synthesis
will reconcile via name + coord + state similarity. Until reconciliation
lands, downstream consumers querying the resolved store see both
records as separate facilities.
STATE + FIPS_CNTY_CD (with
coordinate_confidence=PLACEHOLDER) would surface those as
county-grain facilities - useful for "is there a historical mine in
this county" queries even without point precision.MINE_ID) carries quarterly + annual production tonnage.
Joining it would give MSHA-side annual_production_<commodity>
attributes analogous to the MRDS-side ones.LifecycleEvent source (regulatory-action payload) in Phase 2.SIC_TEXT_TO_COMMODITY
table covers ~37 entries; long-tail SIC descriptions fall through
with no commodity emission (industry NAICS still admits via
PRIMARY_CANVASS_CD). Expand as needed when domain consumers surface
uncovered values.