# Storm Overflow Data & Sewage Discharge Data UK (`tabulary/uk-storm-overflow-annual-data`) Actor

Spill count and total spill duration for every UK storm overflow outfall, by water company and year, from the Environment Agency's official EDM Storm Overflow Annual Return.

- **URL**: https://apify.com/tabulary/uk-storm-overflow-annual-data.md
- **Developed by:** [Tabulary](https://apify.com/tabulary) (community)
- **Categories:** News, Business, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 storm overflow records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Storm Overflow Data & Sewage Discharge Data UK do?

This Actor returns clean **storm overflow data** and **sewage discharge data** for England and
Wales: the spill count and total spill duration for every storm overflow outfall, broken down by
water company and calendar year. It comes straight from the Environment Agency's official EDM
(Event Duration Monitoring) [Storm Overflow Annual Return](https://environment.data.gov.uk/dataset/21e15f12-0df8-4bfc-b763-45226c16a8ac) —
the regulatory filing each water and sewerage company submits once a year. ESG analysts,
journalists and river-health researchers use it to track **water company spill data** without
chasing ten separate company websites.

This is annual, not live, data: the EA publishes one return per year, typically around March for
the previous calendar year. It is not a real-time monitoring feed.

### What you get

- One record per storm overflow outfall per year: outfall ID, site name, grid reference, receiving
  water and catchment, spill count, total spill duration, and the long-term average spill count
  the company reports against.
- EDM operational percentage (how much of the year the monitor was actually working) and the
  stated reason when it's below 90%.
- Any investigation or improvement activity, and the high-spill-frequency review reasons, the
  company recorded for that outfall in that year.
- An optional filter by water company, and use from AI agents through the Apify MCP server.

### How much does it cost?

You pay per record saved, with no monthly fee: **$2.00 per 1,000 records** on Apify's free plan,
and 10–40% less on paid Apify plans. Each run also costs $0.001 to start. Apify's free plan
includes $5 of credit every month, enough for about 2,500 records. Prices as of October 2026; the
price shown on this page is the one that applies.

| Use | Records | Cost on the free plan |
|---|---|---|
| One water company, one year (e.g. Dŵr Cymru Welsh Water, 2025) | ~122 | about $0.24 |
| A full year, all companies (e.g. 2024) | ~14,300 | about $28.60 |
| Default run (first 500 records of 2025, the latest return) | 500 | about $1.00 |

Set **Maximum cost per run** to cap any run; the Actor stops cleanly at the cap and keeps
everything it saved.

### Ready-made inputs

```json
{ "year": 2025, "maxItems": 500 }
```

```json
{ "year": 2025, "company": "Dwr Cymru Welsh Water", "maxItems": 200 }
```

```json
{ "year": 2025, "company": "Thames Water" }
```

All three were run against the live source while building this tool and returned results.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `year` | integer | required (prefill `2025`, the latest return) | The annual return year. 2024 is the earliest year this Actor supports. |
| `company` | string | `""` (all) | One of the 10 water and sewerage companies in England and Wales, or empty for all. |
| `maxItems` | integer | `500` | Stop after this many records. Each record is one billable dataset item. |

### Output

One dataset item per storm overflow outfall. A real item from the 2024 return:

```json
{
  "record_id": "AWS00001",
  "water_company": "Anglian Water",
  "site_name": "21 HIGH STREET CSO",
  "site_name_operational": "BURTON LATIMER XX KING RD SSO",
  "permit_reference": "AWNNF13860",
  "supplementary_permit_reference": "AWNNF4102",
  "permit_activity_reference": "A1",
  "asset_type": "SO on sewer network",
  "outlet_grid_reference": "SP9037074740",
  "waterbody_id": "GB105032045140",
  "waterbody_catchment": "Ise - Lower",
  "receiving_water": "UN-NAMED TRIB RIVER ISE",
  "shellfish_water": "Not Applicable",
  "bathing_water": "Not Applicable",
  "treatment_method": "Not Applicable",
  "total_spill_duration_hours": 4.5,
  "spill_count": 9,
  "long_term_average_spill_count": 6.75,
  "monitoring_start_year": 2022,
  "edm_operational_percent": 57.15,
  "low_reporting_reason": "Comms failure / issue",
  "low_reporting_action": "Resolved - Jun",
  "high_spill_frequency_reason_year": "High spill threshold not met",
  "high_spill_frequency_reason_long_term": "High spill threshold not met",
  "investigation_activity": "No investigation activity in reporting period",
  "improvement_activity": "No improvement action in reporting period",
  "report_year": 2024
}
```

Notes on the fields:

- `total_spill_duration_hours` is the year's total spill duration in decimal hours (so 515 means
  515 hours, not 5h15m); it can exceed 8,760 only if the EA's own return does.
- `spill_count` and `long_term_average_spill_count` are not always whole numbers — the EA's
  "12-24h" counting method can combine or split events, so fractional counts (e.g. `6.75`) are
  as reported, not a rounding error.
- `site_name_operational`, `supplementary_permit_reference`, `shellfish_water`, `bathing_water`
  and the reason/action fields are `null` or `"Not Applicable"` when the company didn't report a
  value; the EA's own return makes that distinction, and this Actor keeps it.
- `outlet_grid_reference` is a British National Grid reference (not latitude/longitude).
- No personal data: every record is keyed to an outfall and a company, never a person.

### Use it from AI agents

Add the Actor to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server
(`https://mcp.apify.com?tools=tabulary/uk-storm-overflow-annual-data`). Ask in plain language, for
example: "How many times did Thames Water's storm overflows spill in 2025?" The agent fills in the
input and gets structured records back.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tabulary~uk-storm-overflow-annual-data/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"year": 2025, "company": "Thames Water"}'
```

The same works with the Apify Python and JavaScript clients. See the API tab for details.

### Data source and limits

- Source: the Environment Agency's [EDM Storm Overflow Annual Return](https://environment.data.gov.uk/dataset/21e15f12-0df8-4bfc-b763-45226c16a8ac)
  dataset, under the [Open Government Licence](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
  Each year is a ZIP of Excel workbooks that the EA publishes once a year, usually around March.
- This Actor supports **2024 and later** years. 2021–2023 used a different column layout without
  a stable outfall ID, and 2020 and earlier published a separate file per company; a future update
  may add those.
- Covers all 10 water and sewerage companies in England and Wales, including Dŵr Cymru Welsh
  Water, which is published in the same file as the English companies.
- This Actor respects a polite ~1 request/second and retries on server errors; because the source
  is a single annual file, not a paginated API, each run makes one download.
- Not affiliated with or endorsed by the Environment Agency, Defra or any water company.

### Other Tabulary tools

Clean data from official and public sources, priced per result:

- [UK Gender Pay Gap Reports API: Employer Filings](https://apify.com/tabulary/uk-gender-pay-gap-reports)
- [UK Modern Slavery Statement Registry API](https://apify.com/tabulary/uk-modern-slavery-statements)
- [UK Payment Practices Report API: Supplier Pay Data](https://apify.com/tabulary/uk-payment-practices-reports)
- [UK Tenders API: Contracts Finder & Find a Tender](https://apify.com/tabulary/uk-public-tenders)
- [UK House Price Index API: Average Prices by Area](https://apify.com/tabulary/uk-house-price-index-stats)

### FAQ

**Is this data official?** Yes — it's the Environment Agency's own regulatory annual return, not
a scrape of a company website or a third-party summary.

**How fresh is it?** As fresh as the EA's own publishing schedule: one return per year, usually
released around March for the previous calendar year. This is not a live monitoring feed.

**Why does a water company's name differ from what I expected?** The `company` filter uses the
EA's own company names (e.g. "Dwr Cymru Welsh Water", not "Welsh Water"); see the Input table for
the exact list.

**Something broke?** Open an issue on the Issues tab. The Actor is tested daily.

### Changelog

- **2026-11-02:** reads the workbook as a stream, so the larger 2025 return runs within normal memory;
  defaults to the 2025 return.
- **2026-10-31:** first version: EDM Storm Overflow Annual Return data for 2024 and 2025, by
  water company and year, with an optional company filter.

### About Tabulary

This tool is part of [Tabulary](https://apify.com/tabulary): clean tables from official public
sources. Every Tabulary tool uses the source's official API or open data where one exists,
collects no personal data, and is tested on Apify every day. Questions or ideas? Open an issue on
the Issues tab.

# Actor input Schema

## `year` (type: `integer`):

The calendar year of the Environment Agency's EDM Storm Overflow Annual Return to fetch. The EA publishes one return per year, usually around March of the following year. 2024 is the earliest year this Actor supports (earlier years used a different file layout).

## `company` (type: `string`):

Limit results to one water and sewerage company. Leave empty for all 10 companies in England and Wales.

## `maxItems` (type: `integer`):

Stop after this many storm overflow records. Each record is one billable dataset item. There are roughly 14,000-17,000 outfalls across all companies per year.

## Actor input object example

```json
{
  "year": 2025,
  "company": "",
  "maxItems": 500
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "year": 2025
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/uk-storm-overflow-annual-data").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "year": 2025 }

# Run the Actor and wait for it to finish
run = client.actor("tabulary/uk-storm-overflow-annual-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "year": 2025
}' |
apify call tabulary/uk-storm-overflow-annual-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tabulary/uk-storm-overflow-annual-data"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Nwu7YlCUlTbAkUnUD/builds/tLpjVB7OHowNl7eHu/openapi.json
