# Belgisch Staatsblad Scraper — Gazette + Registrations (`studio-amba/staatsblad-scraper`) Actor

Scrape Belgian Official Gazette publications and company registration announcements (Bijlage van de Rechtspersonen). Browse laws by date, search new company formations, track KBO filings.

- **URL**: https://apify.com/studio-amba/staatsblad-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Other
- **Features:** Limited permissions
- **Stats:** 18 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 result scrapeds

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

## Staatsblad Scraper — Belgian Official Gazette + Registration Announcements

Know when a Belgian company registers, changes its board, or dissolves, without checking the gazette by hand. This actor pulls company registration announcements from the Bijlage van de Rechtspersonen, or laws, royal decrees, and ministerial orders from the daily Belgisch Staatsblad. Two scrapers in one, covering the full ejustice.just.fgov.be website.

### How to scrape Belgian Staatsblad data

This scraper has two modes, selected via the **Section** input:

#### Mode 1: Gazette Publications (Belgisch Staatsblad)

Browse the daily gazette — every law, royal decree, ministerial order, and public notice published in Belgium. Filter by date range, document type, or keyword.

#### Mode 2: Company Registrations (Bijlage van de Rechtspersonen)

Search the official company registry supplement. Find newly registered companies, track dissolutions, monitor board changes, or look up any KBO-registered entity by enterprise number, name, postal code, or legal form.

### What data does Staatsblad Scraper extract?

#### Gazette Publications

| Field | Description |
|-------|-------------|
| **title** | Full title of the publication |
| **numacId** | Unique NUMAC identification number |
| **publicationDate** | Date published in the gazette (YYYY-MM-DD) |
| **documentType** | Category (e.g., "Koninklijke besluiten", "Wetten, Decreten") |
| **source** | Issuing authority (e.g., "FOD Justitie") |
| **language** | `nl` or `fr` |
| **url** | Direct link to the full document text |
| **pdfUrl** | Direct link to the official PDF at the correct page |
| **pageStart / pageEnd** | Page numbers in the printed gazette |
| **scrapedAt** | ISO timestamp of extraction |

#### Company Registrations

| Field | Description |
|-------|-------------|
| **companyName** | Registered company name |
| **legalForm** | Legal form (BV, NV, VZW, ASBL, CommV, etc.) |
| **enterpriseNumber** | KBO/BTW enterprise number (e.g., 1037.283.554) |
| **address** | Registered address |
| **category** | Registration type (e.g., "RUBRIEK OPRICHTING") |
| **publicationDate** | Date of publication (YYYY-MM-DD) |
| **publicationNumber** | Official publication number |
| **pdfUrl** | Direct link to the official PDF of the filing |
| **detailUrl** | Link to full registration details on ejustice.just.fgov.be |
| **language** | `nl` or `fr` |
| **scrapedAt** | ISO timestamp of extraction |

### Input Parameters

#### Shared Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| **Section** | Select | `gazette` | Choose "Gazette Publications" or "Company Registrations" |
| **Date From** | String | 6 days before Date To (both modes) | Start date (YYYY-MM-DD) |
| **Date To** | String | today | End date (YYYY-MM-DD) |
| **Max Results** | Integer | 100 | Maximum results to return |
| **Language** | Select | `nl` | `nl` (Nederlands) or `fr` (Francais) |

#### Gazette-only Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| **Search Query** | String | Filter by keyword in publication titles |
| **Document Type** | String | Filter by type (Wet, Koninklijk besluit, Ministerieel besluit, etc.) |

#### Company Registration Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| **Category** | Select | Filter by registration type: Oprichting (new company), Einde (closure), Benaming (name change), Ontslagen (appointments), etc. |
| **Company Name** | String | Search by company name |
| **Enterprise Number** | String | Search by KBO/BTW number (e.g., 0123.456.789) |
| **Postal Code** | String | Filter by postal code |
| **Address** | String | Filter by address |
| **Legal Form** | Select | Filter by legal form: BV, NV, VZW, CV, VOF, etc. |

### Output Examples

#### Gazette Publication

```json
{
  "title": "Koninklijk besluit tot wijziging van het koninklijk besluit van 25 januari 2001 betreffende de tijdelijke of mobiele bouwplaatsen",
  "numacId": "2026031245",
  "publicationDate": "2026-04-02",
  "documentType": "Koninklijke besluiten",
  "source": "Federale Overheidsdienst Werkgelegenheid, Arbeid en Sociaal Overleg",
  "language": "nl",
  "url": "https://www.ejustice.just.fgov.be/cgi/article_body.pl?numac_search=2026031245",
  "pdfUrl": "https://www.ejustice.just.fgov.be/mopdf/2026/04/02_1.pdf#page=14",
  "pageStart": 14,
  "pageEnd": 18,
  "scrapedAt": "2026-04-03T07:12:45.000Z"
}
```

#### Company Registration

```json
{
  "companyName": "GRIM SCHMID",
  "legalForm": "BV",
  "enterpriseNumber": "1037.283.554",
  "address": "GEHUCHTE 9 9620 ZOTTEGEM",
  "category": "RUBRIEK OPRICHTING (NIEUWE RECHTSPERSOON, OPENING BIJKANTOOR, ENZ...)",
  "publicationDate": "2026-04-28",
  "publicationNumber": "0327055",
  "pdfUrl": "https://www.ejustice.just.fgov.be/tsv_pdf/2026/04/28/26327055.pdf",
  "detailUrl": "https://www.ejustice.just.fgov.be/cgi_tsv/article.pl?language=nl&btw_search=1037283554",
  "language": "nl",
  "scrapedAt": "2026-04-29T20:49:55.299Z"
}
```

### Tips for best results

- **Track new companies daily**: Set Category to "Oprichting" and Date From/To to today. Schedule daily runs to build a live feed of newly registered Belgian companies.
- **Monitor a specific company**: Enter their enterprise number to get all their filings — board changes, capital modifications, address changes.
- **Combine gazette filters**: Use both Document Type and Search Query to narrow results precisely (e.g., all royal decrees mentioning "milieu").
- **The gazette skips weekends**: No documents published on Saturdays/Sundays — weekend dates are automatically excluded in gazette mode.
- **Use NUMAC IDs**: From gazette results, use the NUMAC number to look up exact documents in any Belgian legal database.
- **Large date ranges work**: Company search handles pagination automatically — request months of data at once.

### How much does it cost?

This actor is priced per event: $0.04 per run start plus $0.012 per result (the run-start fee is $0.01 per GB of actor memory, and this actor runs at 4GB). A 25-filing pull costs about $0.34; 100 filings about $1.24. Compute is included in those prices — you do not pay separately for it. A run's usage cost only settles after it reports SUCCEEDED.

### Can I integrate?

Yes. Send data directly to your existing tools:

- **Google Sheets** — Maintain a living spreadsheet of new Belgian companies or laws, updated daily
- **Slack** — Notify your team when new registrations matching specific criteria appear
- **Zapier / Make** — Route gazette entries into your document management or compliance system
- **Webhooks** — Push results to any HTTP endpoint for custom dashboards

Set up integrations from the Apify console under the "Integrations" tab.

### Can I use it as an API?

Yes. Call Staatsblad Scraper programmatically from any language:

#### Python — Daily new company feed

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/staatsblad-scraper").call(run_input={
    "section": "company",
    "category": "c01",
    "dateFrom": "2026-04-28",
    "dateTo": "2026-04-28",
    "maxResults": 500,
})

for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{company['companyName']} ({company['legalForm']}) — {company['enterpriseNumber']}")
```

#### JavaScript — Search gazette by keyword

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('studio-amba/staatsblad-scraper').call({
    section: 'gazette',
    dateFrom: '2026-04-01',
    dateTo: '2026-04-30',
    documentType: 'Koninklijk besluit',
    searchQuery: 'milieu',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(p => console.log(`${p.publicationDate} | ${p.title.slice(0, 80)}...`));
```

### FAQ

#### What is the Belgisch Staatsblad?

The Belgisch Staatsblad (Dutch) or Moniteur Belge (French) is the official gazette of the Kingdom of Belgium. Every Belgian law, royal decree, ministerial order, and public notice must be published here to become enforceable.

#### What is the Bijlage van de Rechtspersonen?

The Bijlage van de Rechtspersonen (Legal Entities Supplement) is a section of the Belgian Official Gazette that publishes all company registrations, modifications, and dissolutions. Every Belgian company registered with the KBO (Kruispuntbank van Ondernemingen) has its legal acts published here.

#### How to scrape new company formations in Belgium?

Set Section to "Company Registrations", Category to "Oprichting", and choose your date range. The scraper returns all newly registered companies with their name, legal form, enterprise number, and address.

#### Is this a Belgisch Staatsblad API alternative?

Yes. The Belgian Official Gazette website does not offer a public API. This scraper provides structured, programmatic access to both gazette publications and company registrations.

#### How to monitor Belgian company changes?

Enter an enterprise number in the Company Registration mode to find all published acts for that company. Track board changes (Ontslagen - benoemingen), capital modifications (Kapitaal - aandelen), or address changes (Maatschappelijke zetel).

#### What categories are available for company registrations?

Oprichting (new company), Einde (closure), Benaming (name), Maatschappelijke zetel (registered office), Doel (purpose), Kapitaal (capital), Ontslagen - benoemingen (appointments), Algemene vergadering (general assembly), Boekjaar (financial year), Statuten (articles), Wijziging rechtsvorm (legal form change), Herstructurering (merger/split), Jaarrekeningen (annual accounts), and Diversen (miscellaneous).

#### Can I scrape the French edition?

Yes. Set Language to `fr` for both gazette (Moniteur Belge) and company registrations.

### Limitations

- The gazette does not publish on weekends or Belgian public holidays
- Keyword search matches against publication titles only, not full document text
- Company registration data is limited to what the Bijlage van de Rechtspersonen publishes — for full KBO data, use a dedicated KBO scraper
- Very old publications may have different URL patterns for PDF links

### Other Belgian data scrapers

Tracking Belgian regulation or business data? Combine with these tools:

- **[ECHA Scraper](https://apify.com/studio-amba/echa-scraper)** — EU chemicals database: substance registrations, CAS numbers, hazard classifications
- **[Safety Gate Scraper](https://apify.com/studio-amba/safetygate-scraper)** — EU product safety alerts and RAPEX recall notifications
- **[EFSA Scraper](https://apify.com/studio-amba/efsa-scraper)** — EU food safety alerts, scientific opinions, and risk assessments
- **[EUR-Lex Scraper](https://apify.com/studio-amba/eurlex-scraper)** — EU regulations, directives, and decisions

### Your feedback

Found a bug or want a feature added? Open an issue on the [Issues tab](https://console.apify.com/actors/studio-amba~staatsblad-scraper/issues). Your feedback helps improve this scraper.

### Language notes

The `language` input selects which edition of the Staatsblad interface is queried (nl or fr). The `language` field on each output row reflects that interface choice, not the language of the underlying filing — Dutch-interface runs also return French-language filings and vice versa.

# Actor input Schema

## `section` (type: `string`):

Choose what to scrape: 'gazette' for laws and decrees from the Belgisch Staatsblad, or 'company' for company registrations from the Bijlage van de Rechtspersonen.

## `dateFrom` (type: `string`):

Start date (YYYY-MM-DD). Defaults to 6 days before Date To, so an empty input returns the last week of results. Exception: a company search by Enterprise Number or Company Name with both dates empty searches the whole archive, newest first.

## `dateTo` (type: `string`):

End date (YYYY-MM-DD). Defaults to today.

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

Maximum number of results to return.

## `language` (type: `string`):

Language for the interface and results.

## `searchQuery` (type: `string`):

Optional keyword filter on publication titles in the gazette's table of contents. Leave empty to get every publication in the date range. The table of contents does not list official notices such as bankruptcies; for a company's publications use the Company Registrations section.

## `documentType` (type: `string`):

Filter by document type (e.g., Wet, Koninklijk besluit, Ministerieel besluit, Decreet).

## `category` (type: `string`):

Filter company registrations by category. Most common: 'c01' for new company formations.

## `companyName` (type: `string`):

Search company registrations by company name.

## `enterpriseNumber` (type: `string`):

Search by Belgian enterprise number (e.g., 0123.456.789). Any format works: BE prefix, dots, spaces or the 9-digit form. With both dates empty, searches the whole archive.

## `postalCode` (type: `string`):

Filter company registrations by postal code.

## `address` (type: `string`):

Filter company registrations by address.

## `legalForm` (type: `string`):

Filter by legal form of the company.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration.

## Actor input object example

```json
{
  "section": "gazette",
  "maxResults": 100,
  "language": "nl",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/staatsblad-scraper").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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    } }

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/staatsblad-scraper").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 '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/staatsblad-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/staatsblad-scraper"
        }
    }
}
```

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/XUalpq32pRyyiwyyt/builds/tT2ftwsOZ4wmZNIEU/openapi.json
