ECHO Facilities
EPA-regulated facilities and their compliance history, from ECHO.
echo_facilities — the dataset name to pass to the Obscura API.
What one row means
One regulated facility's current geocoded master attributes — name, address, lat/long, active/major-facility flags, overall compliance status, cumulative lifetime penalty total, lifetime inspection count, and NAICS/SIC classification codes — as of EPA ECHO's latest weekly full-refresh of its `ECHO_EXPORTER.csv` bulk export (inside `echo_exporter.zip`), keyed on `REGISTRY_ID`. This is EPA's facility MASTER file: it carries no intrinsic event or reporting-period date of its own — every row is just the facility's current attributes at the moment EPA regenerated the export — unlike the sibling `echo_enforcement_cases` table, whose rows are dated case activities.
One row per (registry_id).
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 echo_facilities: snapshot: available_date = COALESCE(captured_date, synced_at::date) — the calendar day EPA's weekly full-refresh export was CAPTURED (no intrinsic event/period date exists on this master-file snapshot). Identical to the ingestion day on a live run; on a bronze replay it is the day the source was originally contacted, never the replay day.
Refresh cadence
Obscura refreshes echo_facilities 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 — 110 columns
The full public column list for echo_facilities, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/echo_facilities.
| Column | Type | Description |
|---|---|---|
| registry_id | text · not null | EPA FRS (Facility Registry Service) Registry ID, the stable facility key from `REGISTRY_ID`. Primary key; the upsert conflict target. |
| fac_name | text | Facility display name (`FAC_NAME`); often an address-derived label rather than a company name, since FRS registers physical sites as well as businesses. |
| fac_street | text | Street address of the facility (`FAC_STREET`). |
| fac_city | text | City (`FAC_CITY`). |
| fac_state | text | Two-letter US state postal abbreviation (`FAC_STATE`). |
| fac_zip | text | ZIP code (`FAC_ZIP`), stored as text to preserve leading zeros / ZIP+4 formats. |
| fac_county | text | County (`FAC_COUNTY`). |
| fac_epa_region | text | EPA administrative region number (01-10) with jurisdiction over the facility (`FAC_EPA_REGION`). |
| fac_lat | double precision | Facility latitude in decimal degrees (`FAC_LAT`), FRS's own geocode. |
| fac_long | double precision | Facility longitude in decimal degrees (`FAC_LONG`). |
| fac_active_flag | text | 'Y'/blank text flag indicating the facility is currently active in EPA's regulatory universe (`FAC_ACTIVE_FLAG`); blank means not-confirmed-active, not necessarily inactive. |
| fac_major_flag | text | 'Y'/blank text flag indicating EPA classifies the facility as a 'major' source vs. minor/synthetic-minor (`FAC_MAJOR_FLAG`). |
| fac_compliance_status | text | Current overall compliance status as of the export's generation (`FAC_COMPLIANCE_STATUS`); a snapshot classification, no history retained of prior values. |
| fac_snc_flg | text | 'Y'/'N' text flag indicating the facility is currently in Significant Non-Compliance (SNC/HPV) (`FAC_SNC_FLG`). |
| fac_total_penalties | double precision | Cumulative lifetime monetary penalties assessed against the facility, USD (`FAC_TOTAL_PENALTIES`); a running total as of this weekly snapshot, not a single dated penalty. |
| fac_inspection_count | bigint | Cumulative lifetime count of EPA/state inspections conducted at the facility (`FAC_INSPECTION_COUNT`); a running total as of this weekly snapshot. |
| fac_naics_codes | text | NAICS industry classification code(s) for the facility (`FAC_NAICS_CODES`); raw source text, may hold a delimited list. |
| fac_sic_codes | text | Legacy SIC classification code(s) for the facility (`FAC_SIC_CODES`); raw source text, may hold a delimited list. |
| fac_date_last_inspection | date | Date of the facility's most recent inspection/evaluation (`FAC_DATE_LAST_INSPECTION`), parsed `%m/%d/%Y`. |
| fac_date_last_formal_action | date | Date of the facility's most recent formal enforcement action (`FAC_DATE_LAST_FORMAL_ACTION`). |
| fac_date_last_informal_action | date | Date of the facility's most recent informal enforcement action (`FAC_DATE_LAST_INFORMAL_ACTION`). |
| fac_date_last_penalty | date | Date of the facility's most recent penalty (`FAC_DATE_LAST_PENALTY`). |
| fac_date_last_inspection_epa | date | Date of the most recent EPA-led inspection (`FAC_DATE_LAST_INSPECTION_EPA`). |
| fac_date_last_inspection_state | date | Date of the most recent state-led inspection (`FAC_DATE_LAST_INSPECTION_STATE`). |
| fac_date_last_formal_act_epa | date | Date of the most recent EPA-led formal action (`FAC_DATE_LAST_FORMAL_ACT_EPA`). |
| fac_date_last_formal_act_st | date | Date of the most recent state-led formal action (`FAC_DATE_LAST_FORMAL_ACT_ST`). |
| fac_date_last_informal_act_epa | date | Date of the most recent EPA-led informal action (`FAC_DATE_LAST_INFORMAL_ACT_EPA`). |
| fac_date_last_informal_act_st | date | Date of the most recent state-led informal action (`FAC_DATE_LAST_INFORMAL_ACT_ST`). |
| fac_formal_action_count | bigint | Count of formal enforcement actions in the last 5 years (`FAC_FORMAL_ACTION_COUNT`). |
| fac_informal_count | bigint | Count of informal enforcement actions in the last 5 years (`FAC_INFORMAL_COUNT`). |
| fac_penalty_count | bigint | Count of penalties in the last 5 years (`FAC_PENALTY_COUNT`). |
| fac_qtrs_with_nc | bigint | Number of quarters in noncompliance over the last 3 years (`FAC_QTRS_WITH_NC`). |
| fac_programs_with_snc | bigint | Count of programs in which the facility has a serious/significant violation (`FAC_PROGRAMS_WITH_SNC`). |
| fac_last_penalty_amt | double precision | Most-recent single penalty dollar amount, USD (`FAC_LAST_PENALTY_AMT`); distinct from the lifetime fac_total_penalties. |
| fac_3yr_compliance_history | text | 12-quarter overall compliance-status time series string (`FAC_3YR_COMPLIANCE_HISTORY`); raw delimited source text. |
| tri_releases_transfers | double precision | Toxics Release Inventory total releases + transfers, pounds (`TRI_RELEASES_TRANSFERS`). |
| tri_on_site_releases | double precision | TRI on-site releases, pounds (`TRI_ON_SITE_RELEASES`). |
| tri_off_site_transfers | double precision | TRI off-site transfers, pounds (`TRI_OFF_SITE_TRANSFERS`). |
| ghg_co2_releases | double precision | Greenhouse-gas CO2-equivalent emissions (`GHG_CO2_RELEASES`); carbon/ESG measure. |
| air_ids | text | Clean Air Act program IDs (`AIR_IDS`); raw delimited list, join key to air-program datasets. |
| npdes_ids | text | NPDES (Clean Water Act) permit IDs (`NPDES_IDS`); raw delimited list. |
| rcra_ids | text | RCRA handler IDs (`RCRA_IDS`); raw delimited list. |
| sdwa_ids | text | Safe Drinking Water Act system IDs (`SDWA_IDS`); raw delimited list. |
| tri_ids | text | Toxics Release Inventory facility IDs (`TRI_IDS`); raw delimited list. |
| ghg_ids | text | Greenhouse-gas reporting IDs (`GHG_IDS`); raw delimited list. |
| fec_case_ids | text | Federal enforcement case IDs (`FEC_CASE_IDS`); raw delimited list. |
| air_flag | text | 'Y'/blank flag: facility is in the Clean Air Act universe (`AIR_FLAG`). |
| npdes_flag | text | 'Y'/blank flag: facility is an NPDES (Clean Water Act) permittee (`NPDES_FLAG`). |
| sdwis_flag | text | 'Y'/blank flag: facility is in the Safe Drinking Water Act universe (`SDWIS_FLAG`). |
| rcra_flag | text | 'Y'/blank flag: facility is an RCRA hazardous-waste handler (`RCRA_FLAG`). |
| tri_flag | text | 'Y'/blank flag: facility is a TRI reporter (`TRI_FLAG`). |
| ghg_flag | text | 'Y'/blank flag: facility is a greenhouse-gas reporter (`GHG_FLAG`). |
| caa_permit_types | text | CAA permit type(s) (`CAA_PERMIT_TYPES`); raw delimited source text. |
| caa_evaluation_count | bigint | CAA evaluation/inspection count, last 5 yrs (`CAA_EVALUATION_COUNT`). |
| caa_informal_count | bigint | CAA informal action count, last 5 yrs (`CAA_INFORMAL_COUNT`). |
| caa_formal_action_count | bigint | CAA formal action count, last 5 yrs (`CAA_FORMAL_ACTION_COUNT`). |
| caa_date_last_formal_action | date | Date of last CAA formal action (`CAA_DATE_LAST_FORMAL_ACTION`). |
| caa_penalties | double precision | CAA penalties total, USD (`CAA_PENALTIES`). |
| caa_last_penalty_date | date | Date of last CAA penalty (`CAA_LAST_PENALTY_DATE`). |
| caa_last_penalty_amt | double precision | Most-recent CAA penalty amount, USD (`CAA_LAST_PENALTY_AMT`). |
| caa_qtrs_with_nc | bigint | CAA quarters in noncompliance (`CAA_QTRS_WITH_NC`). |
| caa_compliance_status | text | CAA current compliance status (`CAA_COMPLIANCE_STATUS`). |
| caa_hpv_flag | text | 'Y'/blank High Priority Violator flag under CAA (`CAA_HPV_FLAG`). |
| caa_3yr_compl_qtrs_history | text | CAA 12-quarter compliance-status time series string (`CAA_3YR_COMPL_QTRS_HISTORY`). |
| cwa_permit_types | text | CWA permit type(s) (`CWA_PERMIT_TYPES`); raw delimited source text. |
| cwa_inspection_count | bigint | CWA inspection count, last 5 yrs (`CWA_INSPECTION_COUNT`). |
| cwa_informal_count | bigint | CWA informal action count, last 5 yrs (`CWA_INFORMAL_COUNT`). |
| cwa_formal_action_count | bigint | CWA formal action count, last 5 yrs (`CWA_FORMAL_ACTION_COUNT`). |
| cwa_date_last_formal_action | date | Date of last CWA formal action (`CWA_DATE_LAST_FORMAL_ACTION`). |
| cwa_penalties | double precision | CWA penalties total, USD (`CWA_PENALTIES`). |
| cwa_last_penalty_date | date | Date of last CWA penalty (`CWA_LAST_PENALTY_DATE`). |
| cwa_last_penalty_amt | double precision | Most-recent CWA penalty amount, USD (`CWA_LAST_PENALTY_AMT`). |
| cwa_qtrs_with_nc | bigint | CWA quarters in noncompliance (`CWA_QTRS_WITH_NC`). |
| cwa_compliance_status | text | CWA current compliance status (`CWA_COMPLIANCE_STATUS`). |
| cwa_snc_flag | text | 'Y'/blank Significant Non-Compliance flag under CWA (`CWA_SNC_FLAG`). |
| cwa_13qtrs_compl_history | text | CWA 13-quarter compliance-status time series string (`CWA_13QTRS_COMPL_HISTORY`). |
| cwa_13qtrs_efflnt_exceedances | text | CWA 13-quarter effluent-exceedance time series string (`CWA_13QTRS_EFFLNT_EXCEEDANCES`). |
| cwa_3_yr_qncr_codes | text | CWA 3-year QNCR (quarterly noncompliance report) code series (`CWA_3_YR_QNCR_CODES`). |
| rcra_permit_types | text | RCRA permit type(s) (`RCRA_PERMIT_TYPES`); raw delimited source text. |
| rcra_inspection_count | bigint | RCRA inspection count, last 5 yrs (`RCRA_INSPECTION_COUNT`). |
| rcra_informal_count | bigint | RCRA informal action count, last 5 yrs (`RCRA_INFORMAL_COUNT`). |
| rcra_formal_action_count | bigint | RCRA formal action count, last 5 yrs (`RCRA_FORMAL_ACTION_COUNT`). |
| rcra_date_last_formal_action | date | Date of last RCRA formal action (`RCRA_DATE_LAST_FORMAL_ACTION`). |
| rcra_penalties | double precision | RCRA penalties total, USD (`RCRA_PENALTIES`). |
| rcra_last_penalty_date | date | Date of last RCRA penalty (`RCRA_LAST_PENALTY_DATE`). |
| rcra_last_penalty_amt | double precision | Most-recent RCRA penalty amount, USD (`RCRA_LAST_PENALTY_AMT`). |
| rcra_qtrs_with_nc | bigint | RCRA quarters in noncompliance (`RCRA_QTRS_WITH_NC`). |
| rcra_compliance_status | text | RCRA current compliance status (`RCRA_COMPLIANCE_STATUS`). |
| rcra_snc_flag | text | 'Y'/blank Significant Non-Compliance flag under RCRA (`RCRA_SNC_FLAG`). |
| rcra_3yr_compl_qtrs_history | text | RCRA 12-quarter compliance-status time series string (`RCRA_3YR_COMPL_QTRS_HISTORY`). |
| sdwa_system_types | text | SDWA public-water-system type(s) (`SDWA_SYSTEM_TYPES`); raw delimited source text. |
| sdwa_informal_count | bigint | SDWA informal action count (`SDWA_INFORMAL_COUNT`). |
| sdwa_formal_action_count | bigint | SDWA formal action count (`SDWA_FORMAL_ACTION_COUNT`). |
| sdwa_compliance_status | text | SDWA current compliance status (`SDWA_COMPLIANCE_STATUS`). |
| sdwa_snc_flag | text | 'Y'/blank Significant Non-Compliance flag under SDWA (`SDWA_SNC_FLAG`). |
| fec_number_of_cases | bigint | Number of federal enforcement cases against the facility (`FEC_NUMBER_OF_CASES`). |
| fec_last_case_date | date | Date of the most recent federal enforcement case (`FEC_LAST_CASE_DATE`). |
| fec_total_penalties | double precision | Total federal enforcement-case penalties, USD (`FEC_TOTAL_PENALTIES`). |
| fac_fips_code | text | 5-digit state+county FIPS geo identifier (`FAC_FIPS_CODE`). |
| fac_percent_minority | double precision | Percent minority population within a 3-mile radius (`FAC_PERCENT_MINORITY`); environmental-justice demographic. |
| fac_pop_den | double precision | Population density within a 3-mile radius (`FAC_POP_DEN`); environmental-justice demographic. |
| fac_derived_huc | text | Watershed Hydrologic Unit Code derived from the facility's coordinates (`FAC_DERIVED_HUC`). |
| fac_derived_cd113 | text | 113th-Congress congressional district derived from coordinates (`FAC_DERIVED_CD113`). |
| fac_naa_flag | text | 'Y'/blank flag: facility is in a Clean Air Act non-attainment area (`FAC_NAA_FLAG`). |
| fac_imp_water_flg | text | 'Y'/blank flag: facility discharges to an impaired water (`FAC_IMP_WATER_FLG`). |
| fac_indian_cntry_flg | text | 'Y'/blank flag: facility is located in Indian country (`FAC_INDIAN_CNTRY_FLG`). |
| fac_federal_flg | text | 'Y'/blank flag: facility is a federal facility (`FAC_FEDERAL_FLG`). |
| fac_federal_agency | text | Owning federal agency for a federal facility (`FAC_FEDERAL_AGENCY`). |
| captured_date | date | The UTC calendar day EPA's `echo_exporter.zip` was CAPTURED from EPA — set from `Utc::now().date_naive()` on a live run and from the bronze object's capture partition (`BronzeObject::captured_day()`) on a replay, so re-parsing an old capture reproduces its original date instead of stamping today. Not a source field: this is our provenance for when the snapshot became knowable, and the basis of `available_date`. NULL on rows written before migration 000175, where `available_date` falls back to `synced_at::date` — the same value for a live capture. |
| available_date | date | PUBLIC-availability date. STORED generated column, `COALESCE(captured_date, (synced_at AT TIME ZONE 'UTC')::date)` — the calendar day this weekly snapshot was captured. There is no natural per-row event/period date to conform instead, since this is a current-state master file, not a dated transaction log. |
Access echo_facilities
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="echo_facilities",
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the echo_facilities dataset?
EPA-regulated facilities and their compliance history, from ECHO. One regulated facility's current geocoded master attributes — name, address, lat/long, active/major-facility flags, overall compliance status, cumulative lifetime penalty total, lifetime inspection count, and NAICS/SIC classification codes — as of EPA ECHO's latest weekly full-refresh of its `ECHO_EXPORTER.csv` bulk export (inside `echo_exporter.zip`), keyed on `REGISTRY_ID`. This is EPA's facility MASTER file: it carries no intrinsic event or reporting-period date of its own — every row is just the facility's current attributes at the moment EPA regenerated the export — unlike the sibling `echo_enforcement_cases` table, whose rows are dated case activities.
How do I avoid look-ahead bias with echo_facilities?
Filter on echo_facilities.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — snapshot: available_date = COALESCE(captured_date, synced_at::date) — the calendar day EPA's weekly full-refresh export was CAPTURED (no intrinsic event/period date exists on this master-file snapshot). Identical to the ingestion day on a live run; on a bronze replay it is the day the source was originally contacted, never the replay day. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get echo_facilities?
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="echo_facilities". The column schema is public at https://api.obscura.trade/v1/catalog/echo_facilities.
How often is echo_facilities updated?
Obscura refreshes echo_facilities 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.