Find an API

Search public APIs with auth details & Postman guides

← All APIs

U.S. EPA Enforcement and Compliance History Online (ECHO) - Effluent Charting and Reporting

epa · Government

Government No Auth Free & Open open_data

Enforcement and Compliance History Online (ECHO) is a tool developed and maintained by EPA's Office of Enforcement and Compliance Assurance for public use. ECHO provides integrated compliance and enforcement information for over 1 million regulated facilities nationwide. EFF Rest Services provides the data for ECHO's Effluent Charts, a set of dynamic charts and tables of permitted effluent limits, releases, and violations over time for Clean Water Act (CWA) wastewater discharge permits issu

Authentication

No authentication requiredFree to use with no key needed.

Sample Requests

GET Effluent Charts Download Service

Downloads tabular Discharge Monitoring Report (DMR) and compliance data for one NPDES permit as a CSV.

https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart?p_id=example&outfall=example&end_date=2024-12-31&start_date=2024-01-01&parameter_code=example

Hover any highlighted part to learn what it does

curl -X GET "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart?p_id=example&outfall=example&end_date=2024-12-31&start_date=2024-01-01&parameter_code=example"
import requests
params = {
    "p_id": "example",
    "outfall": "example",
    "end_date": "2024-12-31",
    "start_date": "2024-01-01",
    "parameter_code": "example"
}
response = requests.get(
    "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart",
    params=params,
)
print(response.json())
const url = new URL('https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart');
url.searchParams.set('p_id', 'example');
url.searchParams.set('outfall', 'example');
url.searchParams.set('end_date', '2024-12-31');
url.searchParams.set('start_date', '2024-01-01');
url.searchParams.set('parameter_code', 'example');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart")
	q := baseURL.Query()
	q.Set("p_id", "example")
	q.Set("outfall", "example")
	q.Set("end_date", "2024-12-31")
	q.Set("start_date", "2024-01-01")
	q.Set("parameter_code", "example")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart")
uri.query = URI.encode_www_form({
  "p_id" => "example",
  "outfall" => "example",
  "end_date" => "2024-12-31",
  "start_date" => "2024-01-01",
  "parameter_code" => "example"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.download_effluent_chart?" . http_build_query([
    "p_id" => "example",
    "outfall" => "example",
    "end_date" => "2024-12-31",
    "start_date" => "2024-01-01",
    "parameter_code" => "example"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Detailed Effluent Chart Service

Discharge Monitoring Report (DMR) data supporting each effluent chart for one NPDES permit. Includes Discharge Monitoring Reports and NPDES Violations.

https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart?p_id=example&output=JSONP&outfall=example&callback=example&end_date=2024-12-31&start_date=2024-01-01&parameter_code=example

Hover any highlighted part to learn what it does

curl -X GET "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart?p_id=example&output=JSONP&outfall=example&callback=example&end_date=2024-12-31&start_date=2024-01-01&parameter_code=example"
import requests
params = {
    "p_id": "example",
    "output": "JSONP",
    "outfall": "example",
    "callback": "example",
    "end_date": "2024-12-31",
    "start_date": "2024-01-01",
    "parameter_code": "example"
}
response = requests.get(
    "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart",
    params=params,
)
print(response.json())
const url = new URL('https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart');
url.searchParams.set('p_id', 'example');
url.searchParams.set('output', 'JSONP');
url.searchParams.set('outfall', 'example');
url.searchParams.set('callback', 'example');
url.searchParams.set('end_date', '2024-12-31');
url.searchParams.set('start_date', '2024-01-01');
url.searchParams.set('parameter_code', 'example');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart")
	q := baseURL.Query()
	q.Set("p_id", "example")
	q.Set("output", "JSONP")
	q.Set("outfall", "example")
	q.Set("callback", "example")
	q.Set("end_date", "2024-12-31")
	q.Set("start_date", "2024-01-01")
	q.Set("parameter_code", "example")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart")
uri.query = URI.encode_www_form({
  "p_id" => "example",
  "output" => "JSONP",
  "outfall" => "example",
  "callback" => "example",
  "end_date" => "2024-12-31",
  "start_date" => "2024-01-01",
  "parameter_code" => "example"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_effluent_chart?" . http_build_query([
    "p_id" => "example",
    "output" => "JSONP",
    "outfall" => "example",
    "callback" => "example",
    "end_date" => "2024-12-31",
    "start_date" => "2024-01-01",
    "parameter_code" => "example"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Summary Effluent Chart Service

Summary of compliance status each outfall and parameter for one NPDES permit. Provides the current compliance status and overall compliance status for the date range of interest. This service supports the Summary Matrix on the Effluent Charts.

https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart?p_id=example&output=JSONP&callback=example&end_date=2024-12-31&start_date=2024-01-01

Hover any highlighted part to learn what it does

curl -X GET "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart?p_id=example&output=JSONP&callback=example&end_date=2024-12-31&start_date=2024-01-01"
import requests
params = {
    "p_id": "example",
    "output": "JSONP",
    "callback": "example",
    "end_date": "2024-12-31",
    "start_date": "2024-01-01"
}
response = requests.get(
    "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart",
    params=params,
)
print(response.json())
const url = new URL('https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart');
url.searchParams.set('p_id', 'example');
url.searchParams.set('output', 'JSONP');
url.searchParams.set('callback', 'example');
url.searchParams.set('end_date', '2024-12-31');
url.searchParams.set('start_date', '2024-01-01');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart")
	q := baseURL.Query()
	q.Set("p_id", "example")
	q.Set("output", "JSONP")
	q.Set("callback", "example")
	q.Set("end_date", "2024-12-31")
	q.Set("start_date", "2024-01-01")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart")
uri.query = URI.encode_www_form({
  "p_id" => "example",
  "output" => "JSONP",
  "callback" => "example",
  "end_date" => "2024-12-31",
  "start_date" => "2024-01-01"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.apis.guru/v2/specs/epa.gov/eff/2019.10.15/eff_rest_services.get_summary_chart?" . http_build_query([
    "p_id" => "example",
    "output" => "JSONP",
    "callback" => "example",
    "end_date" => "2024-12-31",
    "start_date" => "2024-01-01"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));

Postman Setup Guide

Get Postman ↗
  1. See official documentation for authentication and setup.

What can you build with U.S. EPA Enforcement and Compliance History Online (ECHO) - Effluent Charting and Reporting?

U.S. EPA Enforcement and Compliance History Online (ECHO) - Effluent Charting and Reporting is a Government API. Developers commonly use government APIs for:

  • surfacing public datasets in citizen-facing apps
  • building transparency and civic engagement tools
  • accessing legislation, court records, and official data
  • powering research and journalism tools
  • creating compliance and regulatory monitoring dashboards

No authentication required. This API is open — no signup or key needed. Ideal for quick prototypes and public-facing features. U.S. EPA Enforcement and Compliance History Online (ECHO) - Effluent Charting and Reporting is free to use, making it a low-risk choice to experiment with.

New to APIs? Read our beginner's guide · Learn about API keys · What is REST?

Open documentation ↗