One-time snapshot
EPA Toxic Release Inventory 2022–2023
158,687 EPA TRI form records with exact decimal quantities and 44,385 facility attribute versions for 23,081 distinct facilities.
Records: 158,687 reports; 23,081 distinct facilities
Coverage: 2022–2023 reporting years only
Format: CSV + Parquet
Package uploaded: 2026-09-19
Listing reviewed: 2026-09-19
The upload and review dates do not extend the source coverage. This is a dated snapshot; future updates are not included.
$99one time
CSV and Parquet files for the coverage described here. Review the limitations and sample before purchasing.
Buy dated snapshotView 1,000-row sampleNew annual update subscriptions are unavailable. Existing customers can use their purchase download links or contact support.
Known limitations
- Historical 2022–2023 snapshot only. TRI covers specified chemicals, industries and reporting thresholds; it is not a complete inventory of pollution or environmental risk. Future updates are not included.
- Report keys are year plus doc_ctrl_num. Multiple reports may share a facility, chemical and year. Join the two tables by facility_record_id, not TRIFID alone; 277 facility/year groups have multiple attribute versions.
- Quantities retain EPA units: Pounds or Grams. Dioxin uses grams; do not sum across units. Form A does not report quantities, and its supplied zeroes are flagged. Other source zeroes can represent blanks or not-applicable values.
- Reported totals are preserved with literal EPA-guide formula comparison flags. Primary release totals differ from component sums by at most 0.002 source units. Treatment totals include POTW treatment omitted from the guide formula. Energy and transfer comparisons have unresolved differences up to 142,991 pounds; flags are diagnostics, not proof of invalid reports.
- All delivered coordinate pairs pass numeric bounds, but geographic accuracy is not independently verified and horizontal_datum is empty throughout. Raw coordinate text is retained; no datum is inferred or transformed.
- This repair changes column names and numeric types and preserves facility attribute versions previously discarded. Text casing, leading-zero identifiers and literal NA remain as supplied. Consult the field mapping and migrate joins to facility_record_id.
Files in this snapshot
Row counts are per table and should not be added as independent events. Expand a file to see its delivered Parquet field names and types.
epa_tri_releases.parquet — 158,687 rows · 147 fields
| Field | Type |
|---|---|
| year | int64 |
| trifid | string |
| frs_id | string |
| facility_name | string |
| street_address | string |
| city | string |
| county | string |
| state | string |
| zip | string |
| bia | string |
| tribe | string |
| latitude | double |
| longitude | double |
| horizontal_datum | string |
| parent_company_name | string |
| parent_company_dun | string |
| standard_parent_company_name | string |
| foreign_parent_co_name | string |
| foreign_parent_co_db_num | string |
| standard_foreign_parent_co_name | string |
| federal_facility | string |
| industry_sector_code | string |
| industry_sector | string |
| sic_1 | string |
| sic_2 | string |
| sic_3 | string |
| sic_4 | string |
| sic_5 | string |
| sic_6 | string |
| naics_1 | string |
| naics_2 | string |
| naics_3 | string |
| naics_4 | string |
| naics_5 | string |
| naics_6 | string |
| doc_ctrl_num | string |
| chemical_name | string |
| elemental_metal_included | string |
| tri_chemical_compound_id | string |
| cas_number | string |
| srs_id | string |
| clean_air_act_chemical | string |
| classification | string |
| metal | string |
| metal_category | string |
| carcinogen | string |
| pbt | string |
| pfas | string |
| form_type | string |
| unit_of_measure | string |
| release_fugitive_air | decimal128(30, 7) |
| release_stack_air | decimal128(30, 7) |
| release_water | decimal128(30, 7) |
| release_underground | decimal128(30, 7) |
| release_class_i_wells | decimal128(30, 7) |
| release_class_ii_v_wells | decimal128(30, 7) |
| release_landfills_legacy | decimal128(30, 7) |
| release_rcra_c_landfills | decimal128(30, 7) |
| release_other_landfills | decimal128(30, 7) |
| release_land_treatment | decimal128(30, 7) |
| release_surface_impoundment_legacy | decimal128(30, 7) |
| release_rcra_surface_impoundment | decimal128(30, 7) |
| release_other_surface_impoundment | decimal128(30, 7) |
| release_other_land_disposal | decimal128(30, 7) |
| onsite_release_total | decimal128(30, 7) |
| transfer_potw_release | decimal128(30, 7) |
| transfer_potw_treatment | decimal128(30, 7) |
| transfer_potw_total | decimal128(30, 7) |
| transfer_m10 | decimal128(30, 7) |
| transfer_m41 | decimal128(30, 7) |
| transfer_m62 | decimal128(30, 7) |
| transfer_m40_metal | decimal128(30, 7) |
| transfer_m61_metal | decimal128(30, 7) |
| transfer_m71 | decimal128(30, 7) |
| transfer_m81 | decimal128(30, 7) |
| transfer_m82 | decimal128(30, 7) |
| transfer_m72 | decimal128(30, 7) |
| transfer_m63 | decimal128(30, 7) |
| transfer_m66 | decimal128(30, 7) |
| transfer_m67 | decimal128(30, 7) |
| transfer_m64 | decimal128(30, 7) |
| transfer_m65 | decimal128(30, 7) |
| transfer_m73 | decimal128(30, 7) |
| transfer_m79 | decimal128(30, 7) |
| transfer_m90 | decimal128(30, 7) |
| transfer_m94 | decimal128(30, 7) |
| transfer_m99 | decimal128(30, 7) |
| offsite_release_total | decimal128(30, 7) |
| transfer_m20 | decimal128(30, 7) |
| transfer_m24 | decimal128(30, 7) |
| transfer_m26 | decimal128(30, 7) |
| transfer_m28 | decimal128(30, 7) |
| transfer_m93 | decimal128(30, 7) |
| offsite_recycled_total | decimal128(30, 7) |
| transfer_m56 | decimal128(30, 7) |
| transfer_m92 | decimal128(30, 7) |
| offsite_energy_recovery_total | decimal128(30, 7) |
| transfer_m40_non_metal | decimal128(30, 7) |
| transfer_m50 | decimal128(30, 7) |
| transfer_m54 | decimal128(30, 7) |
| transfer_m61_non_metal | decimal128(30, 7) |
| transfer_m69 | decimal128(30, 7) |
| transfer_m95 | decimal128(30, 7) |
| offsite_treated_total | decimal128(30, 7) |
| transfer_unclassified | decimal128(30, 7) |
| transfer_offsite_total | decimal128(30, 7) |
| total_releases | decimal128(30, 7) |
| production_releases_legacy | decimal128(30, 7) |
| production_onsite_contained | decimal128(30, 7) |
| production_onsite_other | decimal128(30, 7) |
| production_offsite_contained | decimal128(30, 7) |
| production_offsite_other | decimal128(30, 7) |
| production_energy_recovery_onsite | decimal128(30, 7) |
| production_energy_recovery_offsite | decimal128(30, 7) |
| production_recycling_onsite | decimal128(30, 7) |
| production_recycling_offsite | decimal128(30, 7) |
| production_treatment_onsite | decimal128(30, 7) |
| production_treatment_offsite | decimal128(30, 7) |
| production_waste_total | decimal128(30, 7) |
| one_time_release | decimal128(30, 7) |
| production_ratio_or_activity | string |
| production_ratio | decimal128(30, 7) |
| source_file | string |
| source_row | int64 |
| latitude_raw | string |
| longitude_raw | string |
| coordinate_status | string |
| quantity_reporting_status | string |
| facility_record_id | string |
| onsite_release_total_difference | decimal128(30, 7) |
| onsite_release_total_matches_components | bool |
| offsite_release_total_difference | decimal128(30, 7) |
| offsite_release_total_matches_components | bool |
| total_releases_difference | decimal128(30, 7) |
| total_releases_matches_components | bool |
| transfer_potw_total_difference | decimal128(30, 7) |
| transfer_potw_total_matches_components | bool |
| offsite_recycled_total_difference | decimal128(30, 7) |
| offsite_recycled_total_matches_components | bool |
| offsite_energy_recovery_total_difference | decimal128(30, 7) |
| offsite_energy_recovery_total_matches_components | bool |
| offsite_treated_total_difference | decimal128(30, 7) |
| offsite_treated_total_matches_components | bool |
| transfer_offsite_total_difference | decimal128(30, 7) |
| transfer_offsite_total_matches_components | bool |
| production_waste_total_difference | decimal128(30, 7) |
| production_waste_total_matches_components | bool |
epa_tri_facilities.parquet — 44,385 rows · 41 fields
| Field | Type |
|---|---|
| facility_record_id | string |
| year | int64 |
| trifid | string |
| frs_id | string |
| facility_name | string |
| street_address | string |
| city | string |
| county | string |
| state | string |
| zip | string |
| bia | string |
| tribe | string |
| latitude | double |
| longitude | double |
| horizontal_datum | string |
| parent_company_name | string |
| parent_company_dun | string |
| standard_parent_company_name | string |
| foreign_parent_co_name | string |
| foreign_parent_co_db_num | string |
| standard_foreign_parent_co_name | string |
| federal_facility | string |
| industry_sector_code | string |
| industry_sector | string |
| sic_1 | string |
| sic_2 | string |
| sic_3 | string |
| sic_4 | string |
| sic_5 | string |
| sic_6 | string |
| naics_1 | string |
| naics_2 | string |
| naics_3 | string |
| naics_4 | string |
| naics_5 | string |
| naics_6 | string |
| latitude_raw | string |
| longitude_raw | string |
| coordinate_status | string |
| source_record_count | int64 |
| facility_year_variant_count | int64 |
Inspect the public CSV
import pandas as pd
df = pd.read_csv(
"https://huggingface.co/datasets/claritystorm/epa-tri-toxic-release-inventory/resolve/main/sample_1000.csv"
)
print(df.shape)
print(df.columns.tolist())
print(df.head())This CSV is a sample, not the full package. It does not establish complete historical coverage or represent every field’s missingness. License details are on the Hugging Face card.
Source: government source portal · Dataset changelog