TRI Releases
Toxic-chemical releases by facility and year, from the EPA's Toxics Release Inventory.
tri_releases — the dataset name to pass to the Obscura API.
What one row means
One reported chemical-release line from a single EPA Toxics Release Inventory Form R submission (Envirofacts `tri_reporting_form`) — one chemical, at one facility, for one reporting year, as filed on one document.
One row per doc_ctrl_num.
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For tri_releases: generated: available_date = received_date, the date EPA Envirofacts logged/received this Form R submission (a STORED generated column).
Refresh cadence
Obscura refreshes tri_releases daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 44 columns
The full public column list for tri_releases, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/tri_releases.
| Column | Type | Description |
|---|---|---|
| doc_ctrl_num | text · not null | EPA-assigned document control number for the submitted TRI Reporting Form R (Envirofacts `tri_reporting_form.doc_ctrl_num`). Sole primary key and the ON CONFLICT upsert target; a revised/corrected filing gets a new doc_ctrl_num, so this table can carry multiple rows per facility/chemical/year across revisions. |
| reporting_year | integer · not null | The TRI reporting year the form covers (e.g. 2024) — the calendar year the reported chemical activity occurred in. This is the period the release describes, NOT when the row became public. |
| tri_facility_id | text | EPA TRI Facility ID of the reporting facility. Joins to `tri_facilities.tri_facility_id` for facility name, location, and parent company. |
| tri_chem_id | text | Chemical identifier code for the reported substance — either a CAS registry number or an EPA generic TRI chemical-category code. |
| chemical_name | text | Human-readable name of the reported chemical (CAS name, falling back to the generic name). |
| form_type_ind | text | Form-type indicator code: `L` (long Form R) or `S` (short-form, reduced-reporting-eligible). |
| one_time_release_qty | double precision | Quantity (in pounds) of the chemical reported as a one-time, non-routine release for the reporting year. |
| production_ratio | double precision | Facility-reported production/activity ratio for the chemical versus the prior year. |
| received_date | date | The actual date EPA Envirofacts logged/received this specific Form R submission — the genuine first-public-availability signal, and the source of the generated `available_date` column below. |
| prod_ratio_or_activity | text | Qualifies whether `production_ratio` is a PRODUCTION ratio or an ACTIVITY index (raw source key `prod_ratio_or_activity`, e.g. 'PRODUCTION'/'ACTIVITY') — without it the stored ratio is ambiguous. Nullable. |
| max_amount_of_chem | text | Maximum-amount-on-site range code (raw source key `max_amount_of_chem`) — a coded bucket for the largest quantity of the chemical held at the facility during the reporting year; a distinct inventory-magnitude measure. Nullable. |
| orig_received | date | Original received date of the FIRST filing in this form's revision chain (raw source key `orig_received` timestamp, leading date component) — an earlier point-in-time than `received_date` (a revision gets a new `doc_ctrl_num`). Nullable. |
| orig_postmark | date | Original postmark date of the first filing (raw source key `orig_postmark` timestamp, leading date component) — the submission-postmark counterpart to `orig_received`. Nullable. |
| media_type | text | Environmental-medium code categorizing the release (raw source key `media_type`, e.g. 'W' water / 'A' air / 'L' land); a dimension. Nullable. |
| active_status | text | Active-status flag (raw source key `active_status`, e.g. '1') — whether this form is the active/current version or superseded by a later revision. Nullable. |
| revision_code_1 | text | First revision-reason code explaining why the form was refiled (raw source key `revision_code_1`). Nullable. |
| revision_code_2 | text | Second revision-reason code (raw source key `revision_code_2`). Nullable. |
| trade_secret_ind | text | Trade-secret indicator (raw source key `trade_secret_ind`) — the chemical identity was withheld as a trade secret, so `tri_chem_id`/`chemical_name` may be masked. Nullable. |
| sanitized_ind | text | Sanitized indicator (raw source key `sanitized_ind`) — the chemical identity was sanitized/generic-ized, affecting reliability of `tri_chem_id`/`chemical_name`. Nullable. |
| federal_fac_ind | text | Federal-facility ownership flag (raw source key `federal_fac_ind`). Nullable. |
| goco_flag | text | Government-owned-contractor-operated (GOCO) facility flag (raw source key `goco_flag`). Nullable. |
| dioxin_distribution_1 | double precision | Dioxin congener mass-distribution percentage #1 (raw source key `dioxin_distribution_1`) — populated only for dioxin / dioxin-like compound filings; null otherwise. Nullable. |
| dioxin_distribution_2 | double precision | Dioxin congener mass-distribution percentage #2 (raw source key `dioxin_distribution_2`). Nullable. |
| dioxin_distribution_3 | double precision | Dioxin congener mass-distribution percentage #3 (raw source key `dioxin_distribution_3`). Nullable. |
| dioxin_distribution_4 | double precision | Dioxin congener mass-distribution percentage #4 (raw source key `dioxin_distribution_4`). Nullable. |
| dioxin_distribution_5 | double precision | Dioxin congener mass-distribution percentage #5 (raw source key `dioxin_distribution_5`). Nullable. |
| dioxin_distribution_6 | double precision | Dioxin congener mass-distribution percentage #6 (raw source key `dioxin_distribution_6`). Nullable. |
| dioxin_distribution_7 | double precision | Dioxin congener mass-distribution percentage #7 (raw source key `dioxin_distribution_7`). Nullable. |
| dioxin_distribution_8 | double precision | Dioxin congener mass-distribution percentage #8 (raw source key `dioxin_distribution_8`). Nullable. |
| dioxin_distribution_9 | double precision | Dioxin congener mass-distribution percentage #9 (raw source key `dioxin_distribution_9`). Nullable. |
| dioxin_distribution_10 | double precision | Dioxin congener mass-distribution percentage #10 (raw source key `dioxin_distribution_10`). Nullable. |
| dioxin_distribution_11 | double precision | Dioxin congener mass-distribution percentage #11 (raw source key `dioxin_distribution_11`). Nullable. |
| dioxin_distribution_12 | double precision | Dioxin congener mass-distribution percentage #12 (raw source key `dioxin_distribution_12`). Nullable. |
| dioxin_distribution_13 | double precision | Dioxin congener mass-distribution percentage #13 (raw source key `dioxin_distribution_13`). Nullable. |
| dioxin_distribution_14 | double precision | Dioxin congener mass-distribution percentage #14 (raw source key `dioxin_distribution_14`). Nullable. |
| dioxin_distribution_15 | double precision | Dioxin congener mass-distribution percentage #15 (raw source key `dioxin_distribution_15`). Nullable. |
| dioxin_distribution_16 | double precision | Dioxin congener mass-distribution percentage #16 (raw source key `dioxin_distribution_16`). Nullable. |
| dioxin_distribution_17 | double precision | Dioxin congener mass-distribution percentage #17 (raw source key `dioxin_distribution_17`). Nullable. |
| waste_rock_quantity | double precision | Metal-mining waste-rock quantity (raw source key `waste_rock_quantity`, pounds) — mining-sector waste-rock measure. Nullable. |
| waste_rock_managed_pile | text | Waste-rock managed-in-pile attribute (raw source key `waste_rock_managed_pile`) — metal-mining waste-rock managed-pile indicator/code. Nullable. |
| mixture_name | text | Trade name of the mixture the chemical was reported within (raw source key `mixture_name`). Nullable. |
| withdrawal_code_1 | text | First withdrawal-reason code (raw source key `withdrawal_code_1`) — present when a form is withdrawn; null otherwise. Nullable. |
| withdrawal_code_2 | text | Second withdrawal-reason code (raw source key `withdrawal_code_2`). Nullable. |
| available_date | date | PUBLIC-availability date, DB-generated as `received_date` (STORED generated column) — the point-in-time column to filter/join on. |
Access tri_releases
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="tri_releases",
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the tri_releases dataset?
Toxic-chemical releases by facility and year, from the EPA's Toxics Release Inventory. One reported chemical-release line from a single EPA Toxics Release Inventory Form R submission (Envirofacts `tri_reporting_form`) — one chemical, at one facility, for one reporting year, as filed on one document.
How do I avoid look-ahead bias with tri_releases?
Filter on tri_releases.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — generated: available_date = received_date, the date EPA Envirofacts logged/received this Form R submission (a STORED generated column). A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get tri_releases?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="tri_releases". The column schema is public at https://api.obscura.trade/v1/catalog/tri_releases.
How often is tri_releases updated?
Obscura refreshes tri_releases on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.