EPA TRI Toxic Release Rollup by Radius - Site Screener avatar

EPA TRI Toxic Release Rollup by Radius - Site Screener

Pricing

from $4.40 / 1,000 tri release rows

Go to Apify Store
EPA TRI Toxic Release Rollup by Radius - Site Screener

EPA TRI Toxic Release Rollup by Radius - Site Screener

Rolls up EPA Toxics Release Inventory facilities and their reported on-site chemical releases within a radius of any US coordinate. Air, water, underground injection and land totals per facility, plus carcinogen, PBT and PFAS breakdowns, for Phase I ESA and environmental due diligence.

Pricing

from $4.40 / 1,000 tri release rows

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Give it a coordinate. It returns every EPA Toxics Release Inventory facility near that point and rolls up what each one actually reported releasing on site - air, surface water, underground injection and land - for a chosen reporting year, with carcinogen, PBT, PFAS, metal and Clean Air Act HAP breakdowns.

Other TRI actors on the Store return a flat facility list. This one does the transform: a radius rollup with a per-facility release profile, a data-quality contract on every number, and a screen level you can gate a workflow on.

Who it is for

  • Phase I ESA / environmental due diligence - what is being released into the air, water and ground next to the parcel, and by whom.
  • Real estate and lending - a fast, defensible read on industrial neighbours before an acquisition or a loan.
  • EHS and corporate sustainability - benchmark a site against everything within a few miles of it.
  • Journalists and community groups - who releases what, near here.
  • AI agents - clean, chainable output over MCP.

Example input

{
"assets": [
{ "lat": 39.8033, "lon": -104.9456, "label": "Commerce City, CO - refinery corridor parcel" },
{ "lat": 29.7266, "lon": -95.2431, "label": "Houston Ship Channel site" }
],
"radiusMiles": 3,
"reportingYear": 2023,
"includeCountyTier": true,
"maxFacilitiesPerAsset": 25
}

assets is required. Nothing else is: every other field has a prefill but no schema default, because an Apify input-schema default is injected server side into every run and would silently narrow a query the caller never made. When a fallback is applied it is published on the row (radius_miles_defaulted, reporting_year_source).

Output

Two row types per run.

  • asset_summary - one per site. Totals across every matched facility, both match-tier counts, the coordinate-coverage measurement, and a gated screen level.
  • facility - one per matched TRI facility. Identity, distance, forms filed, the full release breakdown, hazard classes and per-source status.

146 declared fields, listed in full at the end of this page. Every one is nullable, because a dataset-schema type mismatch silently drops the entire push while the run still reports SUCCEEDED.

What this actor counts, and what it deliberately does not

The headline field is onsite_release_total_lbs.

It is EPA Form R Part II Section 5 - releases that occur on site. That is exactly what the tri_release_qty table documents itself as, and it is the number a proximity screen should be about: what is going into the environment at this location.

It is not Section 6 off-site transfers. A transfer is a shipment away from the site; only part of it counts as a release in EPA's national rollup, and the disposal-versus-treatment-versus-recycling split is encoded across roughly forty waste-management codes. Folding it into a proximity screen would be wrong twice - wrong partition and wrong place. Recycling and energy recovery are not releases at all and are likewise excluded.

Section 8.8 one-time releases are reported in their own field and are never added to the headline: EPA already counts them inside Section 5.

Every component ships alongside the total, and the run fails rather than publish a row where release_component_sum_lbs does not equal onsite_release_total_lbs.

The data-quality contract

TRI offers many ways to publish a confident wrong number. Each one is handled explicitly and reported on the row.

SituationWhat TRI publishesWhat this actor emits
Filer marked a medium not applicablerelease_na = 1, no quantity - about 77% of all Section 5 rowscounted in release_rows_not_applicable, contributes nothing. Not a zero.
Filer checked a range band instead of a numbera range code and a null quantity (every such row measured)counted in release_rows_range_only with range_only_lower_bound_lbs / range_only_upper_bound_lbs. A real release, magnitude bounded, never zero.
Filer reported a genuine zerorelease_na = 0, quantity 0a quantity of 0.
EPA publishes neitherrelease_na = 0, no quantity, no rangecounted in release_rows_unexplained_null. Never coerced to 0.
Facility filed only Form Aa certification statement and zero rows in tri_release_qtyform_a_certification_only = true, release_total_basis = form_a_certification_no_quantities, screen LOW - never NONE.
A source did not answer-every total is null, release_screen_level is INCONCLUSIVE, and sources_failed names what broke.

onsite_release_total_is_complete tells you in one boolean whether the number you are looking at resolved cleanly from end to end.

Coordinates, and the county match tier

EPA publishes no latitude or longitude for a large share of TRI facilities. Measured 2026-08-17: 417 of 765 Colorado facility records carry no preferred coordinate, and among the Colorado facilities that actually filed a 2023 form it is 196 of 259. A radius screen built only on coordinates would silently miss most of the active reporters and hand you a clean answer.

So there are two match tiers, and both ship:

  • coordinate - a published preferred coordinate inside the radius. distance_miles is measured.
  • county - no usable coordinate, but the facility is in the same county as the site. distance_miles is null. It is never guessed from a county centroid, which would be a confident wrong distance.

Every asset_summary row publishes facilities_state_without_coordinates and coordinate_coverage_pct, so a coordinate gap can never read as an absence of facilities. Set includeCountyTier: false for a faster and strictly less complete answer.

The packed fac_latitude / fac_longitude columns are not used as a fallback. Of the 347 Colorado records carrying both, 59 disagree with the preferred coordinate - including rows where the latitude column holds a longitude, rows reading 0, and rows that decode to 78 degrees north in Colorado.

EPA also stores pref_longitude unsigned. It is negated for the western hemisphere and left positive for Guam, CNMI and American Samoa; the rule applied is published in coordinate_longitude_sign_applied.

A radius near a state line reaches into the neighbouring state, and TRI can only be filtered one state at a time, so neighbouring states whose bounding box falls within the radius are read as well. Every state read is named in states_searched.

What runs before you are charged

A live drift gate runs on every execution, before a single row is pushed. If it fails, the run fails, emits nothing and bills nothing.

  • Every filter column is asserted present in the live table. An efservice filter naming a column the table does not have is silently ignored and the full national table is returned - measured: tri_facility/bogus_column/CO/COUNT returns 64,990, identical to unfiltered. That is how a national answer gets labelled as a local one.
  • Filters are post-validated on the returned rows, not merely accepted. A state-filtered count must also be strictly less than the unfiltered count, and an invalid state code must return zero.
  • A positive canary - a named refinery's 2023 filing - must still return a form count, row count, release total and media set inside their measured bands.
  • The chained form-to-release read is reconciled against a direct single-table read of the same document, because a chained efservice filter has been measured to silently drop rows elsewhere in EPA's service.
  • Closed vocabularies are checked. An unrecognised release_na fails the run, because that value is what separates "not applicable" from "zero". An unrecognised medium code does not fail: it is bucketed into other_unmapped_media_lbs and named on the row, so no quantity is ever dropped.
  • Row-count floors on the facility table, the form table and the chemical dictionary.
  • Truncation is guarded by efservice's own exact COUNT.

Reporting years

TRI runs from 1987 to the newest published cycle. Omit reportingYear and the actor resolves the newest year EPA actually serves, publishing it as reporting_year with reporting_year_source = auto_newest_served.

The release-medium vocabulary is not stable across years, which is a real trap: the modern surface-impoundment classes (SI 5.5.3A, SI 5.5.3B) do not appear at the head of the table at all, and 1987-1995 forms use combined underground-injection and landfill classes that modern forms do not. All three eras are mapped, and anything unrecognised is bucketed rather than lost.

Use as an MCP tool

This actor is callable by AI agents through Apify's MCP server.

{
"mcpServers": {
"apify": {
"command": "npx",
"args": ["-y", "@apify/actors-mcp-server", "--actors", "malonestar/epa-tri-facility-release-rollup"],
"env": { "APIFY_TOKEN": "your-apify-token" }
}
}
}

Worked prompt: "For 39.8033, -104.9456 within 3 miles, list the TRI facilities and tell me which single chemical accounts for the most on-site release, and whether any of the totals are incomplete."

Billing is unchanged when called as a tool, and a run that cannot answer fails without billing.

Chains well with

FAQ

Is TRI the same as an emissions inventory? No. TRI is self-reported by facilities that cross activity and chemical thresholds. A facility with no TRI form may still emit; TRI silence is not evidence of absence, and this actor says so on the row rather than implying otherwise.

Why is a facility showing zero releases? Read release_total_basis. reported_section_5_quantities with a 0 means the filer genuinely reported zero. form_a_certification_no_quantities means they certified under threshold and published no numbers at all. source_unavailable means a read failed and every total is null.

Why is distance_miles empty on some rows? Those are county-tier matches: EPA publishes no coordinate for that facility. The distance is unknown and is not guessed.

Does it cover off-site transfers? Not in the headline, deliberately. See "What this actor counts" above.

How current is the data? It reads EPA Envirofacts live on every run. reporting_year_forms_national tells you how many forms EPA serves for the cycle you asked for.

Source

EPA Envirofacts efservice, TRI subject area - tri_facility, tri_reporting_form, tri_release_qty, tri_chem_info. County and state resolution via the FCC block API with the Census geocoder as an independent fallback. No API key required.

All output fields

All 146 declared fields. Every field is nullable.

FieldTypeDescription
row_typestringEither "asset_summary" (one per site) or "facility" (one per matched TRI facility).
asset_labelstringThe label supplied for this site, or its coordinate pair.
asset_latitudenumberLatitude of the site as supplied.
asset_longitudenumberLongitude of the site as supplied.
asset_state_codestringTwo-letter state or territory code resolved from the site coordinate.
asset_county_fipsstringFive-digit county FIPS resolved from the site coordinate; the key for the county match tier.
asset_county_namestringCounty name resolved from the site coordinate.
geo_resolverstringWhich service resolved the county: "fcc" or "census".
geo_resolver_statusstringok or unavailable.
radius_milesnumberRadius used for the coordinate match tier.
radius_miles_defaultedbooleanTrue when the caller did not supply a radius and the actor used 5 miles.
reporting_yearnumberThe reporting year rolled up.
reporting_year_sourcestring"caller" or "auto_newest_served".
reporting_year_is_newest_servedbooleanTrue when the actor resolved this as the newest reporting year EPA serves. Null when the caller named a year.
reporting_year_forms_nationalnumberHow many TRI forms EPA serves nationally for this reporting year. A row-count floor that proves the cycle exists.
states_searchedstringEvery state read from tri_facility for this site: the resolved state plus any neighbour whose bounding box is within the radius.
data_sourcestringEPA Envirofacts efservice, TRI subject area.
data_retrieved_atstringUTC timestamp of the run.
facilities_state_universenumberTotal tri_facility records read across every searched state.
facilities_state_with_coordinatesnumberHow many of those publish a usable preferred coordinate.
facilities_state_without_coordinatesnumberHow many publish none. These can only be matched at the county tier.
coordinate_coverage_pctnumberShare of the searched universe carrying a usable coordinate.
coordinate_coverage_notestringWhy the coordinate gap is published rather than hidden.
facility_list_truncatedbooleanTrue if a state facility read hit its page cap. False means the read was complete against the exact upstream count.
facilities_in_radiusnumberFacilities with a coordinate inside the radius.
facilities_county_tiernumberFacilities with no coordinate that sit in the site county.
county_tier_candidates_totalnumberHow many county-tier facilities existed before the per-site cap.
county_tier_selection_orderstringHow county-tier facilities were ordered and capped.
facilities_emittednumberFacility rows actually produced for this site.
facilities_capped_atnumbermaxFacilitiesPerAsset in force for this run.
facilities_with_formsnumberHow many matched facilities filed any TRI form in the reporting year.
facilities_form_a_onlynumberMatched facilities that filed only Form A certifications, which publish no quantities.
facilities_source_incompletenumberMatched facilities whose form or release read did not answer.
nearest_facility_namestringName of the nearest coordinate-tier facility.
nearest_facility_idstringTRI facility id of the nearest coordinate-tier facility.
nearest_facility_distance_milesnumberDistance to the nearest coordinate-tier facility. County-tier facilities are excluded because their distance is unknown.
nearest_facility_onsite_release_lbsnumberOn-site Section 5 releases reported by the nearest facility.
match_tierstring"coordinate" (distance measured) or "county" (no published coordinate, same county as the site).
match_tier_basisstringPlain-English statement of what the tier means for this row.
distance_milesnumberGreat-circle distance from the site to the facility. NULL on a county-tier row: the distance is unknown and is never guessed from a county centroid.
tri_facility_idstringEPA TRI Facility Identification number.
facility_namestringFacility name as filed.
street_addressstringFacility street address.
city_namestringCity the facility reports on its TRI form.
county_namestringFacility county.
state_abbrstringFacility state, post-validated against the state that was requested.
zip_codestringFacility ZIP code.
state_county_fips_codestringFacility state+county FIPS; the join key for the county match tier.
epa_regionstringEPA region number.
epa_registry_idstringEPA Facility Registry Service id, for cross-linking to other EPA programs.
frs_idstringFRS id as carried on the TRI record.
parent_co_namestringParent company as filed.
standardized_parent_companystringEPA-standardized parent company name.
foreign_parent_co_namestringForeign parent company as filed.
facility_closedbooleanTRI closure indicator. NULL when TRI publishes no indicator, never false.
federal_facilitybooleanTrue when TRI records the site as federally owned or operated.
federal_agencystringOwning federal agency, where recorded.
public_contact_namestringPublic technical contact named on the form.
public_contact_phonestringPublic contact phone number.
public_contact_emailstringPublic contact email.
facility_latitudenumberTRI preferred latitude.
facility_longitudenumberTRI preferred longitude, SIGNED. EPA stores this column unsigned; it is negated for the western hemisphere and left positive for Guam, CNMI and American Samoa.
coordinate_availablebooleanFalse when EPA publishes no usable preferred coordinate for this facility.
coordinate_unavailable_reasonstringWhy no coordinate could be used.
coordinate_sourcestringAlways tri_facility.pref_latitude/pref_longitude. The packed DDMMSS fac_latitude/fac_longitude columns are deliberately NOT used as a fallback: of the 347 Colorado records carrying both, 59 disagree with the preferred coordinate, including rows where the latitude column holds a longitude.
coordinate_longitude_sign_appliedstring"west" or "east": which hemisphere rule was applied to the unsigned source value.
coordinate_accuracy_metersnumberEPA positional accuracy estimate.
coordinate_collection_methodstringEPA coordinate collection method code.
coordinate_description_categorystringWhat the coordinate describes (plant entrance, centroid and so on).
coordinate_horizontal_datumstringEPA horizontal datum code.
forms_totalnumberDistinct TRI documents filed by this facility for the reporting year.
forms_form_rnumberFull Form R filings, which carry quantities.
forms_form_anumberForm A Certification Statements. A Form A filer certifies they are under the reporting thresholds and reports NO quantities; such a document has zero rows in tri_release_qty, so it must never be read as zero releases.
forms_unknown_typenumberDocuments whose form type code is not recognised. Counted, never assumed to be Form R.
form_type_codes_rawstringThe raw form_type_ind values seen, so a new code is visible on the row.
forms_partial_facilitynumberForms covering only part of the site. Two forms for one chemical are legitimate in that case and are summed.
forms_inactive_statusnumberDocuments whose active_status is not 1.
duplicate_form_groupsnumberChemicals with more than one document for the year. Surfaced rather than silently double-counted.
form_a_certification_onlybooleanTrue when the facility filed only Form A certifications, so no quantity exists to report.
chemicals_reportednumberDistinct TRI chemicals covered by the filings.
chemical_namesstringSemicolon-separated list of the chemicals filed.
production_ratio_maxnumberHighest production ratio across the filings, ignoring any the filer marked not applicable.
one_time_release_lbsnumberSection 8.8 non-routine or one-time release quantity.
one_time_release_formsnumberHow many forms reported a one-time release.
one_time_release_notestringStates that Section 8.8 is already inside the Section 5 totals and is never added to them.
onsite_release_total_lbsnumberTHE HEADLINE. Total on-site releases reported under EPA Form R Part II Section 5 for the reporting year, summed across every medium. NULL, never zero, when a contributing source did not answer.
onsite_release_partitionstringStates exactly which EPA partition the headline is, and what is excluded.
air_total_lbsnumberFugitive plus stack air releases.
air_fugitive_lbsnumberSection 5.1 fugitive or non-point air emissions.
air_stack_lbsnumberSection 5.2 stack or point-source air emissions.
water_lbsnumberSection 5.3 discharges to receiving streams. One form may carry several water rows, one per receiving stream.
underground_injection_total_lbsnumberAll underground injection classes combined.
underground_injection_class_i_lbsnumberSection 5.4.1 Class I underground injection wells.
underground_injection_class_iiv_lbsnumberSection 5.4.2 Class II through V underground injection wells.
underground_injection_unspecified_lbsnumberUnderground injection reported under the pre-1996 combined class, TRI code UNINJ8795.
land_total_lbsnumberAll on-site land disposal classes combined.
land_rcra_c_landfill_lbsnumberSection 5.5.1A RCRA Subtitle C landfills.
land_other_landfill_lbsnumberSection 5.5.1B other on-site landfills.
land_landfill_unspecified_lbsnumberLandfill disposal reported under the pre-1996 combined class, TRI code LANDF8795.
land_treatment_lbsnumberSection 5.5.2 land treatment or application farming.
land_surface_impoundment_rcra_c_lbsnumberSection 5.5.3A RCRA Subtitle C surface impoundments. TRI codes this SI 5.5.3A and it does not appear at the head of the table, so a vocabulary built from one sample loses it.
land_surface_impoundment_other_lbsnumberSection 5.5.3B other surface impoundments, TRI code SI 5.5.3B.
land_surface_impoundment_unspecified_lbsnumberSurface impoundment disposal reported under the older combined SURF IMP class.
land_other_disposal_lbsnumberSection 5.5.4 other on-site land disposal.
other_unmapped_media_lbsnumberQuantities whose environmental_medium code is not in the known vocabulary. Bucketed here rather than dropped, so the headline stays complete when EPA adds a code.
unmapped_media_valuesstringThe literal medium codes that landed in the unmapped bucket.
release_component_sum_lbsnumberThe sum of every published component. Must equal the headline.
release_component_sum_matches_totalbooleanIdentity check: the headline is the sum of its own published parts. A false value fails the run rather than being published.
release_rows_reportednumberSection 5 rows carrying a numeric quantity. A quantity may legitimately be zero.
release_rows_not_applicablenumberRows where the filer set release_na = 1. NOT APPLICABLE is not zero, and roughly 77% of all Section 5 rows carry it.
release_rows_range_onlynumberRows where the filer checked a range band instead of giving a number. Every such row measured carries a null quantity: a real release with a bounded magnitude, never a zero.
release_rows_unexplained_nullnumberRows the filer did not mark not applicable and for which EPA publishes neither a quantity nor a range. Counted, never coerced to zero.
release_rows_invalidnumberRows carrying a value this actor refuses to interpret, such as an unrecognised release_na.
range_only_lower_bound_lbsnumberSum of the lower bounds of the range-reported rows. Null when there are none.
range_only_upper_bound_lbsnumberSum of the upper bounds of the range-reported rows. Null when there are none or a band is unbounded.
range_only_chemicalsstringChemicals whose quantity is only bounded.
release_basis_codesstringWhich estimation methods the filer declared. TRI uses bare letters on legacy forms and numbered method codes on modern ones.
onsite_release_total_is_completebooleanTrue only when every Section 5 row resolved to a quantity: no range-only, unexplained or invalid rows.
release_total_basisstringHow the headline was produced. reported_section_5_quantities: the filer gave numbers. form_r_all_media_not_applicable: a Form R was filed and every medium was marked not applicable, so the total is a reported zero. form_a_certification_no_quantities: only Form A certifications were filed and no quantity exists, so the total is null. no_forms_filed: the facility filed nothing for this year and the total is null. source_unavailable: a read failed and every total is null.
carcinogen_release_lbsnumberOn-site releases of chemicals EPA flags as OSHA carcinogens. NULL when the chemical dictionary did not answer.
carcinogen_chemicalsnumberHow many released chemicals are flagged carcinogens.
pbt_release_lbsnumberOn-site releases of persistent bioaccumulative toxic chemicals.
pbt_chemicalsnumberHow many released chemicals are flagged PBT.
pfas_release_lbsnumberOn-site releases of chemicals EPA flags as PFAS.
pfas_chemicalsnumberHow many released chemicals are flagged PFAS.
metal_release_lbsnumberOn-site releases of chemicals EPA flags as metals or metal compounds.
metal_chemicalsnumberHow many released chemicals are flagged metals.
clean_air_act_release_lbsnumberOn-site releases of chemicals also listed as Clean Air Act hazardous air pollutants.
clean_air_act_chemicalsnumberHow many released chemicals carry the Clean Air Act flag.
chemicals_not_in_dictionarynumberReleased chemicals with no entry in tri_chem_info, so no hazard class could be assigned.
non_pound_unit_chemicalsnumberReleased chemicals whose TRI unit of measure is not pounds. TRI publishes dioxin and dioxin-like compounds in grams.
non_pound_unit_notestringExplains the mixed unit of measure.
top_chemical_namestringLargest single contributor to the on-site total.
top_chemical_idstringTRI chemical id of the largest contributor.
top_chemical_lbsnumberQuantity attributed to the largest contributor.
top_chemicalsstringThe five largest contributors with their quantities.
release_screen_levelstringNONE, LOW, MODERATE, HIGH or INCONCLUSIVE. Gated on coverage: it can never read NONE while a contributing source was unavailable, and never NONE for a Form A only filer.
release_screen_flagsstringSemicolon-separated flags behind the screen level.
release_screen_basisstringPlain-English statement of what the screen level was computed from.
tri_facility_statusstringok, unavailable or not_applicable for the facility master read.
tri_reporting_form_statusstringok, unavailable or not_applicable for the form read.
tri_release_qty_statusstringok, unavailable or not_applicable for the Section 5 read. not_applicable means the facility filed only Form A, which has no release rows by design.
tri_chem_info_statusstringok or unavailable for the chemical dictionary. When unavailable, every hazard-class field is null rather than zero.
sources_failedstringWhich upstream reads did not answer for this row.
data_completebooleanTrue only when every source this row depends on answered.
data_issuesstringRow-level anomalies worth a human look, such as an unrecognised basis code.