# NL Terugleververgoeding Monitor (na einde salderen) (`codeclouds/nl-terugleververgoeding-monitor`) Actor

Monitort de terugleververgoedingen en terugleverkosten van de 10 grootste Nederlandse energieleveranciers, vóór en na het einde van de salderingsregeling op 1 januari 2027. Met wijzigingsdetectie en wetgevingsstatus.

- **URL**: https://apify.com/codeclouds/nl-terugleververgoeding-monitor.md
- **Developed by:** [Dennis](https://apify.com/codeclouds) (community)
- **Categories:** Other, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 leverancier-records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## NL Terugleververgoeding Monitor (na einde salderen)

De salderingsregeling stopt per **1 januari 2027**. Vanaf dat moment krijg je voor teruggeleverde zonnestroom alleen nog de terugleververgoeding van je energieleverancier, minus de terugleverkosten — en die bedragen verschillen enorm per leverancier en veranderen regelmatig. Deze actor verzamelt de publieke teruglevervoorwaarden van de **10 grootste Nederlandse energieleveranciers** rechtstreeks bij de bron, maakt ze machine-leesbaar en detecteert automatisch **wijzigingen** tussen runs.

### Wat deze Actor doet

Per run controleert de actor de officiële tarief- en klantenservicepagina's van Vattenfall, Essent, Eneco, Budget Energie, Energiedirect, Greenchoice, ENGIE, Oxxio, Vandebron en ANWB Energie, plus de wetgevingspagina van de Rijksoverheid. Voor elke leverancier levert hij één gestructureerd record:

```json
{
  "leverancier": "ANWB Energie",
  "merkGroep": "ANWB",
  "acmVergunningshouder": "ANWB Energie B.V.",
  "bronUrl": "https://www.anwb.nl/energie/zonnepanelen/salderen",
  "gecontroleerdOp": "2026-08-21T16:35:41.296Z",
  "extractieStatus": "gedeeltelijk",
  "definitiefVoor2027": false,
  "terugleververgoedingCtPerKwh": null,
  "terugleverkostenCtPerKwh": null,
  "nettoVergoedingCtPerKwh": null,
  "terugleverkostenModel": "geen",
  "dynamischContractModel": "marktprijs_uur",
  "geenTerugleverkosten": true,
  "wettelijkMinimumVermeld": false,
  "uitspraken": [
    "ANWB Energie heeft géén extra terugleverkosten.",
    "Per 1 januari 2027 stopt de overheid met de salderingsregeling, ..."
  ],
  "wijzigingType": "nieuw",
  "vorigeWaarden": null,
  "foutmelding": null
}
```

En met concrete tarieven op de bronpagina (bijvoorbeeld een vaste vergoeding van `€ 0,15` per kWh):

```json
{
  "leverancier": "Essent",
  "terugleververgoedingCtPerKwh": 15,
  "terugleverkostenCtPerKwh": null,
  "nettoVergoedingCtPerKwh": null,
  "definitiefVoor2027": false,
  "extractieStatus": "volledig"
}
```

#### De belangrijkste velden

| Veld | Betekenis |
|---|---|
| `terugleververgoedingCtPerKwh` | Gevonden vergoeding voor teruggeleverde stroom, in eurocent per kWh (voorkeur: expliciete 2027-waarde). |
| `terugleverkostenCtPerKwh` | Gevonden kosten per teruggeleverde kWh. |
| `nettoVergoedingCtPerKwh` | Vergoeding min kosten, wanneer beide bekend zijn. |
| `vergoedingsModel` | `vast_bedrag` (concreet bedrag gevonden), `percentage_leveringstarief` (vergoeding = minimaal 50% van het leveringstarief, bijv. Vattenfall/Eneco/Oxxio) of `onbekend` (persoonlijk tarief, bijv. Greenchoice). |
| `definitiefVoor2027` | `true` = de pagina geeft expliciete regels of bedragen voor 2027; `false` = 2027 besproken zonder concrete regels; `null` = 2027 niet genoemd. |
| `terugleverkostenModel` | `per_kwh`, `staffel_jaarbedrag`, `geen` of `onbekend`. |
| `dynamischContractModel` | `marktprijs_uur` als het dynamische contract tegen het uurtarief vergoedt, anders `onbekend`. |
| `wettelijkMinimumVermeld` | Of de pagina de wettelijke ondergrens noemt (minimaal 50% van het kale leveringstarief tot 2030). |
| `wijzigingType` | `nieuw`, `tariefwijziging`, `bron_gewijzigd` of `ongewijzigd` t.o.v. de vorige run. |
| `wijzigingSamenvatting` | Mensleesbare toelichting op wat er precies veranderde (bijv. `vergoeding 5 ct/kWh → 15 ct/kWh`); `null` zonder inhoudelijk verschil. |
| `uitspraken` | Letterlijke zinnen van de bronpagina, zodat je elke waarde kunt verifiëren. |

### Waarom dit belangrijk is

- **Het wettelijk kader is vastgesteld**: tot en met 31 december 2026 mag gesaldeerd worden; vanaf 1 januari 2027 geldt een vergoeding van **minimaal 50% van het kale leveringstarief** (tot 2030), en mogen terugleverkosten alleen de werkelijke verwerkingskosten dekken. De ACM houdt hierop toezicht.
- **Leveranciers publiceren hun 2027-tarieven in fasen** en passen ze tussentijds aan. Bestaande overzichten op vergelijkersssites worden handmatig bijgehouden en zijn vaak weken oud. Deze actor haalt de informatie rechtstreeks bij de leverancier, met bronlink en controledatum.
- **Wijzigingsdetectie ingebouwd**: met een named key-value store vergelijkt de actor elke run met de vorige. Bij een nieuw tarief of gewijzigde voorwaarden krijgt het record `wijzigingType: "tariefwijziging"` (of `"nieuw"` bij de eerste run) — precies de momenten waarop je actie wilt ondernemen.

### Use-cases

1. **Consumentenplatforms en vergelijkers** — bouw een actueel terugleververgoeding-overzicht of API zonder zelf 10 websites te scrapen.
2. **AI-agents en RAG-pipelines** — stel vragen als *"Welke leverancier geeft in 2027 de hoogste netto terugleververgoeding?"* of *"Bij welke leveranciers zijn de 2027-regels al definitief?"* dankzij platte, uniforme JSON.
3. **Zonnepaneelbezitters en adviseurs** — plan je overstap of thuisbatterij-aanschaf op basis van de netto vergoeding per leverancier en ontvang signalen wanneer tarieven wijzigen.
4. **Energiebranche en journalisten** — volg de marktontwikkeling rond het einde van de salderingsregeling, inclusief wie nog niets bekendgemaakt heeft (`definitiefVoor2027: false`).
5. **Monitoren op automatische piloot** — schedule de actor wekelijks met `alleenWijzigingen: true` en krijg uitsluitend nieuwe of gewijzigde records terug.

### Aan de slag

Standaard controleert één run alle 10 leveranciers plus de Rijksoverheid-pagina (± 11 pagina's, ± 30 seconden). Wil je alleen een subset?

```json
{
  "leveranciers": ["eneco", "greenchoice", "tibber"],
  "alleenWijzigingen": true
}
```

> Let op: `tibber` is geen geldige waarde — de actor monitort de top-10 zoals hierboven genoemd. Dynamische leveranciers (Tibber, Frank Energie, Zonneplan, NextEnergy) vergoeden tegen de dagmarktprijs en zijn bewust niet in v1 opgenomen.

#### Input-opties

| Veld | Type | Default | Toelichting |
|---|---|---|---|
| `leveranciers` | array | alle 10 | Welke leveranciers gecontroleerd worden. |
| `volgWetgeving` | boolean | `true` | Extra record met de wetgevingsstatus van de Rijksoverheid. |
| `wijzigingsdetectie` | boolean | `true` | Vergelijk met de vorige run via een named KV-store. |
| `alleenWijzigingen` | boolean | `false` | Push alleen nieuwe/gewijzigde records (ideaal voor schedules). |
| `includeUitspraken` | boolean | `true` | Neem letterlijke bronzinnen op in elk record. |

### Betrouwbaarheid en eerlijkheid

De actor rapporteert expliciet wat hij wél en niet gevonden heeft:

- `extractieStatus: "volledig"` = concrete tariefwaarden gevonden; `"gedeeltelijk"` = relevante voorwaarden gevonden maar geen concrete bedragen; `"geen_data"` = pagina bevatte niets bruikbaars; `"fout"` = pagina onbereikbaar (met `foutmelding`).
- Een leeg tariefveld betekent "niet op de bronpagina gevonden", nooit "gratis" of "nul". De actor verzint geen waarden; rekenvoorbeelden, bereik-statements ("variëren van ... tot ..."), hypothetische uitspraken ("zou je hebben gekregen") en FAQ-vragen worden actief weggefilterd.
- Bij leveranciers met een percentage-model (Vattenfall, Eneco, Oxxio, ENGIE) staat het bedrag er bewust niet: hun vergoeding hangt aan je eigen leveringstarief. `vergoedingsModel: "percentage_leveringstarief"` maakt dat expliciet.
- Elke waarde is te verifiëren via `uitspraken` (letterlijke zinnen) en `bronUrl`.

### Juridisch

Deze actor leest uitsluitend **publiek toegankelijke tarief- en voorwaardenpagina's** van energieleveranciers en de Rijksoverheid, zonder login en zonder omzeiling van technische blokkades. Er worden geen persoonsgegevens verwerkt. Tariefbedragen zijn feitelijke gegevens; de herpublicatie gebeurt met bronvermelding (URL + controledatum per record). De robots.txt van alle gemonitorde domeinen is gerespecteerd bij de bronkeuze. Gebruikers zijn zelf verantwoordelijk voor de verdere verwerking van de data.

### Veelgestelde vragen

**Waarom staat er bij mijn leverancier `null` bij de vergoeding?**
De bronpagina van die leverancier bevatte tijdens deze run geen concreet bedrag per kWh (bijvoorbeeld omdat de leverancier alleen naar persoonlijke tarieven in Mijn Omgeving verwijst). Het veld `uitspraken` toont wat er wél op de pagina staat.

**Hoe actueel is de data?**
Elke run haalt de pagina's live op; `gecontroleerdOp` toont de exacte tijdstippen. Schedule de actor dagelijks of wekelijks voor continue monitoring.

**Wat betekent `wettelijkMinimumVermeld`?**
Dat de bronpagina de wettelijke ondergrens noemt: vanaf 1 januari 2027 moet de terugleververgoeding minimaal 50% van het kale leveringstarief bedragen (exclusief belastingen), tot en met 2030.

**Worden dynamische contracten meegenomen?**
Het `dynamischContractModel`-veld registreert wanneer een leverancier bij een dynamisch contract tegen het uurtarief vergoedt. Losse dagprijzen-monitors voor dynamische leveranciers zijn een mogelijke uitbreiding.

**Kan ik meer dan deze 10 leveranciers toevoegen?**
Niet via input — de adapters zijn per leverancier gevalideerd. Uitbreidingen komen via updates van de actor.

### Changelog

- **0.1** — Eerste versie: top-10 leveranciers, wetgevingsstatus, wijzigingsdetectie, PPE-pricing.

### Related Actors

- [be-captatieverbod-monitor](https://apify.com/codeclouds/be-captatieverbod-monitor) — Belgische captatiedrempel-monitor met hetzelfde signaalpatroon.
- [nl-netcongestie-monitor](https://apify.com/codeclouds/nl-netcongestie-monitor) — netcongestie en transportcapaciteit per regio.

# Actor input Schema

## `leveranciers` (type: `array`):

Welke energieleveranciers gemonitord worden. Leeg of weggelaten = alle 10 uit de top-10.

## `volgWetgeving` (type: `boolean`):

Voeg een extra record toe met de actuele status van de Rijksoverheid-pagina over de salderingsregeling (einddatum, wettelijk minimum).

## `wijzigingsdetectie` (type: `boolean`):

Vergelijk de resultaten met de vorige run en markeer nieuwe of gewijzigde tarieven (vereist voor signalen).

## `alleenWijzigingen` (type: `boolean`):

Push alleen records die nieuw of gewijzigd zijn t.o.v. de vorige run. Handig voor een wekelijkse monitor-taak.

## `includeUitspraken` (type: `boolean`):

Neem relevante letterlijke zinnen van de bronpagina op in elk record (handig voor verificatie en RAG).

## Actor input object example

```json
{
  "leveranciers": [
    "vattenfall",
    "essent",
    "eneco",
    "budget-thuis",
    "energiedirect",
    "greenchoice",
    "engie",
    "oxxio",
    "vandebron",
    "anwb"
  ],
  "volgWetgeving": true,
  "wijzigingsdetectie": true,
  "alleenWijzigingen": false,
  "includeUitspraken": true
}
```

# Actor output Schema

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

Eén record per leverancier in de default dataset.

# 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("codeclouds/nl-terugleververgoeding-monitor").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("codeclouds/nl-terugleververgoeding-monitor").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 codeclouds/nl-terugleververgoeding-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codeclouds/nl-terugleververgoeding-monitor"
        }
    }
}

```

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/QJxYx2ig7DIAasBBC/builds/1olLokc1DFHLmdhQZ/openapi.json
