The Environmental Compliance Check API tells you what the EPA's records say about the facilities that carry a company's name
Send a company name, with a state if you like, and get its active EPA-regulated facilities totalled in one answer: compliance status, inspections, enforcement actions and penalties. 3 credits, charged only when a facility carries the name.

3
Credits per company
about $0.01 on Starter, $14.85 per 1,000
0
Credits when no facility carries the name
no facility, no charge
5 years
Of inspections, actions and penalties
compliance over the last 12 quarters
10
Riskiest facilities listed
each with a link to the EPA's page
The EPA's search returns six facilities and only the five that carry the name are counted
A site that once used the name is left out, so every total describes the facilities that really carry it, and the answer keeps both numbers.

A company comes back as totals over the facilities that carry its name in one flat payload
Every total counts only the facilities that carry the name
The EPA's own search returns sites that once used a name, so a search for one oil company also returns stores that sold its fuel. The API keeps a facility only when its own name carries every word you sent, and computes each total from those facilities.
- matched_facilities and total_matches_in_epa kept apart
- Order, case and endings such as Inc ignored
- A long word also matches the start of a longer one
- Only active facilities searched
The EPA's own flag for a serious violator is counted
A facility the EPA flags as in significant non-compliance is counted on its own line, next to the facilities with quarters in violation and those with a current violation, so a risk screen can start from the serious cases.
- facilities_in_snc
- facilities_with_quarters_in_nc
- facilities_with_current_violation
- compliance_status for each facility
Inspections, actions and penalties come with their window
Compliance is counted over the last 12 quarters and inspections, notices of violation, formal enforcement actions and penalties over the last 5 years. The windows object states both in every answer, so no figure is read against the wrong period.
- Inspections and the date of the last one
- Notices of violation and formal actions
- Penalties in whole US dollars
- The windows stated in every answer
The ten riskiest facilities are listed with a link to each
Each facility comes with its compliance status, address, the programs it is regulated under, such as air or hazardous waste, and a link to its own page on the EPA's site, so a reviewer can open the record behind the number.
- Riskiest facility first
- Address, town, state and zip
- Programs it is regulated under
- echo_url to the EPA's page
A plain assessment says where to look first
primary_action is REVIEW when a facility is in significant non-compliance or has formal enforcement or penalties, VERIFY when violations or notices are on record, and APPROVE when every matched facility is clear. It states what the EPA's records show, never that no violation exists.
- REVIEW, VERIFY or APPROVE
- secondary_actions that say why
- A partial read is VERIFY, never APPROVE
- user_message in plain words
A name no facility carries costs nothing
You are charged 3 credits only when at least one facility's own name carries the words you sent. A name the EPA returned facilities for but none carries, a name with no active facility, a malformed entry and a lookup the EPA could not answer cost 0, and that holds for bulk CSV jobs as well as the API.
- Zero credits when none match
- Bulk CSV with a company column
- The same credits as every other product
- One API key for all of it
A company name goes in and the EPA's record for its facilities comes out
Send a name
POST a company or facility name, with a two-letter state if you want to narrow it. Endings such as Inc and LLC are dropped, and a malformed entry is refused with a clear error and costs nothing.
$ POST /api/v1/epa-compliance-check
"company": "Sample Chemical"
"state": "TX"
We read the EPA's records
The EPA's database is searched for active facilities, and only the ones whose own name carries every word you sent are kept. Their compliance status, inspections, enforcement actions and penalties are totalled over the stated windows.
Name cleaned and checked
EPA database searched
Facilities kept by their own name
Totals computed over the stated windows
Get the totals and the facilities, flat and structured
The totals, the ten riskiest facilities and an assessment arrive in one JSON payload. A company with a facility that carries its name bills 3 credits, and a name no facility carries bills nothing.
companysample chemical
matched3 facilities, 1 in SNC
penalties$2,417,795, 5 years
One endpoint checks a company and works like every other 1Lookup call
Same authentication, same credit balance, and the same response envelope as every other 1Lookup product. If you have already integrated one endpoint, this one is a URL change.
curl -X POST https://app.1lookup.io/api/v1/epa-compliance-check \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{ "company": "Sample Chemical" }'{
"classification": {
"found": true,
"outcome": "matched",
"company": "sample chemical",
"state": null,
"matched_facilities": 3,
"total_matches_in_epa": 4,
"facilities_in_snc": 1,
"facilities_with_quarters_in_nc": 2,
"inspections_5yr": 14,
"formal_actions_5yr": 5,
"penalties_usd_5yr": 2417795,
"assessment": "REVIEW",
"top_facility": "SAMPLE CHEMICAL PLANT 1",
"states": ["LA", "TX"],
"truncated": false,
"checked_at": "2026-10-25",
"name_search": true
},
"insights": {
"epa_compliance_result": {
"outcome": "matched",
"totals": {
"matched_facilities": 3,
"total_matches_in_epa": 4,
"facilities_in_snc": 1,
"facilities_with_quarters_in_nc": 2,
"facilities_with_current_violation": 2,
"inspections_5yr": 14,
"informal_actions_5yr": 5,
"formal_actions_5yr": 5,
"penalties_usd_5yr": 2417795,
"states": ["LA", "TX"]
},
"facilities": [
{
"name": "SAMPLE CHEMICAL PLANT 1",
"registry_id": "999900000001",
"city": "SAMPLETOWN",
"state": "TX",
"compliance_status": "Significant Violation",
"in_snc": true,
"quarters_in_nc": 12,
"inspections": 11,
"formal_actions": 4,
"penalties_usd": 2204913,
"programs": ["Air", "Water discharge", "Hazardous waste"],
"echo_url": "https://echo.epa.gov/detailed-facility-report?fid=999900000001"
}
],
"facilities_listed": 3,
"windows": { "compliance_quarters": 12, "inspections_and_enforcement_years": 5 },
"data_source": "epa_echo"
}
},
"recommendations": {
"primary_action": "REVIEW",
"secondary_actions": [
"review_facilities_in_significant_noncompliance",
"review_enforcement_and_penalties",
"confirm_facilities_belong_to_the_company"
]
},
"metadata": { "credits_used": 3, "cache_hit": false }
}A column of companies goes in and one row per company comes out
Upload a CSV with a company column, with a state after the name and a comma if you want one, and download a result file with each company's outcome, assessment, facility count and penalties. The three companies here are invented.
- 1company
- 2sample chemical
- 3Sample Foods, OH
- 4Sample Plating Works
| company | Found | Outcome | Assessment | Facilities Matched | In Significant Non-Compliance | Penalties (USD, 5 Years) | Credits Used |
|---|---|---|---|---|---|---|---|
| sample chemical | Yes | matched | REVIEW | 3 | 1 | 2417795 | 3 |
| Sample Foods, OH | Yes | matched | APPROVE | 2 | 0 | 0 | 3 |
| Sample Plating Works | No | no_name_match | 0 |
Seven more columns in the file, among them Facilities The EPA Returned, With Quarters In Violation, Inspections (5 Years), Formal Actions (5 Years), Riskiest Facility, States and Read On.
One row in, one row out
Every company becomes one row, so a supplier list of 500 names is a spreadsheet of 500 rows you can sort by penalties or filter by assessment.
A name no facility carries is a free row
A typo, a name the EPA matched only loosely or a company with no active facility comes back as a row that says so and costs 0 credits, so cleaning a list never bills for the misses.
Facility names are guarded in the file
A facility name is text the facility filed with the EPA, so the file guards it against spreadsheet formulas before you open it.
One call returns the EPA's record for the facilities that carry a company's name
One call turns a company name on a supplier list, a loan file or a watchlist into the EPA's record for the active facilities that carry it: how many matched, how many are in significant non-compliance, the inspections and enforcement of the last 5 years and the penalties, with the raw JSON your code receives beside it. Every figure is computed from the facilities that carry the name, never from the EPA's wider search.
- Companysample chemical
- Facilities matched3 of 4 returned
- In significant non-compliance1
- With quarters in violation2
- Inspections, 5 years14
- Formal actions, 5 years5
- Penalties, 5 years$2,417,795
- StatesLA, TX
- Riskiest facilitySAMPLE CHEMICAL PLANT 1
- AssessmentREVIEW
- Read on2026-10-25
{
"classification": {
"found": true,
"outcome": "matched",
"company": "sample chemical",
"matched_facilities": 3,
"total_matches_in_epa": 4,
"facilities_in_snc": 1,
"formal_actions_5yr": 5,
"penalties_usd_5yr": 2417795,
"assessment": "REVIEW",
"top_facility": "SAMPLE CHEMICAL PLANT 1",
"checked_at": "2026-10-25"
},
"insights": {
"epa_compliance_result": {
"facilities_listed": 3,
"data_source": "epa_echo"
}
},
"metadata": { "credits_used": 3 }
}Every environmental compliance check returns the same fields at one flat price
A figure the EPA's records do not hold comes back as null and never as a guess, and every company with a facility costs the same 3 credits.
Question and outcome
- found
- outcome
- company
- state
- name_search
- checked_at
Totals
- matched_facilities
- total_matches_in_epa
- facilities_in_snc
- facilities_with_quarters_in_nc
- facilities_with_current_violation
- states
- truncated
- scanned_facilities
Inspections, actions and penalties
- inspections_5yr
- informal_actions_5yr
- formal_actions_5yr
- penalties_usd_5yr
- windows
- scope
Each facility
- facilities[].name
- facilities[].registry_id
- facilities[].address
- facilities[].compliance_status
- facilities[].in_snc
- facilities[].quarters_in_nc
- facilities[].inspections
- facilities[].formal_actions
- facilities[].penalties_usd
- facilities[].programs[]
- facilities[].echo_url
Assessment
- assessment
- top_facility
- primary_action
- secondary_actions[]
- user_message
Procurement, credit and compliance teams check a company's record instead of opening one EPA page per facility
Procurement teams vetting a supplier
Check a manufacturer on your approved-vendor list for facilities in significant non-compliance or recent penalties, and send the REVIEW ones to a person before a contract renews.
Lenders and insurers sizing an industrial borrower
Start the file from the EPA's record: how many regulated sites the borrower runs, what was recorded against them in the last 5 years and which site to open first.
Investors and ESG analysts screening a holding
Run a watchlist of companies through a bulk job, then sort the rows by penalties or by the number of facilities in significant non-compliance.
Compliance and risk teams onboarding a counterparty
Add the EPA's record to the counterparty file, then compare the facilities it lists with the sites the counterparty told you it operates.
Journalists and researchers
Find the facilities behind a company's name, read their penalties and inspections in one answer and open each one on the EPA's site to read the detail.
Due diligence teams on an acquisition
Screen a target's facilities for enforcement and penalties before a deeper environmental review is ordered, and confirm the facility names belong to the target.
Only a name that a facility carries is billed, and every other answer is free
A name that active facilities carry returns the totals for one charge. A name the EPA returned facilities for but none carries returns a plain answer at no charge, and so does a name with no active facility.

These are the questions people ask before they check their first company
What does the Environmental Compliance Check API return?
Send a company or facility name, with a two-letter state if you like, and it returns the active EPA-regulated facilities whose own name carries it, totalled: how many matched, how many are in significant non-compliance, how many had quarters in violation in the last 12, and the inspections, notices of violation, formal enforcement actions and penalties of the last 5 years. It also lists the ten riskiest facilities with their compliance status, address, programs and a link to each one's page on the EPA's site, and gives an overall assessment of REVIEW, VERIFY or APPROVE.
Where does the data come from?
From the EPA's public Enforcement and Compliance History Online database, which holds the compliance status, inspections, enforcement actions and penalties of the facilities the EPA regulates. The EPA refreshes it weekly, and checked_at says the day we read it.
How does it decide which facilities belong to a company?
By name. The EPA's own search is loose: it matches every word anywhere in any name a site has been filed under, so a search for one oil company also returns stores that once sold its fuel. We keep a facility only when its own name carries every word you sent. Order, capital letters and endings such as Inc and LLC do not matter, a word of five or more letters also matches the start of a longer word, and only active facilities are searched. matched_facilities says how many carried the name and total_matches_in_epa how many the EPA returned.
How much does a check cost?
3 credits per company, about $0.01 on the Starter plan. You are charged only when at least one facility's own name carries the words you sent. A name the EPA returned facilities for but no facility carries, a name with no active facility, a malformed entry and a lookup the EPA could not answer all cost 0 credits, in the API, the dashboard and bulk jobs.
What time windows do the figures cover?
Compliance, meaning quarters in violation, is counted over the last 12 quarters, which is 3 years. Inspections, notices of violation, formal enforcement actions and penalties are counted over the last 5 years. Both windows are stated in every answer, in the windows object.
What do REVIEW, VERIFY and APPROVE mean?
REVIEW means a matched facility is in significant non-compliance now, or has formal enforcement or penalties in the last 5 years. VERIFY means there are quarters in violation, a current violation or notices of violation on record, and it is also returned for a clean result that did not read every facility the EPA returned. APPROVE means every matched facility is clear in the EPA's records. It states what the records show for the facilities matched, never that no violation exists.
Does a clean result mean the company has no violations?
No. It means the EPA's records show none for the facilities that carried the name, in the windows checked. A parent company's sites filed under other names, other agencies' records and anything not yet reported to the EPA are not in it, and the answer asks you to confirm the facilities are the sites you mean.
Why does a company I know come back with fewer facilities than I expected?
Facilities are matched by their own name, not by who owns them, so a parent company's sites filed under other names are not found. Only active facilities are searched. Try the name the facilities use, or send the facility's own name.
What happens when a name matches thousands of facilities?
The lookup reads the first 3,000 the EPA returns, in the EPA's own order, which is arbitrary but not biased. The answer sets truncated to true, says the totals are partial and suggests adding a state. A state, or a more specific name, narrows the search so every facility is read.
What happens when I send a bad name or the EPA does not answer?
A name shorter than 3 or longer than 120 characters, a name that is only an ending such as Inc or Company, and a state that does not exist are refused with a 400 before anything is charged. If the EPA does not answer, the API responds 503 with a Retry-After header, charges nothing and does not save the answer, so a retry is never a second charge. A failure is never read as no facility.
How current is the record, and can I ask again?
The EPA refreshes the database weekly and checked_at names the day we read it. A repeat lookup of the same company by the same user within 7 days comes from the cache at no charge. Send bypass_cache: true to read the EPA's records again instead of reusing the saved answer.
What input does it accept?
A company or facility name of 3 to 120 characters, read by at most its first 8 words, and an optional two-letter state or territory code. You can send company and state as separate fields, or the state after a comma in the name, such as Sample Chemical, TX. Endings such as Inc and LLC are dropped.
Can I check a list of companies at once?
Yes. Upload a CSV with a company column, with a state after the name and a comma if you want one, and you get a row per company with its outcome, assessment, facility counts, penalties and riskiest facility. A row with no facility is a free miss, not a failure. The price stays at the same credits per company with a facility, however long the list is.
What does it not cover?
Only the EPA's records. Other agencies' records are not included, and facilities are not matched to a parent company, so a company's sites under other names are not found. It reads the EPA's database for active facilities and does not say who owns a facility.
To check a single company before you write any code, run it through the free EPA facility compliance lookup.
The EPA's record covers the facilities, and these products check the rest
Here is how checking a company's environmental record with 1Lookup compares with the other sources
Each page sets a rival's plans and prices beside ours and says where the rival does the job better. Every figure carries its source and the date it was checked.