EPA RCRA Hazardous Waste Generator Rollup — Tons, Codes, LQG avatar

EPA RCRA Hazardous Waste Generator Rollup — Tons, Codes, LQG

Pricing

from $4.40 / 1,000 results

Go to Apify Store
EPA RCRA Hazardous Waste Generator Rollup — Tons, Codes, LQG

EPA RCRA Hazardous Waste Generator Rollup — Tons, Codes, LQG

Every RCRA hazardous waste generator in a US state, rolled up from the EPA Biennial Report: tons generated, shipped, managed and received; federal waste codes split into listed, characteristic and acute; LQG/SQG status; EPA management methods; the TSDFs used; and a cycle-over-cycle trend.

Pricing

from $4.40 / 1,000 results

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

EPA RCRA Hazardous Waste Generator Rollup — Tons, Waste Codes & LQG Status

Turn the EPA RCRAInfo Biennial Report (BR) into a clean, per-facility hazardous waste generator rollup. Pick a US state and a report cycle (every two years, 2005 through 2023) and get one row per facility with tons generated, shipped, managed and received, the federal RCRA waste codes it reports (split into listed / characteristic / acute), its generator status (LQG / SQG / VSQG), the EPA management methods its waste goes to, the TSDFs it ships to, and a cycle-over-cycle tonnage delta — ranked by tons generated and scored against the whole state.

The raw Biennial Report is one row per waste-stream line, so a single facility appears in dozens of rows. This actor does the aggregation for you.

Keyless. Sources the official EPA Envirofacts BR_REPORTING table (67 columns).

Who it's for

  • Environmental compliance & EHS managers — pull your own facility's certified BR filing, check the generator status EPA has on record, and see which waste codes and management methods are attached to it.
  • Hazardous-waste transporters & TSDFs — a prospect list of the largest generators in a state, filtered by NAICS, waste code and management method, with primary_receiver_id showing which competitor already has the account.
  • Phase I ESA / environmental due diligence — establish whether a site or its neighbours are large-quantity generators, what they generate, and whether that changed between cycles.
  • ESG, supply-chain and procurement auditors — benchmark a supplier against every other generator in its state (share_of_state_generation_pct) and flag acute (P-code) and listed-waste generation.
  • Insurers, lenders and researchers — screen counterparties for LQG status, acute waste, deep-well injection and mixed radioactive waste.

Example input

{
"states": ["Delaware"],
"reportCycle": 2023,
"compareToPriorCycle": true,
"naicsPrefix": "",
"minTons": 0,
"maxResults": 2000
}

Prospecting example — the largest chemical/petroleum generators in New Jersey that ship off-site, with the 2021 → 2023 trend:

{
"states": ["NJ"],
"reportCycle": 2023,
"compareToPriorCycle": true,
"naicsPrefix": "324",
"minTons": 50,
"maxResults": 500
}

What v1.1 fixed

This actor was hardened against live EPA data before publication. Four defects were found that would each have billed you for a confident wrong answer:

DefectEvidenceFix
Fabricated waste codes. waste_code_group holds EPA group labels, not codes. v1.0 chopped them into 4-character chunks.33 of Delaware's 88 handlers (37.5%) carried codes that do not exist in 40 CFR 261 — TCMT, DMIX, UMIX, PMIX, LABP, TCOR, and ONLY (from the literal value "TCOR Only").Codes come from federal_waste_codes only and must match [DFKPU]###. Group labels are kept in their own field.
Another company's waste attributed to the generator. br_form = WR rows are waste a TSDF received from others.7,722 of 10,715 Texas 2023 rows (72%) were WR, carrying 422,465 managed tons and their own waste codes.GM / WR / XX lines are counted and totalled separately.
Silent truncation. efservice publishes a COUNT endpoint; v1.0 never called it, and a single transient error mid-pagination ended the loop quietly.Texas 2023 is 50,714 rows, California 285,108. A short loop still produced a ranked "largest generators" list.Every state is checked against the upstream-declared count and the run fails on any mismatch.
A negative asserted without checking. v1.0 returned large_quantity_generator_flag: false for facilities EPA had reported no status for.The flag is null when unknown, and lqg_flag_basis says which of epa_status / tonnage_heuristic / unknown produced it.
Cycle 2021 reported as "0 tons generated" for every facility. EPA publishes no generation_tons or managed_tons at all for the 2021 cycle; v1.0 coerced those nulls to 0.All 1,435 Delaware 2021 rows are null generation with shipped_tons populated on 1,427; confirmed identical on Texas and California. A 2021 run produced a full billable dataset of zeros, ranked arbitrarily, and minTons removed every handler.Tonnage is null when unreported. Ranking, minTons and share-of-state fall back to shipped tons and say so via ranking_tons_basis; the trend uses shipped-vs-shipped, which spans the gap.

Also corrected: the repo previously recorded that Rhode Island returned no data. It does not — RI 2023 has 85,982 rows. That was a cold-query artefact.

Output fields (one row per facility)

Identity & location

FieldDescription
handler_idEPA RCRA handler ID (EPA ID number).
handler_nameFacility / handler name as filed.
street_addressStreet address, assembled from the three BR street columns.
city, state, zip, countyFacility location.
county_codeEPA county code (state prefix + 3-digit FIPS), e.g. DE003.
epa_regionEPA region 1–10.
primary_naicsPrimary NAICS industry code.
report_cycleBiennial Report cycle year of this record.
last_change_dateNewest RCRAInfo last_change across the facility's lines (data vintage).

Tonnage

FieldDescription
total_generation_tonsTons of hazardous waste generated across every waste-stream line. null if no line reported a tonnage at all — never coerced to 0.
total_shipped_tonsTons shipped off-site.
total_managed_tonsTons managed on-site across every BR line, including waste received from others.
managed_tons_own_generationThe part of total_managed_tons that is the facility's own waste.
managed_tons_from_receivedThe part that is other companies' waste. null if the facility received nothing.
total_received_tonsTons received from other companies (TSDF intake).
wastewater_tons / nonwastewater_tonsGeneration split by EPA's wastewater flag.
generation_tons_reportedWhether EPA published a generation tonnage at all. false on every 2021-cycle row.
ranking_tons / ranking_tons_basisThe tonnage used for ranking, minTons and share-of-state: generation tons, or shipped tons when EPA published none.
state_generation_tons_totalStatewide generation for the cycle, computed before your filters.
state_ranking_tons_total / share_of_state_ranking_tons_pctSame, on the ranking-tons basis — populated even in cycle 2021.
share_of_state_generation_pctThis facility's share of statewide generation, to 4 dp.
state_handler_countDistinct handlers in the state for the cycle, pre-filter.
generation_rankRank by generation tons within the returned set (1 = largest).

Waste codes

FieldDescription
distinct_waste_codesValidated federal RCRA codes ([DFKPU]###) on waste this facility generated.
n_distinct_waste_codesCount of the above.
listed_waste_codesF (40 CFR 261.31), K (261.32), P (261.33(e)), U (261.33(f)) codes.
characteristic_waste_codesD codes — ignitability, corrosivity, reactivity, toxicity (261.20–261.24).
acute_waste_codesP codes: acutely hazardous commercial chemicals, which carry the 1 kg/month LQG threshold.
has_listed_waste, has_characteristic_waste, has_acute_hazardous_wastetrue/false when the facility filed federal codes; null when it filed none.
received_waste_codesCodes on waste received from others — deliberately kept out of distinct_waste_codes.
waste_code_groupsRaw EPA group labels (DMIX, TCMT, LABP, ICR, F1_5 …). Classifications, not codes.

Generator status

FieldDescription
generator_statusMost severe RCRA generator status across the facility's lines (LQG / SQG / VSQG / …).
generator_status_codeThe raw EPA letter behind it (L/S/V/C/E/N).
generator_status_codesEvery distinct status letter filed, so a mixed filing is visible.
large_quantity_generator_flagtrue/false from EPA's status; null when EPA reported none and tonnage is below the fallback line.
lqg_flag_basisepa_status, tonnage_heuristic, or unknown.

Management & destination

FieldDescription
management_method_codesEPA management-method H-codes (H040, H061, H134, H141 …).
management_method_breakdownPer H-code: code, EPA category, line count, tons. Sorted by tons.
top_management_method_code / top_management_method_category / top_management_method_tonsThe method handling the most tons: the EPA management-method code, its published category label, and the tons it handled. top_management_method_category is null where EPA publishes no label for the code (H141, H042) — no label is invented.
dominant_management_categoryLegacy v1.0 field. EPA leaves this blank on 53.6% of Delaware rows; prefer the H-code fields.
offsite_receiver_ids, n_offsite_receivers, primary_receiver_id, receiver_statesThe TSDFs this generator ships to.

Line types, characteristics & provenance

FieldDescription
n_waste_streamsTotal BR lines filed, all form types.
n_generated_waste_streams / n_received_waste_streams / n_no_activity_linesGM / WR / XX split.
is_receiving_facilityTrue when the facility filed at least one Waste Received line.
filed_no_activityTrue when every line was a no-activity filing.
mixed_radioactive_waste_flag, acute_waste_reported_flag, priority_chemical_flag, state_only_waste_flagnull when EPA reported nothing on that dimension.
waste_minimization_codes, source_codes, form_codesEPA waste-minimization, waste-origin and physical-form codes.
br_statusok, or ok_unverified_count when the COUNT probe itself was unavailable.
state_rows_expected / state_rows_retrievedUpstream-declared vs actually-retrieved row counts. Equal on every emitted row.
latest_cycle_detected, newer_cycle_availableLive freshness probe, so a stale cycle is never served as current.
source_url, checked_at, disclaimerProvenance.

Cycle-over-cycle (when compareToPriorCycle is on)

FieldDescription
prior_cycle, prior_cycle_generation_tons, prior_cycle_generator_statusThe previous biennial cycle.
generation_tons_delta, generation_pct_changeChange versus the prior cycle. null across the 2021 gap, because EPA published no 2021 generation tonnage.
prior_cycle_shipped_tons, shipped_tons_delta, shipped_tons_pct_changeShipped-tons trend. shipped_tons is populated in every cycle, so this is the only apples-to-apples comparison that spans 2021.
generator_status_changedTrue when the status moved (e.g. SQG → LQG).
new_generator_this_cycleTrue when the facility filed this cycle but not last.
prior_cycle_statusok, unavailable (every prior field is null, never 0), or not_requested.

Use as an MCP tool

This actor is a clean, chainable tool for AI agents (Claude, Cursor, …) via mcp.apify.com. Every output field carries a description, so an agent can answer "who are the largest hazardous-waste generators in Harris County", "does facility X report LQG status", or "which Delaware generators produce acute P-listed waste" and pass the structured result into the next step. Null-vs-false is a contract here: a null means the source did not answer, never that the answer was negative.

Notes & FAQ

Where does the data come from? EPA Envirofacts RCRAInfo Biennial Report (data.epa.gov/efservice/BR_REPORTING) — the federal hazardous-waste generation and management dataset, filed every two years by generators and TSDFs. No API key needed.

Which report cycles are available? Every biennial cycle from 2005 to 2023 — 2005, 2007, 2009, 2011, 2013, 2015, 2017, 2019, 2021, 2023 — all confirmed live on 2026-07-30 (national row counts run from 1.15M in 2005 to 1.77M in 2023). 2023 is the latest; EPA reports 0 rows for 2025, and asking for it fails the run loudly rather than returning an empty dataset. The actor's own docs previously claimed only 2019/2021/2023. Note on 2021: EPA publishes no generation or managed tonnage for that cycle anywhere in the country, only shipped tonnage. Rows from a 2021 run carry generation_tons_reported: false and rank on shipped tons. The actor probes EPA at start-up; if a newer cycle has appeared, every row carries newer_cycle_available: true and latest_cycle_detected.

Are the tonnages exact? No. They are self-reported figures certified by each handler for the cycle and aggregated across every waste-stream line. They are subject to correction and are not an official EPA determination. This is a screening and analytics aid, not a compliance filing.

Does it include coordinates? No, and none are invented. The Biennial Report has no lat/lon, so this is a county / city / ZIP inventory rollup, not a proximity tool.

How do I filter by industry? Use naicsPrefix ("324" petroleum & coal, "3254" pharmaceutical manufacturing, "3345" electronics). Use minTons to keep only larger generators. Statewide context fields are computed before filtering, so share_of_state_generation_pct stays honest.

What happens if EPA is down or a state comes back short? The run fails with a message naming the state and the row-count gap, and nothing is billed. A partial rollup would understate tonnages and misorder the ranking while looking perfectly normal, so it is never emitted. A state that genuinely has zero BR filings for a cycle is reported as a legitimate empty, not a failure.

Why is a field null instead of 0 or false? Because null means not checked and false means checked and negative. A compliance buyer acting on "0 tons" when the truth is "not reported" makes a real regulatory error, so this actor never converts a missing answer into a confident one.

How large can a state be? California 2023 is 285,108 BR lines and Texas 50,714. The actor pages through all of them and verifies the total against EPA's own count. Turning compareToPriorCycle off halves the fetch on very large states.

Pricing

Pay-per-result: $8 per 1,000 records returned, with graduated discounts on paid Apify plans. You pay only for the generator records emitted — a failed run emits nothing and bills nothing. Use maxResults to cap spend.

Column coverage — the input that populates each conditional field

Every declared field is populated by at least one of these four inputs, all run live against EPA on 2026-07-30 (556 rows, zero dead columns across the set):

InputWhat it proves
{"states":["Delaware"],"reportCycle":2023,"compareToPriorCycle":true} — 88 rowsThe default. Generation tonnage, waste-code classes, management methods, statewide share, shipped-tons trend vs 2021.
{"states":["Texas"],"reportCycle":2023,"compareToPriorCycle":false} — 50,714 BR rowsis_receiving_facility, total_received_tons, managed_tons_from_received, received_waste_codes. Clean Harbors Deer Park files 6 generation lines and 6,228 received-waste lines.
{"states":["Delaware"],"reportCycle":2021,"minTons":0.5} — 67 rowsThe 2021 tonnage gap: generation_tons_reported:false, ranking_tons_basis:"shipped_tons", share_of_state_ranking_tons_pct, and newer_cycle_available:true.
{"states":["Delaware"],"reportCycle":2019,"compareToPriorCycle":true} — 101 rowsGeneration-tonnage delta vs 2017 (BASF Color & Effects: 1,071 → 1,490 tons, +39.05%).