# EU Pesticide Water Monitoring Records — EEA WISE (`nexgensignal/eu-pesticide-water-monitoring-records`) Actor

Keyless pay-per-record EEA WISE pesticide water monitoring — site/waterbody/substance/period, values + exceedances verbatim. Partition by country; no persons. EEA acknowledge. GOLD $0.05 ladder.

- **URL**: https://apify.com/nexgensignal/eu-pesticide-water-monitoring-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 pesticide monitoring 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 Pesticide Water Monitoring Records — EEA WISE

**Keyless. Pay per record. Europe's pesticide monitoring in water — site by site, substance by substance, year by year.**

This actor turns the **European Environment Agency (EEA) WISE** pesticide water-monitoring data into clean, per-observation records — the monitored concentrations of pesticides and related substances in Europe's surface and ground waters. Each run reads the EEA's keyless DiscoData SQL service for the country you choose and delivers one row per monitoring site / waterbody / substance / period: the site and waterbody, the river-basin district, the substance, the analysed matrix, the mean and maximum measured values with units and sample counts, the limit-of-quantification, and the exceedance flags. Site / waterbody / substance / period observation grain, structured for engineering use, reusable with acknowledgement of the EEA, with no personal data of any kind.

### What this is, in one paragraph

Member states monitor pesticides and related substances in their waters and report the results to the EEA. This actor reads that dataset and flattens each observation into a single analysis-ready record: the country, the monitoring site (id and name) and its waterbody and river-basin district, the substance (observed property code), the analysed matrix, the reference year, the number of samples and how many fell below the limit of quantification, the mean and maximum measured values with their unit, the LOQ, the exceedance flags against the environmental quality standards, and the site's status and coordinates. Values and exceedance flags are carried **verbatim**. It is the pesticide-monitoring layer of Europe's water data. You are billed only for records actually delivered.

### Who buys this and for what job

- **Water-quality, agri-environment, and consultancy teams** tracking pesticide concentrations by site, substance, and year.
- **ESG, food-system, and catchment-analytics products** mapping pesticide pressure across Europe's waters.
- **Researchers and NGOs** studying pesticide occurrence and exceedances over time.
- **Data engineers** who want the WISE pesticide-monitoring series as clean rows without writing SQL against a nine-million-row table.

### 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 monitoring observations as reported — not a drinking-water safety determination.

### Observation grain — no person data

The unit of every record is a monitoring observation — a site, a substance, a period — never a person. There is **no operator, contact, or responsible-person field** in the source, and none is emitted; the coordinates are the monitoring site's own fixed location. A person-key guard runs on every record as a backstop, and the acceptance suite injects an operator and contact field into a source row and asserts neither the key nor the value can ever appear in output.

### A required partition — this is a multi-million-row dataset

The pesticide-monitoring dataset holds **over 9.2 million rows**, so this actor **requires a partition**: every run must set a `countryCode`. The country bounds the run; there is no unbounded all-Europe pull. Optional `year` and `substanceContains` filters narrow further, and `maxRecords` is the hard ceiling.

### Pricing

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

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

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `countryCode` | string | — | **Required** 2-letter country code (e.g. DE, FR, IT). |
| `year` | integer | — | Optional monitoring reference year to filter. |
| `substanceContains` | string | — | Optional. Keep only observations whose substance (observed property code) contains this text. |
| `maxRecords` | integer | 500 | Ceiling on records delivered and billed. |

### Output

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

```json
{
  "record_id": "FR00501X0038-HY:CAS_1007-28-9:2019",
  "country_code": "FR",
  "monitoring_site_identifier": "FR00501X0038-HY",
  "monitoring_site_name": "FORAGE DE SCEVOLLES",
  "water_body_identifier": "FRGG073",
  "water_body_name": "CALCAIRES CAPTIFS DU JURASSIQUE",
  "water_body_category": "GW",
  "rbd_name": "LA LOIRE",
  "observed_property_code": "CAS_1007-28-9",
  "analysed_matrix": "water",
  "result_uom": "ug/L",
  "reference_year": 2019,
  "number_of_samples": 12,
  "result_mean_value": 0.02,
  "result_maximum_value": 0.05,
  "exceedance": "No",
  "latitude": 46.9,
  "longitude": 0.1,
  "source": "EEA WISE water-monitoring (pesticides)",
  "licence": "European Environment Agency (EEA) ... provided the source is acknowledged ...",
  "disclaimer": "Monitored-substance water-monitoring observation records ... no natural-person data ...",
  "observed_at": "2026-08-22T00:00:00Z"
}
```

An unbilled `RUN_RECEIPT` records the robots check, the country/year/substance filters, rows seen and delivered, and whether charged equals delivered.

### Field reference

Each record is one observation. Scope: `country_code`, `country_name`, `monitoring_site_identifier`, `monitoring_site_name`, `water_body_identifier`, `water_body_name`, `water_body_category`, `rbd_identifier`, and `rbd_name`. Substance and period: `eea_indicator`, `observed_property_code`, `analysed_matrix`, and `reference_year`. Measurement: `result_uom`, `procedure_loq_value`, `number_of_samples`, `samples_below_loq`, `result_mean_value`, and `result_maximum_value`. Exceedance: `exceedance_mac_eqs`, `exceedance_aa_eqs`, `exceedance_quality_standard`, and `exceedance`. Site: `monitoring_site_status_code`, `confidentiality_status`, `latitude`, and `longitude`. 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 pesticide-monitoring table filtered to your `countryCode` (and optional `year` and `substanceContains`), and flattens each observation to one record — carrying the values and exceedance flags **verbatim**, never anything person-shaped — 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 dataset spans the reporting countries and the full monitoring series, with **9.2 million+ observation rows** in total. Because each record carries the `country_code`, `observed_property_code`, `reference_year`, and the exceedance flags, building a substance time series or mapping exceedances by catchment is straightforward. Pull one country, or one substance within a country, to seed a monitoring warehouse.

### Working with the observations

The observations are a time series waiting to be assembled, and the identifiers make it mechanical. Every record carries the `monitoring_site_identifier`, `observed_property_code`, and `reference_year`, so a single filtered pull sorted by year reconstructs a substance's concentration trajectory at a site, and the `result_uom` travels on every row so a downstream consumer never guesses a scale. The `number_of_samples` and `samples_below_loq` let an analyst weight the mean by detection frequency, and the exceedance flags surface where a substance breached a quality standard. Because the coordinates place each site, the observations join to catchment and land-use layers, and two annual pulls can be diffed to track where pesticide pressure rose or fell.

### Cost guidance

One `pesticide_monitoring_record` per delivered observation: cost = rows delivered × your plan's per-record price. Always scope with `countryCode` and narrow with `year` and `substanceContains`. 1,000 observations is **$50** (Free) / **$33.50** (Gold). These are very large per-country slices, so filter and cap deliberately.

### Honest limitations

- **Monitoring data, not a verdict.** These are reported observations, not a drinking-water safety determination.
- **Partition required.** Every run must set a `countryCode`.
- **As published.** Values and exceedance flags are carried verbatim; this actor reformats, it does not recompute.
- **No person data** of any kind.

### Differentiation

This is a **net-new** category for the NexGenData fleet. It is distinct from the fleet's other EEA water cells (bathing water, nitrate, water-body chemistry — different determinands and grains) and from the US EPA pesticide-product actors (registration of products, not water monitoring). Its specific job is the **WISE pesticide / monitored-substance water-monitoring series** — site by site, substance by substance. It is the water-monitoring member of a five-cell EEA industrial/water family.

### The NexGen Signal family

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

- [EU Nitrate Monitoring Records — EEA WISE Nitrates](https://apify.com/nexgensignal/eu-nitrate-monitoring-records)
- [EU Bathing Water Quality Records — EEA BWD](https://apify.com/nexgensignal/eu-bathing-water-quality-records)
- [EU Waterbody Quality Records — EEA WISE Waterbase](https://apify.com/nexgensignal/eu-waterbody-quality-records)
- [EU Offsite Pollutant Transfer Records — EEA E-PRTR](https://apify.com/nexgensignal/eu-offsite-pollutant-transfer-records)
- [EU Industrial Emissions Records — EEA IED Facilities](https://apify.com/nexgensignal/eu-industrial-emissions-records)

*Source: European Environment Agency (EEA), WISE water-monitoring (pesticides) dataset (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. Site / waterbody / substance / period observation grain; no operator, contact, or responsible-person field, coordinates are the site's own location; no natural-person data of any kind. Monitoring observations as reported, not a safety determination.*

# Actor input Schema

## `countryCode` (type: `string`):

REQUIRED 2-letter country code (e.g. DE, FR, IT) — the full monitoring table is a MONSTER (9.2M+ rows) and cannot be pulled unbounded.

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

Optional monitoring reference year to filter.

## `substanceContains` (type: `string`):

Optional. Keep only observations whose substance (observed property code) contains this text.

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

Maximum records delivered and billed.

## Actor input object example

```json
{
  "countryCode": "DE",
  "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 = {
    "countryCode": "DE",
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/eu-pesticide-water-monitoring-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 = {
    "countryCode": "DE",
    "maxRecords": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/eu-pesticide-water-monitoring-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 '{
  "countryCode": "DE",
  "maxRecords": 500
}' |
apify call nexgensignal/eu-pesticide-water-monitoring-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/eu-pesticide-water-monitoring-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/G5mGd8pwJIOvmHZJH/builds/6GzolwCAYK9p4nZ47/openapi.json
