Skip to content
All data sources

EPA Regulated Facilities API and MCP server

No authepa-echo

EPA facility, permit, compliance, inspection, and enforcement context across the US.

EPA Regulated Facilities is published by EPA Enforcement and Compliance History Online and covers United States.

It refreshes on a schedule the publisher sets.

Last verified . That is when these facts were last rebuilt from the ParcelOps source registry, not when EPA Enforcement and Compliance History Online last refreshed the data itself.

API access

Your AI client reaches EPA Regulated Facilities through one ParcelOps MCP endpoint, so there is no separate key to hold for it and no per-source client to write. Reaching it takes no credentials of your own.

Where it came from

PublisherEPA Enforcement and Compliance History Online

Freshness and coverage

FreshnessScheduled · Each EPA program publishes its refresh version with query results.
Places coveredUnited States
Time coveredNot declared
CredentialsNo credentials required

What this source cannot tell you

  • Anything outside United States. A request past that edge comes back empty rather than approximated.
  • Which years it spans, because the covered period is not declared.
  • Anything EPA Enforcement and Compliance History Online does not publish. ParcelOps returns this source as it stands and never fills a blank field from a different one.
  • A proximity result is a screening lead, not proof of contamination, liability, or regulatory status for a parcel.

Methods (6)

A method is one call your agent can make against this source.

  • searchFacilities

    read

    Search all-media EPA facilities and return a short-lived results token.

    Records returnedfacility-search
    How to get more resultsnone
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "state": {
          "type": "string",
          "pattern": "^[A-Za-z]{2}$"
        },
        "county": {
          "type": "string",
          "maxLength": 120
        },
        "countyFips": {
          "type": "string",
          "pattern": "^\\d{1,5}$"
        },
        "naics": {
          "type": "string",
          "pattern": "^\\d{2,6}$"
        },
        "sic": {
          "type": "string",
          "pattern": "^\\d{2,4}$"
        },
        "bbox": {
          "type": "object",
          "properties": {
            "c1lat": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "c1lon": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            },
            "c2lat": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "c2lon": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          "required": [
            "c1lat",
            "c1lon",
            "c2lat",
            "c2lon"
          ],
          "additionalProperties": false
        },
        "latitude": {
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        "longitude": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "radiusMiles": {
          "type": "number",
          "exclusiveMinimum": 0,
          "exclusiveMaximum": 100,
          "description": "Search radius in MILES around latitude/longitude. Required with latitude and longitude; ECHO rejects 0 or 100+."
        },
        "activeOnly": {
          "type": "boolean"
        }
      },
      "required": [],
      "additionalProperties": false
    }
    Output schema
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "resultsToken": {
          "type": "string",
          "minLength": 1
        },
        "summary": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "required": [
        "source",
        "summary"
      ],
      "additionalProperties": true
    }

    Proximity: latitude + longitude + radiusMiles together (miles, under 100).

  • searchAirFacilities

    read

    Search Clean Air Act facilities and return a short-lived results token.

    Records returnedfacility-search
    How to get more resultsnone
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "state": {
          "type": "string",
          "pattern": "^[A-Za-z]{2}$"
        },
        "countyFips": {
          "type": "string",
          "pattern": "^\\d{1,5}$"
        },
        "naics": {
          "type": "string",
          "pattern": "^\\d{2,6}$"
        },
        "sic": {
          "type": "string",
          "pattern": "^\\d{2,4}$"
        },
        "bbox": {
          "type": "object",
          "properties": {
            "c1lat": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "c1lon": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            },
            "c2lat": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "c2lon": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          "required": [
            "c1lat",
            "c1lon",
            "c2lat",
            "c2lon"
          ],
          "additionalProperties": false
        },
        "latitude": {
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        "longitude": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "radiusMiles": {
          "type": "number",
          "exclusiveMinimum": 0,
          "exclusiveMaximum": 100,
          "description": "Search radius in MILES around latitude/longitude. Required with latitude and longitude; ECHO rejects 0 or 100+."
        },
        "activeOnly": {
          "type": "boolean"
        }
      },
      "required": [],
      "additionalProperties": false
    }
    Output schema
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "resultsToken": {
          "type": "string",
          "minLength": 1
        },
        "summary": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "required": [
        "source",
        "summary"
      ],
      "additionalProperties": true
    }

    countyFips only (county name rejected); proximity = lat+lon+radiusMiles.

  • searchWaterFacilities

    read

    Search Clean Water Act facilities and return a short-lived results token.

    Records returnedfacility-search
    How to get more resultsnone
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "state": {
          "type": "string",
          "pattern": "^[A-Za-z]{2}$"
        },
        "county": {
          "type": "string",
          "maxLength": 120
        },
        "countyFips": {
          "type": "string",
          "pattern": "^\\d{1,5}$"
        },
        "naics": {
          "type": "string",
          "pattern": "^\\d{2,6}$"
        },
        "sic": {
          "type": "string",
          "pattern": "^\\d{2,4}$"
        },
        "bbox": {
          "type": "object",
          "properties": {
            "c1lat": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "c1lon": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            },
            "c2lat": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "c2lon": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          "required": [
            "c1lat",
            "c1lon",
            "c2lat",
            "c2lon"
          ],
          "additionalProperties": false
        },
        "latitude": {
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        "longitude": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "radiusMiles": {
          "type": "number",
          "exclusiveMinimum": 0,
          "exclusiveMaximum": 100,
          "description": "Search radius in MILES around latitude/longitude. Required with latitude and longitude; ECHO rejects 0 or 100+."
        },
        "activeOnly": {
          "type": "boolean"
        }
      },
      "required": [],
      "additionalProperties": false
    }
    Output schema
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "resultsToken": {
          "type": "string",
          "minLength": 1
        },
        "summary": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "required": [
        "source",
        "summary"
      ],
      "additionalProperties": true
    }

    Proximity: latitude + longitude + radiusMiles together (miles, under 100).

  • getFacilityRows

    read

    Read curated EPA facility rows for a search results token.

    What you must provideresultsToken
    Records returnedregulated-facility
    How to get more resultspage (pageField: pageno, limitField: limit)
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "resultsToken": {
          "type": "string",
          "minLength": 1,
          "maxLength": 512
        },
        "pageno": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 250
        }
      },
      "required": [
        "resultsToken"
      ],
      "additionalProperties": false
    }
    Output schema
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "service": {
          "type": "string"
        },
        "resultsToken": {
          "type": "string",
          "minLength": 1
        },
        "page": {
          "type": "integer",
          "minimum": 1
        },
        "totalRows": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0
        },
        "returned": {
          "type": "integer",
          "minimum": 0
        },
        "facilities": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "truncatedTo": {
          "type": "integer",
          "minimum": 1
        },
        "note": {
          "type": "string"
        }
      },
      "required": [
        "source",
        "service",
        "resultsToken",
        "page",
        "totalRows",
        "returned",
        "facilities"
      ],
      "additionalProperties": true
    }

    Pass the preceding search's resultsToken verbatim; it names its own service.

  • getDetailedFacilityReport

    read

    Get a curated EPA detailed facility report by Registry ID.

    What you must provideregistryId
    Records returnedregulated-facility-report
    How to get more resultsnone
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "registryId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        }
      },
      "required": [
        "registryId"
      ],
      "additionalProperties": false
    }
    Output schema
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "registryId": {
          "type": "string"
        },
        "fullReportUrl": {
          "type": "string"
        },
        "facility": {
          "type": "object",
          "additionalProperties": true
        },
        "dataExtractDates": {
          "type": "object",
          "additionalProperties": true
        },
        "complianceByStatute": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "caveats": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "note": {
          "type": "string"
        }
      },
      "required": [
        "source",
        "registryId",
        "fullReportUrl",
        "facility",
        "dataExtractDates",
        "complianceByStatute",
        "caveats",
        "note"
      ],
      "additionalProperties": true
    }

    Compliance, enforcement, permits, releases; `note` names the excluded sections.

  • getServiceInfo

    read

    Return EPA program coverage, workflow, and freshness notes.

    Records returnedservice-metadata
    How to get more resultsnone
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    }
    Output schema
    {
      "type": "object",
      "properties": {
        "service": {
          "type": "string"
        },
        "baseUrl": {
          "type": "string"
        },
        "auth": {
          "const": "none"
        },
        "coverage": {
          "type": "string"
        },
        "methods": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "notes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "service",
        "baseUrl",
        "auth",
        "coverage",
        "methods",
        "notes"
      ],
      "additionalProperties": true
    }

Where this source is used