# Dutch Government Announcements Monitor – Permits (`lwsdjfls/nl-govt-announcements-monitor`) Actor

Dutch government announcements from officielebekendmakingen.nl as a filterable feed: permits, zoning plans, traffic decisions and regulations by municipality, postcode area, type, keywords and period, with authority, address, coordinates, summary, document links and the derived objection deadline.

- **URL**: https://apify.com/lwsdjfls/nl-govt-announcements-monitor.md
- **Developed by:** [Leyten Data](https://apify.com/lwsdjfls) (community)
- **Categories:** Business, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 bekendmaking delivereds

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?

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 Dutch Government Announcements Monitor do?

**Dutch government announcements** for building leads, contractors, environmental consultants, property developers and local journalists: every environmental permit (omgevingsvergunning), zoning or environment plan, traffic decision, regulation, event and operating permit that Dutch municipalities, provinces, water boards and the state publish on officielebekendmakingen.nl, as a feed you filter by municipality, postcode area, type, activity, keywords and period. Each publication comes with the authority, the address and coordinates, a summary, the document links and, the field everyone works with, the **objection deadline** (bezwaar, zienswijze or beroep), derived from the publication and flagged when it expires within fourteen days. Monitor mode delivers only what is new since the previous run.

#### Where the data comes from

Everything is read from **KOOP's SRU 2.0 service** over the official publications collection (bekendmakingen) at `repository.overheid.nl/sru`, the open-data interface behind officielebekendmakingen.nl, published under **CC0** and updated on the day of publication ([dataset page](https://data.overheid.nl/dataset/officiele-bekendmakingen)). No HTML is parsed: the SRU records carry the OWMS metadata (type, authority, dates, location geometry, activities, subjects) and link to the XML of each publication, which the Actor reads for the deadline and the summary. 6.7 million publications are indexed; a Dutch working day adds roughly 1,200 environmental permits alone.

#### The objection deadline

Advisers and neighbours work against hard dates: six weeks to object (Awb art. 6:7), counted from the day after the decision was made known (art. 6:8), which for a permit is the day it was sent to the applicant, not the day it appeared in the Gemeenteblad. The Actor derives the last day to object in this order, and tells you which rule applied in `objection.basis`:

1. `metadata`: the authority filled in the end of the reaction period in the publication's OWMS metadata.
2. `text-end-date`: the publication names the date itself ("tot en met 21 oktober 2026 … bezwaar").
3. `text-sent-date`: the publication names the dispatch date ("Het besluit is verzonden op 11-09-2026"); the deadline is that date plus six weeks (or the term the text states).
4. `text-inspection-period`: the publication names the inspection period ("ter inzage van 16 september tot en met 27 oktober 2026"); the last day is the deadline for a zienswijze.
5. `publication-date-estimate`: a decision without any date in its text; the publication date plus six weeks, explicitly marked as an estimate because the decision may have been sent earlier.
6. `not-applicable`: applications, notifications, procedural notices and regulations, against which no objection lies (Awb art. 8:3 for verordeningen and beleidsregels), with the reason.

`expiresWithin14Days` is true when the deadline is today or within the next fourteen days; `expired` when it has passed. In a scheduled task, filter the dataset on those flags or read the *Deadlines* view.

#### Monitor mode

Set `mode` to `monitor`, keep the filters, schedule the task daily. The first run records a baseline, delivered as `baseline` records at the lookup price per publication; every later run delivers only publications that appeared since (`added`, priced as a new publication) with the same fields. Publications older than the window (`lookbackDays`) leave the state silently: after a run that read its whole window, or, while runs stop early, once the watch knows more publications than one run reads. A watch on a busy filter therefore stays small. A run in which nothing new was published costs the start fee only.

### Features

- **Government announcements and permits monitor for the Netherlands**, straight from KOOP's open-data SRU service (CC0)
- **Filters by municipality, postcode area, authority, type, activity, keywords and period**
- **Objection deadline per decision** (bezwaar, zienswijze, beroep) with the rule it was derived from and the sentence it was taken from
- **Fourteen-day deadline flag** and a *Deadlines* dataset view
- **Address, postcode, municipality and coordinates** of the marked location, for routing leads
- **Activities of environmental permits** (bouwen, slopen, kappen, milieu, reclame, uitweg en inrit) as structured fields
- **Summary with personal names removed**, plus links to the publication as HTML, PDF and XML
- **Monitor mode**: only new publications since the previous run, with a webhook
- Runs through the Apify API, on a schedule, or from Make, Zapier and n8n

### Use cases

#### Contractors, installers and suppliers: building leads

`types: ["omgevingsvergunning"]`, `activities: ["bouwen"]`, your working area in `gemeenten` or `postcodeAreas`, `status` `aanvraag` for the earliest signal (the owner has just decided to build) and `besluit` for the confirmed one. Address and coordinates route the lead to the right branch.

```js
// npm install apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('lwsdjfls/nl-govt-announcements-monitor').call({ gemeenten: ['Voorst', 'Apeldoorn'], types: ['omgevingsvergunning'], activities: ['bouwen'], lookbackDays: 7 });
const { items } = await client.dataset(run.defaultDatasetId).listItems({ clean: true });

for (const { payload } of items) {
    const where = payload.location.address ?? payload.title;
    const deadline = payload.objection.deadline ? ` – bezwaar t/m ${payload.objection.deadline}${payload.objection.expiresWithin14Days ? ' (binnen 14 dagen!)' : ''}` : '';
    console.log(`${payload.publishedOn} ${payload.status} ${payload.authority.name}: ${where}${deadline} ${payload.documentUrl}`);
}
```

#### Environmental consultants and neighbours: never miss a deadline

Watch the municipalities or postcode areas of your clients. Every new decision arrives with its deadline and the sentence it was taken from; the *Deadlines* view lists what expires within fourteen days.

#### Property developers and investors

`types: ["bestemmingsplan", "omgevingsvergunning"]` with keywords such as `woningen`, `appartementen`, `transformatie`: draft plans (`ontwerp`) show what a municipality is about to allow, months before construction.

#### Local journalists

A daily feed of everything a council publishes, traffic decisions and regulations included, with the summary and the document link. Keywords such as `laadpaal`, `terras`, `evenement` or `kap` narrow it to a beat.

### How to use it

1. Say where to look and what to look for. Put municipalities into **Gemeenten**, or postcode areas into **Postcode areas** when your interest is geographic rather than administrative, and pick the publication kinds in **Types**. **Keywords** narrows it further, for example to a street name or a project.
2. Run it once over the last few days with **Days** to see the shape of the output. Each publication comes back with the authority, the address and coordinates where the publication contains them, a summary, the document links and the derived objection deadline. Turn on **Read the publication texts** when you need the full text rather than the metadata.
3. Give it a **State key**, switch **Mode** to the change feed and schedule it daily. Objection periods are short and they start on the publication date, so a feed with a webhook is the difference between acting and reading about it afterwards.

The `deadlines` view sorts by the date that matters and flags anything with less than 14 days left, which is the view most people end up living in. `bekendmakingen` is the full table and `changes` is what the monitor adds each day.

One thing to understand about the deadline: it is derived, not published. Dutch authorities do not publish a machine-readable objection date, so it is calculated from the publication date and the type of decision. It is a reliable planning signal and a good trigger for a reminder, but for a case you intend to fight, confirm the date in the publication itself.

```json
{
  "gemeenten": ["Voorst", "Groningen"],
  "types": ["omgevingsvergunning", "verkeersbesluit"],
  "lookbackDays": 7
}
```

### Input

| Field | What it does | Example |
| --- | --- | --- |
| `mode` | `lookup` delivers every matching publication in the period; `monitor` delivers only new publications since the previous run. | `"lookup"` |
| `gemeenten` | Municipality names as officielebekendmakingen.nl writes them. A publication matches when the municipality is the authority or when the marked location lies in it. Empty for the whole country. | `["Voorst", "Groningen"]` |
| `authorities` | Provinces, water boards or ministries as publishing authority. | `["Provincie Gelderland"]` |
| `postcodeAreas` | Four-digit areas or full postcodes, matched against the postcode in the address, title or text. | `["7391", "7391 ST"]` |
| `types` | Publication types (OWMS rubrieken). Types that exist to publish matters of named persons are never offered. | `["omgevingsvergunning", "verkeersbesluit"]` |
| `activities` | Restrict environmental permits to activities: bouwen, slopen, kappen, milieu, natuur, reclame, uitweg en inrit, brandveilig gebruik, ruimtelijke ordening. | `["bouwen"]` |
| `keywords` | Words or phrases searched in the title, metadata and text; any of them must match. | `["zonnepanelen", "dakkapel"]` |
| `publishedFrom` | Lookup mode: first publication date. | `2026-09-01` |
| `publishedTo` | Lookup mode: last publication date, inclusive. | `2026-09-15` |
| `lookbackDays` | Lookup mode without dates: the last N days. Monitor mode: the window in which new publications are looked for. | `7` |
| `fetchDocuments` | Reads each publication's text to derive the objection deadline and the summary. | `true` |
| `maxItems` | Caps the charged publications in one run. To find them, a run reads at most five times as many publications, up to 10,000 (or this cap, when it is higher). | `1000` |
| `webhookUrl` | Receives a POST with a summary after each run that delivered publications; stored encrypted. | `https://hooks.example.com/announcements` |
| `stateKey` | Separates independent monitors. Defaults to the task ID. | `voorst-permits` |

```json
{
  "gemeenten": ["Voorst", "Groningen"],
  "types": ["omgevingsvergunning", "verkeersbesluit"],
  "lookbackDays": 7
}
```

`gemeenten` are municipality names as officielebekendmakingen.nl writes them; a publication matches when the municipality is the authority or when the marked location lies in it (so a provincial permit for a site in your municipality is included). `postcodeAreas` (`7391` or `7391 ST`) are matched against the postcode in the address, title or text; publications without a recognisable postcode are then left out. When only the text holds the postcode and a run has no text (`fetchDocuments` is off, the record has no document link, or the document could not be read), a new publication or a lookup leaves the publication out uncharged, and a watch keeps the version of a known one it delivered before, so the run that reads the document delivers the change free (for a watch that knows more publications than a run reads, see the limitations). The run log counts these publications, and a failed read also logs a warning for each. `keywords` are searched in title, metadata and full text. In lookup mode, `publishedFrom`/`publishedTo` or `lookbackDays` set the period.

Monitor mode:

```json
{
  "mode": "monitor",
  "gemeenten": ["Voorst"],
  "types": ["omgevingsvergunning", "bestemmingsplan"],
  "lookbackDays": 4,
  "webhookUrl": "https://hooks.example.com/announcements"
}
```

### Output

One record per publication:

- `id` (`gmb-2026-432727`), `title`, `category` and `categoryLabel` (your type), `rubriek` (the OWMS type as published), `status`: `aanvraag` (application), `ontwerp` (draft), `besluit` (decision), `melding` (notification), `regeling` (regulation), `procedure` (procedural notice) or `overig`
- `authority` (name and kind: gemeente, provincie, waterschap, ministerie), `publication` (Gemeenteblad number and so on), `publishedOn`, `modifiedOn`
- `location`: `address` as the authority marked it, `postcode`, `gemeente` the location lies in, `lat`/`lon` (the marked point, or the centre of the marked area), `geometryType`
- `activities` for environmental permits (bouwen, slopen, kappen, milieu, reclame, uitweg en inrit…), `subjects`, `plansoort`, `typeVerkeersbesluit`
- `summary`: the body of the publication (up to 500 characters) with personal names removed
- `objection`: `deadline`, `kind` (bezwaar, zienswijze, beroep), `basis` (how it was derived, see above), `countedFrom`, `daysLeft`, `expiresWithin14Days`, `expired`, and an `explanation` in Dutch that quotes the sentence it was taken from
- `inspectionUrl` (terinzagelegging) when the authority provided one, `documentUrl` (officielebekendmakingen.nl), `pdfUrl`, `xmlUrl`, `documentFetched`, `namesRemoved`, `checkedAt`

```json
{
  "envelopeVersion": 1,
  "id": "gmb-2026-432391",
  "scope": "lookup:895dd46645356973",
  "changeType": "added",
  "sourceUrl": "https://zoek.officielebekendmakingen.nl/gmb-2026-432391.html",
  "scrapedAt": "2026-09-15T20:00:00.000Z",
  "firstSeenAt": "2026-09-15T20:00:00.000Z",
  "hash": "ef7942c9a1f49ee51df4ed40c392abf9edc75ae969b0371edb401786b59893ca",
  "previousHash": null,
  "changes": [],
  "summary": "Added: Omgevingsvergunning verleend voor het kappen van een boom op de locatie Zwarte Kolkstraat 49, 7384DC Wilp (Voorst, 2026-09-15)",
  "diffText": null,
  "payload": {
    "id": "gmb-2026-432391",
    "title": "Omgevingsvergunning verleend voor het kappen van een boom op de locatie Zwarte Kolkstraat 49, 7384DC Wilp",
    "category": "omgevingsvergunning",
    "categoryLabel": "Omgevingsvergunning",
    "rubriek": "omgevingsvergunning",
    "status": "besluit",
    "authority": {
      "name": "Voorst",
      "kind": "gemeente"
    },
    "publication": {
      "name": "Gemeenteblad",
      "number": "432391"
    },
    "publishedOn": "2026-09-15",
    "modifiedOn": "2026-09-15",
    "location": {
      "address": "Zwarte Kolkstraat 49, 7384DC Wilp",
      "postcode": "7384 DC",
      "gemeente": "Voorst",
      "lat": 52.213033,
      "lon": 6.096149,
      "geometryType": "Vlak"
    },
    "activities": [
      "kappen"
    ],
    "subjects": [
      "Ruimte en infrastructuur | Organisatie en beleid"
    ],
    "plansoort": null,
    "typeVerkeersbesluit": null,
    "summary": "Omgevingsvergunning verleend voor het kappen van een boom op de locatie Zwarte Kolkstraat 49, 7384DC Wilp Datum besluit: 11 september 2026 Kenmerk: Z2026-00001584 Informatie Heeft u vragen of wilt u het besluit inzien? Neem dan gerust contact op met de gemeente Voorst. Het telefoonnummer is 0571–27 93 35. Wilt u de stukken digitaal ontvangen? Stuur dan een e-mail aan omgevingsvergunning@voorst.nl en vermeld daarbij het zaaknummer. Niet eens met het besluit? Bezwaar Bent u belanghebbende en bent …",
    "objection": {
      "deadline": "2026-10-27",
      "kind": "bezwaar",
      "basis": "publication-date-estimate",
      "countedFrom": "2026-09-15",
      "daysLeft": 42,
      "expiresWithin14Days": false,
      "expired": false,
      "explanation": "Schatting: zes weken na de publicatiedatum. De publicatie noemt geen verzend- of einddatum; de wettelijke termijn loopt vanaf de dag na bekendmaking aan de aanvrager, die eerder kan liggen dan deze publicatie. Controleer het besluit zelf."
    },
    "inspectionUrl": null,
    "documentUrl": "https://zoek.officielebekendmakingen.nl/gmb-2026-432391.html",
    "pdfUrl": "https://repository.overheid.nl/frbr/officielepublicaties/gmb/2026/gmb-2026-432391/1/pdf/gmb-2026-432391.pdf",
    "xmlUrl": "https://repository.overheid.nl/frbr/officielepublicaties/gmb/2026/gmb-2026-432391/1/xml/gmb-2026-432391.xml",
    "documentFetched": true,
    "namesRemoved": 0,
    "checkedAt": "2026-09-15T20:00:00.000Z"
  }
}
```

### Pricing

| Event | Name | What it means | Price |
| --- | --- | --- | --- |
| `apify-actor-start` | Actor start | Charged by Apify when a run starts: once for a run of up to 1 GB of memory, and once more for every extra GB. It covers the first five seconds of compute. | $0.00005 per run up to 1 GB of memory ($0.05 per 1,000) |
| `bekendmaking-delivered` **(primary)** | Bekendmaking delivered | One publication delivered in lookup mode, or in the baseline a monitor records on its first run, with type, authority, location, summary, document links and the derived objection deadline. | $0.002 per publication ($2.00 per 1,000) |
| `new-publication-detected` | New publication detected | In monitor mode: a publication that appeared in a followed filter since the previous run, delivered with the same fields. Publications a watch already delivered are free. | $0.01 per new publication ($10.00 per 1,000) |

A week of environmental permits and traffic decisions of two municipalities (about 60 publications) costs $0.12. Every environmental permit in the country for a day (about 1,200) costs $2.40. A daily watch on one municipality starts with its current window as a baseline at $0.002 per publication, then delivers a handful of new publications a day, at $0.01 each. If your spending limit ends that first run early, the watch starts from the publications that fit and the next run delivers the rest as new publications.

Not charged: publications already delivered by a watch, and runs on which the SRU service did not answer.

### FAQ

#### Why is the objection deadline an estimate for some decisions?

Because the term runs from the day after the decision was sent to the applicant, and many municipalities do not print that date in the announcement. When neither a dispatch date nor an end date is in the text, the Actor counts six weeks from the publication date and says so in `basis` and `explanation`. Treat an estimate as the latest possible date and check the decision itself.

#### Which types exist, and what is "andere vergunning"?

The types follow KOOP's rubrieken. `andere vergunning` is the catch-all authorities use for market-stall, terrace, tree-felling (in some municipalities), mooring and similar permits; combine it with keywords.

#### Can I get the full text of a Dutch government announcement?

The summary holds the first 500 characters of the body; `documentUrl`, `pdfUrl` and `xmlUrl` link to the complete publication in three formats.

#### Is it legal and GDPR-compliant to use these publications for leads?

The data is published by the Dutch government under CC0 for reuse, on a service KOOP provides for exactly this purpose. Publications are about places, and the Actor delivers addresses, because the address is what a lead or a neighbour needs. Names of natural persons are another matter: publication types that exist to announce matters of named persons (bankruptcies, divorces, court summons, BRP decisions, honours, deregistrations) are not offered at all; publications that KOOP marks as carrying personal data (the OWMS `persoonsgegevens` element) are skipped, whatever their type; in summaries and texts, names written after a salutation or a role ("de heer J. van der Berg", "aanvrager: mevrouw De Vries") are replaced by `[naam verwijderd]`, and `namesRemoved` counts them; company names stay. Titles are delivered as published: when an authority put a person's name in the title, it is inseparable from the publication. If you build a marketing database on this feed, you are the controller under the GDPR: inform the people you approach and honour objections.

#### What are the limitations?

- The SRU service is occasionally slow or unavailable; such runs are not charged and monitor state is kept.
- The deadline is derived from the publication's text and metadata; `basis` tells you how confident to be, and an estimate is the latest possible date, not a guarantee.
- Only the publication types KOOP offers as rubrieken can be filtered; the catch-all `andere vergunning` needs keywords.
- Summaries are truncated at 500 characters; the full text is one link away.
- A run reads at most five times `maxItems` publications, up to 10,000 (or `maxItems` itself, when that is higher). A postcode filter without `gemeenten` searches the whole country and may stop there with a warning; add the municipalities around your postcode areas. A watch run that stops early keeps the known publications of its window that it did not reach, so they are not charged again; once a watch knows more publications than a run reads, only those whose last known modification date is inside the window are kept, and one of the others that KOOP has modified since is delivered again as a new publication when a later run reaches it. For a known publication a run kept without its text, the last known date is the one of the version the watch delivered, not KOOP's newer one. Publications a watch already knows do not count against `maxItems`.

### Related Actors

- [RVO Subsidy Tracker: open Dutch grant schemes with deadlines and budget changes](https://apify.com/lwsdjfls/rvo-subsidy-tracker), for the advisers who also watch permits.
- [Benelux Insolvency Radar: daily corporate insolvencies in the Netherlands and Belgium](https://apify.com/lwsdjfls/benelux-insolvency-radar), legal entities only.

### Support

Found a bug or need a feature? Open an issue on the Actor page. We usually respond within a day.

# Changelog

This Actor's version history is a separate document: https://apify.com/lwsdjfls/nl-govt-announcements-monitor/changelog.md

# Actor input Schema

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

Lookup: every publication matching the filters in the period is delivered. Monitor: the first run delivers a baseline (priced like a lookup), later runs deliver only publications that are new since the previous run (schedule it daily).

## `gemeenten` (type: `array`):

Municipality names as officielebekendmakingen.nl writes them ("Amsterdam", "Voorst", "'s-Hertogenbosch"). Matches publications by the municipality as authority and publications by provinces, water boards or the state about a location inside it. Leave empty for the whole country.

## `authorities` (type: `array`):

Provinces, water boards or ministries as publishing authority, e.g. "Provincie Gelderland", "Waterschap Vechtstromen".

## `postcodeAreas` (type: `array`):

Four-digit areas (7391) or full postcodes (7391 ST). Only publications whose address carries a matching postcode are delivered; publications without a postcode in title, address or text are left out when this filter is set.

## `types` (type: `array`):

Publication types (OWMS rubrieken). Types that exist to publish matters of named persons (bankruptcies, divorces, court summons, BRP decisions) are never offered.

## `activities` (type: `array`):

Restrict omgevingsvergunningen to activities: bouwen, slopen, kappen, milieu, natuur, reclame, uitweg en inrit, brandveilig gebruik, ruimtelijke ordening.

## `keywords` (type: `array`):

Words or phrases searched in the title, metadata and text (any of them must match): "zonnepanelen", "dakkapel", "laadpaal", "woningsplitsing".

## `publishedFrom` (type: `string`):

Lookup mode: first publication date (YYYY-MM-DD). Default: the last 7 days (see "Days").

## `publishedTo` (type: `string`):

Lookup mode: last publication date (YYYY-MM-DD), inclusive.

## `lookbackDays` (type: `integer`):

Lookup mode without dates: publications of the last N days. Monitor mode: the window in which new publications are looked for; keep it larger than the interval between runs.

## `fetchDocuments` (type: `boolean`):

Reads each publication's text to derive the objection deadline (dispatch date, "tot en met" date, inspection period) and the summary. Without it only the metadata is used.

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

Caps the charged publications in one run. To find them, a run reads at most five times as many publications, up to 10,000 (or this cap, when it is higher).

## `webhookUrl` (type: `string`):

Receives a POST with a summary after each run that delivered publications.

## `stateKey` (type: `string`):

Separates independent monitors. Defaults to the task ID, so each saved task keeps its own baseline.

## Actor input object example

```json
{
  "mode": "lookup",
  "gemeenten": [
    "Voorst",
    "Groningen"
  ],
  "authorities": [],
  "postcodeAreas": [],
  "types": [
    "omgevingsvergunning",
    "verkeersbesluit"
  ],
  "activities": [],
  "keywords": [],
  "publishedFrom": "2026-09-01",
  "publishedTo": "2026-09-15",
  "lookbackDays": 7,
  "fetchDocuments": true,
  "maxItems": 1000,
  "webhookUrl": "https://hooks.example.com/announcements",
  "stateKey": "voorst-permits"
}
```

# Actor output Schema

## `bekendmakingen` (type: `string`):

Publications with type, authority, address, deadline and summary.

## `deadlines` (type: `string`):

The same publications, focused on the objection deadline and how it was derived.

## `changes` (type: `string`):

Monitor mode: new publications since the previous run.

## `runSummary` (type: `string`):

Counts, failures and the cost of the run.

# 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 = {
    "gemeenten": [
        "Voorst",
        "Groningen"
    ],
    "types": [
        "omgevingsvergunning",
        "verkeersbesluit"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lwsdjfls/nl-govt-announcements-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 = {
    "gemeenten": [
        "Voorst",
        "Groningen",
    ],
    "types": [
        "omgevingsvergunning",
        "verkeersbesluit",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("lwsdjfls/nl-govt-announcements-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 '{
  "gemeenten": [
    "Voorst",
    "Groningen"
  ],
  "types": [
    "omgevingsvergunning",
    "verkeersbesluit"
  ]
}' |
apify call lwsdjfls/nl-govt-announcements-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lwsdjfls/nl-govt-announcements-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/FFDNOVRjg9XEg9dQc/builds/pDa4caZYNy0pRdHhM/openapi.json
