← All datasets

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.

Snapshot coverage

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.

Get this snapshot

$99one time

CSV and Parquet files for the coverage described here. Review the limitations and sample before purchasing.

Buy dated snapshot

Commercial license terms

View 1,000-row sample

New 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
FieldType
yearint64
trifidstring
frs_idstring
facility_namestring
street_addressstring
citystring
countystring
statestring
zipstring
biastring
tribestring
latitudedouble
longitudedouble
horizontal_datumstring
parent_company_namestring
parent_company_dunstring
standard_parent_company_namestring
foreign_parent_co_namestring
foreign_parent_co_db_numstring
standard_foreign_parent_co_namestring
federal_facilitystring
industry_sector_codestring
industry_sectorstring
sic_1string
sic_2string
sic_3string
sic_4string
sic_5string
sic_6string
naics_1string
naics_2string
naics_3string
naics_4string
naics_5string
naics_6string
doc_ctrl_numstring
chemical_namestring
elemental_metal_includedstring
tri_chemical_compound_idstring
cas_numberstring
srs_idstring
clean_air_act_chemicalstring
classificationstring
metalstring
metal_categorystring
carcinogenstring
pbtstring
pfasstring
form_typestring
unit_of_measurestring
release_fugitive_airdecimal128(30, 7)
release_stack_airdecimal128(30, 7)
release_waterdecimal128(30, 7)
release_undergrounddecimal128(30, 7)
release_class_i_wellsdecimal128(30, 7)
release_class_ii_v_wellsdecimal128(30, 7)
release_landfills_legacydecimal128(30, 7)
release_rcra_c_landfillsdecimal128(30, 7)
release_other_landfillsdecimal128(30, 7)
release_land_treatmentdecimal128(30, 7)
release_surface_impoundment_legacydecimal128(30, 7)
release_rcra_surface_impoundmentdecimal128(30, 7)
release_other_surface_impoundmentdecimal128(30, 7)
release_other_land_disposaldecimal128(30, 7)
onsite_release_totaldecimal128(30, 7)
transfer_potw_releasedecimal128(30, 7)
transfer_potw_treatmentdecimal128(30, 7)
transfer_potw_totaldecimal128(30, 7)
transfer_m10decimal128(30, 7)
transfer_m41decimal128(30, 7)
transfer_m62decimal128(30, 7)
transfer_m40_metaldecimal128(30, 7)
transfer_m61_metaldecimal128(30, 7)
transfer_m71decimal128(30, 7)
transfer_m81decimal128(30, 7)
transfer_m82decimal128(30, 7)
transfer_m72decimal128(30, 7)
transfer_m63decimal128(30, 7)
transfer_m66decimal128(30, 7)
transfer_m67decimal128(30, 7)
transfer_m64decimal128(30, 7)
transfer_m65decimal128(30, 7)
transfer_m73decimal128(30, 7)
transfer_m79decimal128(30, 7)
transfer_m90decimal128(30, 7)
transfer_m94decimal128(30, 7)
transfer_m99decimal128(30, 7)
offsite_release_totaldecimal128(30, 7)
transfer_m20decimal128(30, 7)
transfer_m24decimal128(30, 7)
transfer_m26decimal128(30, 7)
transfer_m28decimal128(30, 7)
transfer_m93decimal128(30, 7)
offsite_recycled_totaldecimal128(30, 7)
transfer_m56decimal128(30, 7)
transfer_m92decimal128(30, 7)
offsite_energy_recovery_totaldecimal128(30, 7)
transfer_m40_non_metaldecimal128(30, 7)
transfer_m50decimal128(30, 7)
transfer_m54decimal128(30, 7)
transfer_m61_non_metaldecimal128(30, 7)
transfer_m69decimal128(30, 7)
transfer_m95decimal128(30, 7)
offsite_treated_totaldecimal128(30, 7)
transfer_unclassifieddecimal128(30, 7)
transfer_offsite_totaldecimal128(30, 7)
total_releasesdecimal128(30, 7)
production_releases_legacydecimal128(30, 7)
production_onsite_containeddecimal128(30, 7)
production_onsite_otherdecimal128(30, 7)
production_offsite_containeddecimal128(30, 7)
production_offsite_otherdecimal128(30, 7)
production_energy_recovery_onsitedecimal128(30, 7)
production_energy_recovery_offsitedecimal128(30, 7)
production_recycling_onsitedecimal128(30, 7)
production_recycling_offsitedecimal128(30, 7)
production_treatment_onsitedecimal128(30, 7)
production_treatment_offsitedecimal128(30, 7)
production_waste_totaldecimal128(30, 7)
one_time_releasedecimal128(30, 7)
production_ratio_or_activitystring
production_ratiodecimal128(30, 7)
source_filestring
source_rowint64
latitude_rawstring
longitude_rawstring
coordinate_statusstring
quantity_reporting_statusstring
facility_record_idstring
onsite_release_total_differencedecimal128(30, 7)
onsite_release_total_matches_componentsbool
offsite_release_total_differencedecimal128(30, 7)
offsite_release_total_matches_componentsbool
total_releases_differencedecimal128(30, 7)
total_releases_matches_componentsbool
transfer_potw_total_differencedecimal128(30, 7)
transfer_potw_total_matches_componentsbool
offsite_recycled_total_differencedecimal128(30, 7)
offsite_recycled_total_matches_componentsbool
offsite_energy_recovery_total_differencedecimal128(30, 7)
offsite_energy_recovery_total_matches_componentsbool
offsite_treated_total_differencedecimal128(30, 7)
offsite_treated_total_matches_componentsbool
transfer_offsite_total_differencedecimal128(30, 7)
transfer_offsite_total_matches_componentsbool
production_waste_total_differencedecimal128(30, 7)
production_waste_total_matches_componentsbool
epa_tri_facilities.parquet — 44,385 rows · 41 fields
FieldType
facility_record_idstring
yearint64
trifidstring
frs_idstring
facility_namestring
street_addressstring
citystring
countystring
statestring
zipstring
biastring
tribestring
latitudedouble
longitudedouble
horizontal_datumstring
parent_company_namestring
parent_company_dunstring
standard_parent_company_namestring
foreign_parent_co_namestring
foreign_parent_co_db_numstring
standard_foreign_parent_co_namestring
federal_facilitystring
industry_sector_codestring
industry_sectorstring
sic_1string
sic_2string
sic_3string
sic_4string
sic_5string
sic_6string
naics_1string
naics_2string
naics_3string
naics_4string
naics_5string
naics_6string
latitude_rawstring
longitude_rawstring
coordinate_statusstring
source_record_countint64
facility_year_variant_countint64

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