# EU Industrial Waste Transfer Records — EEA IED (`nexgensignal/eu-industrial-waste-transfer-records`) Actor

Keyless pay-per-record EEA IED off-site waste transfers — waste class (HW/NONHW), treatment (D/R), tonnes, transboundary flag, country. Receiver identity and address structurally excluded; no person data. Gold $0.0335/record.

- **URL**: https://apify.com/nexgensignal/eu-industrial-waste-transfer-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 waste transfer 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## EU Industrial Waste Transfer Records — EEA IED

**Keyless. Pay per record. Every off-site waste transfer reported by Europe's industrial installations — hazardous or not, disposal or recovery, in tonnes.**

This actor turns the **European Environment Agency (EEA) Industrial Emissions Directive (IED) registry** into clean, per-transfer records — the off-site transfers of waste reported by Europe's industrial installations. Each run reads the EEA's keyless DiscoData SQL service and delivers one row per transfer: the waste classification (hazardous / non-hazardous), the treatment operation (disposal / recovery), the quantity in tonnes (TNE), the measurement method code, and a transboundary flag, with the reporting country and year enriched from the facility report. Transfer grain, structured for engineering use, reusable with acknowledgement of the EEA, with no personal data of any kind.

### What this is, in one paragraph

Under the IED, installations report the waste they send off-site for treatment. This actor reads that off-site-waste-transfer table and flattens each transfer into a single analysis-ready record: the waste classification (`HW` for hazardous waste, `NONHW` for non-hazardous), the treatment operation (`D` for disposal, `R` for recovery), the quantity transferred in tonnes, the measurement method code, whether the transfer was flagged as crossing a border (`transboundary_indicator`), any confidentiality reason, and the reporting country and year — the last two enriched from the installation's facility report. Quantities and codes are carried **verbatim**. It is the waste-flow layer of Europe's industrial register. You are billed only for records actually delivered.

### Who buys this and for what job

- **Circular-economy, waste, and materials teams** sizing hazardous and non-hazardous waste flows off Europe's industrial base.
- **ESG and compliance products** attributing waste transfers by classification, treatment route, and country.
- **Waste-to-energy and recovery operators** mapping the volume and split of disposal versus recovery.
- **Data engineers** who want the IED off-site-waste-transfer table as clean rows from a keyless source.

### EEA licence — reuse with acknowledgement

One licence rider travels on every record. EEA data may be **reused, including commercially, provided the source is acknowledged**: "Source: European Environment Agency (EEA)." Where third-party content is marked, it keeps its own terms. These are reported transfers as filed — not an audit.

### Transfer grain — structural exclusion of the receiver, no person data

The unit of every record is an off-site waste transfer — a movement of waste, keyed to the installation's facility report, never a person. The source table carries a receiver-identity block — the receiver's name and its full street/building/city/postal/country address — and a free-text detail field. **None of those columns is ever selected**: the query reads only the waste classification, the treatment operation, the quantity, the method code, the transboundary flag, the confidentiality reason, and the report identifiers. The receiver name and address block and the free-text field are structurally excluded, so no receiver-identity or narrative content can appear on a record. A person-key guard runs on every record as a backstop. What remains is a waste fact — class, treatment, tonnes — attributed to a reporting country, with no natural-person data of any kind.

### A required partition — this is a large dataset

The off-site-waste-transfer table holds **1,093,947 rows**, so this actor **requires a partition**: every run must set a `wasteClassification` (`HW` or `NONHW`). The classification bounds the run to the primary analytical axis of waste transfers; there is no unbounded all-Europe pull. Optional `wasteTreatment` (`D`/`R`) and `transboundaryOnly` filters narrow further, and `maxRecords` is the hard ceiling.

### Pricing

| Event | Free plan | Bronze | Silver | Gold / Platinum / Diamond |
|-------|-----------|--------|--------|---------------------------|
| `waste_transfer_record` | $0.05 | $0.045 | $0.04 | $0.0335 |

Delivered before charged. Blocked runs and empty results cost nothing.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `wasteClassification` | string | — | **Required.** `HW` (hazardous) or `NONHW` (non-hazardous). |
| `wasteTreatment` | string | — | Optional. `D` = disposal, `R` = recovery. |
| `transboundaryOnly` | boolean | false | Optional. Keep only transfers flagged as crossing a border. |
| `maxRecords` | integer | 500 | Ceiling on records delivered and billed. |

### Output

One JSON object per transfer. Real example (values as published):

```json
{
  "record_id": "4",
  "waste_classification": "HW",
  "waste_treatment": "D",
  "total_waste_quantity_tne": 25.0,
  "method_code": "C",
  "transboundary_indicator": true,
  "confidentiality_reason": null,
  "country_code": "CH",
  "reporting_year": 2018,
  "facility_report_id": "4",
  "control_file_id": "1",
  "source": "EEA Industrial Emissions Directive (IED) — off-site waste transfers",
  "licence": "European Environment Agency (EEA) ... provided the source is acknowledged ...",
  "attribution": "Source: European Environment Agency (EEA), Industrial Emissions Directive (IED) registry.",
  "disclaimer": "Off-site waste transfers ... receiver identity + address block STRUCTURALLY EXCLUDED ...",
  "observed_at": "2026-08-22T00:00:00Z"
}
```

An unbilled `RUN_RECEIPT` records the robots check, the partition and filters, rows seen and delivered, and whether charged equals delivered.

### Field reference

Each record is one off-site waste transfer. Waste: `waste_classification` (`HW`/`NONHW`), `waste_treatment` (`D`/`R`), `total_waste_quantity_tne` (tonnes, verbatim), and `method_code`. Flags: `transboundary_indicator` and `confidentiality_reason`. Scope: `country_code` and `reporting_year` (enriched from the facility report). Keys: `record_id`, `facility_report_id`, and `control_file_id`. Provenance: `source`, `source_url`, `licence`, `attribution`, `disclaimer`, and `observed_at`.

### How a run works

A run first re-reads the source host's robots posture from your runtime — the EEA DiscoData host — and stops at the door if that ever changes. It pages the off-site-waste-transfer table filtered to your required `wasteClassification` (and optional `wasteTreatment` and `transboundaryOnly`), enriches each page's reporting country and year from the facility report, and flattens each transfer to one record — carrying the quantity and codes **verbatim**, never the receiver identity or any narrative field — delivered **before** it is charged, so a blocked or empty run costs you nothing. The actor stops at your `maxRecords` ceiling and records `charge_equals_delivered` in the receipt.

### Coverage and scope

The table holds **1,093,947 transfers** — about 669,000 hazardous and 425,000 non-hazardous — split across disposal and recovery routes and reporting countries. Because each record carries the `waste_classification`, `waste_treatment`, `total_waste_quantity_tne`, `transboundary_indicator`, and enriched `country_code`, building a national or route-level waste-flow series is straightforward. Pull hazardous disposal in one country, or a whole classification to seed a waste-flow warehouse.

### Working with the transfers

The transfers are a materials-flow map, and the fields make them additive. Every record pairs a `waste_classification` and a `waste_treatment` with a `total_waste_quantity_tne` in a shared unit, so a tonnage total by class and route is a single group-by with no scale-guessing, and the `transboundary_indicator` isolates cross-border movements — a signal for the shipment-of-waste market — without exposing any receiver identity. The enriched `country_code` and `reporting_year` frame each transfer in place and time, so two years can be diffed to see how a country's hazardous-waste recovery shifted. The `facility_report_id` keys each transfer back to its facility report for a join to the fleet's other IED cells.

### Units and joins

Quantities are carried in tonnes (TNE) exactly as reported, so figures are additive across transfers, classes, and countries without any conversion on this actor's part. The `facility_report_id` is the join key back to the facility report — and through it to the installation, its emissions, and its combustion parts in the fleet's other IED cells — so a bare tonnage becomes part of a full picture of what a site handles. Because the receiver identity and address block are never selected, the record stays a clean, person-free waste fact attributed to a country, not a directory of who received what where.

### Cost guidance

One `waste_transfer_record` per delivered transfer: cost = transfers delivered × your plan's per-record price. Always set `wasteClassification` and narrow with `wasteTreatment` and `transboundaryOnly`. 1,000 transfers is **$50** (Free) / **$33.50** (Gold). This is a large table, so filter and cap deliberately.

### Honest limitations

- **As filed.** Quantities and codes are as reported; this actor reformats, it does not audit.
- **Partition required.** Every run must set a `wasteClassification`.
- **Receiver excluded by design.** The receiver name and address block are never selected, so this dataset does not tell you *who* received the waste — only its class, route, tonnage, and reporting country.
- **Country is enriched.** `country_code` and `reporting_year` come from the facility report, not the transfer row itself.
- **Acknowledge the EEA.** The acknowledgement travels on every record.
- **No person data** of any kind.

### Differentiation

This is a **net-new** category for the NexGenData fleet. It is distinct from the fleet's **eu-offsite-pollutant-transfer-records**, which reads the *pollutant* transfer table (specific pollutants transferred off-site in waste water, in kilograms) — this cell reads the **off-site *waste* transfer table** at waste-class / treatment / tonnage grain, a different table measuring waste streams rather than pollutants. It is also distinct from **eu-industrial-air-release-records** (releases to air) and **eu-industrial-emissions-records** (facility emissions summary). Its specific job is the **IED off-site waste transfers** — hazardous vs non-hazardous, disposal vs recovery, in tonnes.

### The NexGen Signal family

Part of the NexGen Signal family of pay-per-record data products:

- [EU Offsite Pollutant Transfer Records — EEA IED](https://apify.com/nexgensignal/eu-offsite-pollutant-transfer-records)
- [EU Industrial Air Release Records — EEA IED](https://apify.com/nexgensignal/eu-industrial-air-release-records)
- [EU Industrial Emissions Records — EEA IED Facilities](https://apify.com/nexgensignal/eu-industrial-emissions-records)
- [EU Industrial Facility Report Records — EEA IED](https://apify.com/nexgensignal/eu-industrial-facility-report-records)
- [EU Waste Generation Records — Eurostat](https://apify.com/nexgensignal/eurostat-waste-generation)

*Source: European Environment Agency (EEA), Industrial Emissions Directive (IED) registry (discodata.eea.europa.eu). EEA data may be reused, including commercially, provided the source is acknowledged: "Source: European Environment Agency (EEA)"; marked third-party content keeps its own terms. Transfer grain; the receiver name and full address block and the free-text detail field are structurally excluded (never selected), no natural-person data of any kind. Quantities and codes as filed; country and year enriched from the facility report; not audited.*

# Actor input Schema

## `wasteClassification` (type: `string`):

REQUIRED partition — the full table is 1,093,947 rows and cannot be pulled unbounded. Use HW (hazardous waste) or NONHW (non-hazardous waste).

## `wasteTreatment` (type: `string`):

Optional. D = disposal, R = recovery.

## `transboundaryOnly` (type: `boolean`):

Optional. Keep only transfers flagged as crossing a border.

## `maxRecords` (type: `integer`):

Maximum records delivered and billed.

## Actor input object example

```json
{
  "wasteClassification": "HW",
  "wasteTreatment": "",
  "transboundaryOnly": false,
  "maxRecords": 500
}
```

# Actor output Schema

## `results` (type: `string`):

Delivered records.

# 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 = {
    "wasteClassification": "HW",
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/eu-industrial-waste-transfer-records").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 = {
    "wasteClassification": "HW",
    "maxRecords": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/eu-industrial-waste-transfer-records").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 '{
  "wasteClassification": "HW",
  "maxRecords": 500
}' |
apify call nexgensignal/eu-industrial-waste-transfer-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/eu-industrial-waste-transfer-records"
        }
    }
}

```

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/axJSBHvjMhUTnskUG/builds/jh37LVUbfkMFMBmkf/openapi.json
