# England Environmental Permits - EA Public Registers (`j0401/uk-environmental-permits`) Actor

Eleven Environment Agency public registers for England in one actor: waste carriers and brokers (with Companies House numbers), waste and water permits, exemptions, enforcement actions, industrial installations and radioactive permits. Search by holder, postcode or register; aggregate.

- **URL**: https://apify.com/j0401/uk-environmental-permits.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 england environmental permit 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

## England Environmental Permits - EA Public Registers

Eleven Environment Agency public registers for **England** in one dataset:
**791,533 rows** as of **20 October 2026**, covering waste carriers, waste and
water permits, exemptions, enforcement actions, industrial installations,
scrap metal dealers, end-of-life vehicle sites and radioactive substance
permits.

### Low cost

**From $0.00005 per record, down to $0.00003 at Gold.** Pay only for the
records you receive - the whole corpus stays searchable, you are never billed
for the scan behind it.

### What is in it

| register | rows | what it is |
|---|---:|---|
| `waste-carriers-brokers` | 431,490 | registered waste carriers, brokers and dealers - **includes the Companies House number** |
| `waste-exemptions` | 118,456 | registered waste exemptions (including farm exemptions) |
| `water-discharges` | 115,264 | discharge permits to water and groundwater |
| `water-discharge-exemptions` | 85,386 | discharge exemptions |
| `flood-risk-exemptions` | 12,696 | flood-risk activity exemptions |
| `waste-operations` | 9,591 | waste management permits |
| `enforcement-action` | 8,228 | EA enforcement notices and court cases |
| `industrial-installations` | 5,175 | industrial permits |
| `scrap-metal-dealers` | 2,996 | scrap metal dealer licences |
| `end-of-life-vehicles` | 1,512 | authorised treatment facilities |
| `radioactive-substance` | 739 | radioactive substance permits |

### What you get per row

| field | meaning |
|---|---|
| `register` | which of the eleven registers the row came from |
| `permitId` | permit, registration, licence or action number |
| `holderName`, `holderType` | permit holder and its type (`company`, `partnership`, `charity`, `public body`, `authority`, `organisation`, `sole trader` or `individual (name withheld)`) |
| `companyNumber` | Companies House number - waste carriers, for a direct join to `uk-companies-house` |
| `registrationType`, `registrationTier`, `applicantType` | carrier/broker/dealer classification |
| `siteName`, `siteType`, `activityType`, `status` | what the permit covers |
| `address`, `siteAddress`, `postcode`, `postcodeArea` | operator and site addresses |
| `localAuthority`, `region`, `waterManagementArea` | administrative geography |
| `easting`, `northing`, `gridReference` | site coordinates |
| `issuedDate`, `startDate`, `expiryDate`, `renewalDate`, `variationDate`, `transferDate`, `effectiveDate`, `surrenderedDate`, `revokedDate` | the permit's lifecycle dates |
| `actionDate`, `actionType`, `legislation`, `agencyFunction` | enforcement detail |
| `documentUrl` | the published permit document (industrial installations) |
| `refreshedDate`, `sourceUrl` | snapshot date and register URL |

### Search it

- **Holder name** - `name="Veolia"` (substring, case-insensitive).
- **Company number** - `companyNumber="04751916"` - an exact Companies House join.
- **Permit number** - `permitId="CBDU128084"` (prefix).
- **Postcode** - `postcode="RG8"` (prefix; spaces are ignored).
- **Council** - `localAuthority="Leicester"` (exact).
- **Register** - `register="enforcement-action"`.
- **Holder type** - `holderType="company"`, `"partnership"`, `"sole trader"`.
- **Enforcement type** - `actionType="Enforcement Notice"`, `"Court Case"`.
- **Activity** - `activityType="Broker"` (substring).

### Example inputs

**One company's waste-carrier registrations**

```json
{ "name": "Veolia", "register": "waste-carriers-brokers", "maxResults": 50 }
```

**By Companies House number**

```json
{ "companyNumber": "04751916" }
```

**Enforcement actions against a company**

```json
{ "register": "enforcement-action", "name": "YORK RECYCLING",
  "maxResults": 25 }
```

**What is permitted in one postcode area**

```json
{ "postcode": "LE3", "maxResults": 50 }
```

**Scrap metal licences in one council**

```json
{ "register": "scrap-metal-dealers", "localAuthority": "Leicester" }
```

**Counts by register** - `mode=aggregate`.

```json
{ "mode": "aggregate", "groupBy": "register" }
```

**Counts of holders by type**

```json
{ "mode": "aggregate", "groupBy": "holderType" }
```

**Counts by council** - `groupBy=registrationType`, `postcodeArea` or
`actionType` also available.

```json
{ "mode": "aggregate", "groupBy": "localAuthority",
  "register": "waste-carriers-brokers" }
```

### Example output

```json
{
 "register": "waste-carriers-brokers",
 "permitId": "CBDU128084",
 "holderName": "PAVERPRINT DRIVEWAYS & PATIOS LIMITED",
 "holderType": "company",
 "companyNumber": "04751916",
 "registrationType": "Carrier Dealer",
 "registrationTier": "Upper",
 "applicantType": "Company",
 "address": "HAWTHORN HOUSE, CHECKENDON, READING, RG8 0SU, United Kingdom",
 "postcode": "RG8 0SU",
 "postcodeArea": "RG",
 "issuedDate": "2025-08-06",
 "expiryDate": "2028-09-02",
 "refreshedDate": "2026-10-20",
 "sourceUrl": "https://environment.data.gov.uk/public-register/downloads/waste-carriers-brokers"
}
```

### Owner maintenance

`mode=warm` rebuilds all eleven shards from the EA registers and writes them
to this actor's private key-value store, then refreshes the public summary.
It is a maintenance path for the owner, not a user query: a warm run takes
about three minutes and returns one summary row. The default (empty) run
never triggers it.

```json
{ "mode": "warm" }
```

### Notes on the data, from the source

- **Row limit per run.** `maxResults` is capped at 5,000 records per register;
  narrow the filters rather than requesting a whole register in one run.
- **Individual names are withheld.** The registers include sole traders and
  individual permit holders. Their names are not published by this actor
  (`holderName` is empty and `holderType` says `sole trader` or
  `individual (name withheld)`); the permit number, site address, dates and
  status remain. Companies, partnerships, charities and public bodies keep
  their names. Where one field lists several holders separated by `|`, only
  the organisation components are kept. Where the register declares no holder
  type and the name has no organisation form, the name is withheld.
- **England coverage.** The Environment Agency regulates England. Natural
  Resources Wales, SEPA (Scotland) and NIEA (Northern Ireland) publish
  separate registers and are not included.
- **Waste carriers carry a Companies House number**, which makes a direct,
  identifier-based join to `uk-companies-house` possible without name
  matching.
- **Snapshots, not a change feed.** The EA publishes current registers; the
  owner-warm refreshes them as a snapshot. Expired and revoked permits that
  the register still lists are included with their dates.
- **Licence.** Environment Agency Conditional Licence - commercial reuse is
  permitted with attribution. This is an independent data service, not an
  official Environment Agency service.

Data source: `environment.data.gov.uk/public-register` (Environment Agency).

# Actor input Schema

## `mode` (type: `string`):

search = filter the registers. aggregate = one row per group. warm = owner maintenance: rebuild the snapshot from the eleven EA registers and upload it (no filters). Leave blank to auto-route: filters -> search, no filters -> aggregate.

## `name` (type: `string`):

Permit holder name substring, case-insensitive (e.g. "Veolia"). Individual names are withheld.

## `companyNumber` (type: `string`):

Exact Companies House number (waste carriers), e.g. "04751916".

## `permitId` (type: `string`):

Permit, registration, licence or action number prefix, e.g. "CBDU128084".

## `postcode` (type: `string`):

Postcode or prefix; spaces are ignored (e.g. "LE3").

## `localAuthority` (type: `string`):

Exact council name, case-insensitive (e.g. "Leicester").

## `registrationType` (type: `string`):

Exact type, e.g. "Carrier, Broker, Dealer", "Carrier Dealer", "Site".

## `holderType` (type: `string`):

Type of the permit holder. Individual names are withheld.

## `actionType` (type: `string`):

Exact action type in the enforcement register, e.g. "Enforcement Notice", "Court Case".

## `activityType` (type: `string`):

Substring of the activity, effluent or exemption type.

## `register` (type: `string`):

Restrict to one of the eleven Environment Agency registers. Blank searches all of them.

## `groupBy` (type: `string`):

Blank defaults to register.

## `maxResults` (type: `integer`):

Cap the number of search records pushed (0 = the default 50, maximum 5000). Aggregate returns every group.

## Actor input object example

```json
{
  "maxResults": 50
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

UK environmental permit records - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("j0401/uk-environmental-permits").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("j0401/uk-environmental-permits").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 '{}' |
apify call j0401/uk-environmental-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/uk-environmental-permits"
        }
    }
}
```

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/o7SaTkB07iNHlcShq/builds/b1nUDiSKyjcG0j43z/openapi.json
