# Gouden Gids (goudengids.be) Scraper (`thodor/goudengids`) Actor

Scrape business listings from Gouden Gids (goudengids.be) for B2B leads, Belgium's largest yellow pages and business directory. Extract company names, addresses, phone numbers, emails, websites, opening hours, and categories.

- **URL**: https://apify.com/thodor/goudengids.md
- **Developed by:** [Thodor](https://apify.com/thodor) (community)
- **Categories:** Lead generation
- **Features:** Limited permissions
- **Stats:** 5 total users, 0 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 results

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

A **Gouden Gids scraper** tool for [goudengids.be](https://www.goudengids.be), Belgium's largest business directory. Type what and where in Dutch (`restaurant`, `antwerpen`), get every matching company back as one row: phone, email, website, address, opening hours, and the Belgian VAT number with its KBO record attached. Export as CSV, Excel, or JSON.

The VAT enrichment is what a generic maps scraper can't give you: every row carries the `ondernemingsnummer`, the KBO status, and the founding date straight from the listing, so a lead list arrives ready for your CRM with the companies-register identity already joined.

### 📋 How to export Gouden Gids listings to a spreadsheet

1. Type your search in Dutch into **What**: `restaurant`, `loodgieter`, `tandarts`.
2. Optionally type a place into **Where**: `antwerpen`, `gent`, `brussel`. Empty searches all of Belgium.
3. Click **Start**.
4. Open the **Output** tab and click **Export** for CSV, Excel, JSON, or HTML.

### 🎁 So what do you get?

| | | |
| --- | --- | --- |
| **📞 Phones:** *every listed number, deduped* | **📧 Email and website** | **🧾 VAT number:** *plus KBO status and founding date* |
| **📍 Full address:** *street, postal code, city, province* | **🕐 Opening hours** | **⭐ Rating and reviews** |
| **🏷️ Categories** | **📱 Social media links** | **✅ Verified badge and employee band** |

### ⚖️ Compared to scraping Google Maps for Belgian leads

| | Google Maps | Gouden Gids |
|---|---|---|
| 📧 Email address | ❌ Never published | ✅ When the business lists one |
| 🧾 VAT number | ❌ | ✅ `ondernemingsnummer` on most listings |
| 🏛️ Companies-register data | ❌ | ✅ KBO status, founding date, KBO link |
| 🇧🇪 Coverage | ⚠️ Whatever has a Maps profile | ✅ Belgium's dedicated business directory |
| 🌍 Reach | ✅ Worldwide | ⚠️ Belgium only |

For businesses outside Belgium, or when you need coordinates and 60+ attributes, the [Google Maps Scraper](https://apify.com/thodor/google-maps-scraper-with-reviews) is the right tool; for Belgian B2B lists with VAT numbers and emails, this one is.

### 🎯 Three things people run this for

| | How |
|---|---|
| 🧾 **Belgian B2B lead lists** | One category and city per run, `maxResults: 0` for everything. Rows arrive with VAT number, email, and phone; drop the ones whose `kbo_status` isn't active before importing to your CRM |
| 📇 **Enrich an existing company list** | Backfill VAT numbers, websites, and emails for companies you only know by name and city |
| 🥊 **Market research per region** | Count competitors per category per city, snapshot ratings, opening hours, and the verified badge across a whole sector |

### 📥 Input

```json
{
  "what": "restaurant",
  "where": "antwerpen",
  "maxResults": 100
}
```

- `what`: the search term, in Dutch, at least 3 characters. Legal-form abbreviations (`bv`, `nv`, `vof`) are not searchable categories and return nothing; use `bedrijven` to list everything
- `where`: a Dutch place name (`gent`, not `Ghent`). Empty searches all of Belgium
- `maxResults`: default `10`, the form prefills it. `0` = every result

> ⚠️ **Everything is in Dutch.** This actor covers the Dutch edition at goudengids.be: search terms and place names go in Dutch, and values come back in Dutch (`Maandag`, `Begrafenisondernemingen`, `Actieve dossier`). Field names stay English (`name`, `phone`, `city`). For English search terms and output, use the sibling [Golden Pages Scraper](https://apify.com/thodor/goldenpages), which targets goldenpages.be, the English edition of the same directory.

### 📤 Output

One row per company, every record with the same fields in the same order, so exports drop cleanly into a spreadsheet.

![Gouden Gids scraper output example](https://api.apify.com/v2/key-value-stores/LHcvkclm26dcJvwP1/records/gouden-gids-output.png)

A real record, trimmed:

```json
{
  "url": "https://www.goudengids.be/bedrijf/Ukkel/L11144012/Begrafenissen+Ukkel+VEYS+-+DEVOGHEL+Funerarium-Begrafenisondernemers/",
  "listing_id": "L11144012",
  "name": "Begrafenissen Ukkel VEYS - DEVOGHEL Funerarium/Begrafenisondernemers",
  "street": "Alsembergsesteenweg 368",
  "city": "Ukkel",
  "postal_code": "1180",
  "province": "Brussel",
  "phone": "+32477196047",
  "email": "pfveysdevoghel@hotmail.com",
  "website": "https://www.funerarium-veysdevoghel.be",
  "rating": 4.84,
  "rating_count": 37,
  "ondernemingsnummer": "BE0873097889",
  "founding_date": "2005-04-04",
  "kbo_status": "Actieve dossier",
  "kbo_url": "https://kbopub.economie.fgov.be/kbopub/toonondernemingps.html?lang=nl&ondernemingsnummer=0873097889",
  "verified": true,
  "category": "Begrafenisondernemingen",
  "opening_hours": [
    { "day": "Maandag", "hours": "0:00 - 24:00" }
    // HIDDEN: the other 6 days
  ],
  "reviews": [
    { "author": "Sylvain Renard", "rating": 5, "text": "Merci beaucoup pour votre travail...", "date": "9 maart 2026" }
    // HIDDEN: 2 more reviews
  ]
  // HIDDEN: country, phones, whatsapp, logo, btw, employees_raw, employees_min,
  //         employees_max, description_markdown, languages, social_media, parking,
  //         categories, images, alternate_urls
}
```

#### Fields

| Field | Description |
|---|---|
| `url`, `listing_id` | The listing on goudengids.be and its stable ID |
| `name` | Business name |
| `phone`, `phones`, `whatsapp` | Primary number, every listed number deduped, WhatsApp when listed |
| `email`, `website` | When the business publishes them |
| `street`, `postal_code`, `city`, `province`, `country` | Full address |
| `ondernemingsnummer`, `btw` | Belgian VAT/enterprise number and the raw BTW line |
| `kbo_status`, `kbo_url`, `founding_date` | The company's public KBO record: status, link, founding date |
| `verified` | `true` when the listing carries the "Geverifieerde onderneming" badge |
| `rating`, `rating_count`, `reviews` | Aggregate rating plus the review list `{author, rating, text, date}` |
| `category`, `categories` | Primary category and every listed one |
| `opening_hours` | `{day, hours}` per weekday |
| `employees_min`, `employees_max`, `employees_raw` | Headcount band |
| `description_markdown` | The company description, converted to Markdown |
| `languages`, `social_media`, `parking` | Spoken languages, social profiles, Seety parking info |
| `logo`, `images` | Image URLs |
| `alternate_urls` | The same listing on pagesdor.be (FR) and goldenpages.be (EN) |

### ⚙️ Use it as a Gouden Gids API

Every run is an HTTP endpoint: POST the same JSON as the form and the companies come back in the response body.

#### Python

```python
import requests

resp = requests.post(
    "https://api.apify.com/v2/acts/thodor~goudengids/run-sync-get-dataset-items",
    params={"token": "YOUR_APIFY_TOKEN"},
    json={"what": "loodgieter", "where": "gent", "maxResults": 100},
)

for c in resp.json():
    if c["kbo_status"] == "Actieve dossier":
        print(c["name"], c["phone"], c["email"], c["ondernemingsnummer"])
```

#### Node.js

```javascript
import axios from "axios";

const { data } = await axios.post(
  "https://api.apify.com/v2/acts/thodor~goudengids/run-sync-get-dataset-items",
  { what: "tandarts", where: "antwerpen", maxResults: 100 },
  { params: { token: process.env.APIFY_TOKEN } }
);

console.log(data.length, data[0].name, data[0].ondernemingsnummer);
```

#### curl

```bash
curl -X POST "https://api.apify.com/v2/acts/thodor~goudengids/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"what":"restaurant","where":"antwerpen","maxResults":100}'
```

Swap `run-sync-get-dataset-items` for `runs` to fire async with a webhook on large categories. The `apify-client` SDK works too, in Python and JavaScript, and the n8n, Make, Zapier, and Google Sheets integrations take the same input.

> 💡 **Tip:** no need to write the JSON by hand. Fill in the form on the Input tab, switch the editor from **Form** to **JSON**, and copy the result into your code.

### 💰 How much does it cost to scrape Gouden Gids?

Billing is per company delivered, from $10.00 per 1,000, so a run that returns 40 restaurants costs about $0.40. `maxResults` doubles as the cost cap: the run stops the moment it reaches it.

### ❓ FAQ

**Can I scrape Gouden Gids for free?**
Yes. Registering on Apify comes with $5 of free platform credit every month, no credit card needed, which covers roughly 500 companies: a full category in one city.

**Does this work for goudengids.nl (Netherlands)?**
No. This actor covers goudengids.be, the Belgian directory; the Dutch goudengids.nl is a different site run by a different company.

**Can I get the French (pagesdor.be) listings?**
Not directly, but every row carries `alternate_urls.fr`, the same listing's URL on pagesdor.be. For English, the [Golden Pages Scraper](https://apify.com/thodor/goldenpages) returns the same dataset from the English edition.

**Is it legal to scrape goudengids.be?**
The actor extracts only what anyone can view on the site. Business contact details can still qualify as personal data under GDPR, so for outreach you need a lawful basis and must honour opt-outs.

### 🛟 Support

Something not working, or a field missing? Message me in the Issues tab and I'll look into it quickly; the output schema is versioned, so new fields are added without breaking existing exports. I'm a solo dev, so don't hesitate.

Searching in English instead? The [Golden Pages Scraper](https://apify.com/thodor/goldenpages) covers the English edition of the same directory.

- Thodor

# Actor input Schema

## `what` (type: `string`):

Search term in Dutch, e.g. 'restaurant', 'loodgieter', 'tandarts'. Must be at least 3 characters. Punctuation like ':', '/', '?' is stripped before searching (they cause the upstream site to error). Do NOT use legal-form abbreviations like 'bv', 'nv', 'vof' — they are not searchable categories on goudengids.be. To list every business, use 'bedrijven' instead.

## `where` (type: `string`):

Location in Dutch, e.g. 'antwerpen', 'gent', 'brussel'. Leave empty for a Belgium-wide search. Punctuation is stripped before searching.

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

Maximum number of companies to scrape (0 = unlimited).

## Actor input object example

```json
{
  "what": "restaurant",
  "where": "antwerpen",
  "maxResults": 10
}
```

# 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 = {
    "what": "restaurant",
    "where": "antwerpen",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("thodor/goudengids").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 = {
    "what": "restaurant",
    "where": "antwerpen",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("thodor/goudengids").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 '{
  "what": "restaurant",
  "where": "antwerpen",
  "maxResults": 10
}' |
apify call thodor/goudengids --silent --output-dataset

```

## MCP server setup

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

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/bMhHoETwUTTUPPM36/builds/RHDPIpdSiNlV5bFzk/openapi.json
