# Golden Pages (goldenpages.be) API (`thodor/goldenpages`) Actor

Scrape and extract business listings from Golden Pages (goldenpages.be), the English edition of 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/goldenpages.md
- **Developed by:** [Thodor](https://apify.com/thodor) (community)
- **Categories:** Lead generation
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 1 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 **Golden Pages scraper** tool for [goldenpages.be](https://www.goldenpages.be), the English edition of Belgium's largest business directory. Search `dentist` in `Ghent` and get every matching Belgian business as a spreadsheet row, with phone, email, website, opening hours, and the company's VAT registration, all labeled in English. No Dutch required.

That's the point of this edition: Belgium's business data is locked behind Dutch and French directories, and this actor is the way into it for an English-speaking team. Categories come back as `Funeral directors` instead of `Begrafenisondernemingen`, KBO statuses as `Active file`, weekdays as `Monday`. If your team works in Dutch, the sibling [Gouden Gids Scraper](https://apify.com/thodor/goudengids) reads the Dutch edition of the same directory.

### 📋 How to scrape Belgian businesses in English

1. Type an English search term into **What**: `restaurant`, `plumber`, `dentist`, `lawyer`.
2. Optionally type a city into **Where**: `antwerp`, `ghent`, `brussels`. 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?

| | | |
| --- | --- | --- |
| **📧 Email and website** | **📞 Every listed phone number** | **🧾 Belgian VAT number:** *with KBO record in English* |
| **📍 Address:** *street to province* | **🕐 Opening hours:** *Monday, not Maandag* | **⭐ Ratings and reviews** |
| **🏷️ English categories** | **📱 Social media links** | **🆔 Listing ID shared across the NL, FR, and EN editions** |

### ⚖️ Which edition should you run?

The Belgian directory publishes in three languages; the listings and IDs are the same, the labels and a few fields differ.

| | This actor (goldenpages.be) | [Gouden Gids Scraper](https://apify.com/thodor/goudengids) (goudengids.be) |
|---|---|---|
| 🔍 Search terms | ✅ English: `plumber`, `dentist` | 🇳🇱 Dutch: `loodgieter`, `tandarts` |
| 🏷️ Output labels | ✅ English: `Active file`, `Monday` | 🇳🇱 Dutch: `Actieve dossier`, `Maandag` |
| 📝 Company description, logo, verified badge | ❌ Not published on the English site | ✅ Included |
| 🗃️ Listings and IDs | Same businesses, same `listing_id` | Same businesses, same `listing_id` |

There is no actor for the French edition (pagesdor.be), but every row from either sibling carries `alternate_urls.fr` pointing at it.

### 🎯 Three things people run this for

| | How |
|---|---|
| 🌍 **Prospect Belgium without speaking Dutch** | One category, one city, straight into your CRM: the flat columns map onto Lead and Account objects, and your English-speaking SDRs can read every field |
| 🧾 **Vendor and partner due diligence** | Each row links the company's public KBO record with its status in English. `Active file` means the registration is alive; anything else is a flag before you sign |
| 🗺️ **Market mapping** | Count businesses per category per city, compare ratings and opening hours across regions, and find the underserved ones |

### 📥 Input

```json
{
  "what": "dentist",
  "where": "ghent",
  "maxResults": 100
}
```

- `what`: an English search term, at least 3 characters. Category words work best (`restaurant`, `electrician`); legal-form abbreviations (`bv`, `nv`, `sprl`) are not searchable and return nothing. `company` lists everything
- `where`: a city name. Empty searches all of Belgium
- `maxResults`: default `10`, the form prefills it. `0` = every result

> ⚠️ **A few things stay local.** Most cities take English names (`Antwerp`, `Ghent`, `Brussels`), but a handful only exist under their Dutch name on the site (`Ukkel`, `Mol`): use whatever the goldenpages.be address bar shows. And free-text content written by the business itself, longer descriptions and review bodies, arrives in whichever language it was written, often Dutch or French.

### 📤 Output

One row per company, every record with the same keys in the same order and `null` where the site has no value, so typed pipelines and CRM imports can rely on a single shape.

![Golden Pages scraper output example](https://api.apify.com/v2/key-value-stores/LHcvkclm26dcJvwP1/records/golden-pages-output.png)

```json
{
  "url": "https://www.goldenpages.be/company/Ukkel/L11144012/...",
  "listing_id": "L11144012",
  "name": "VEYS - DEVOGHEL Funérarium / Funeral Director",
  "street": "Alsembergsesteenweg 368",
  "city": "Ukkel",
  "postal_code": "1180",
  "province": "Brussels",
  "phone": "+32477196047",
  "email": "pfveysdevoghel@hotmail.com",
  "website": "https://www.funerarium-veysdevoghel.be",
  "rating": 4.83,
  "rating_count": 37,
  "ondernemingsnummer": "BE0873097889",
  "founding_date": "2005-04-04",
  "kbo_status": "Active file",
  "category": "Funeral directors",
  "opening_hours": [
    { "day": "Monday", "hours": "0:00 - 24:00" }
    // HIDDEN: the other 6 days
  ],
  "alternate_urls": {
    "nl": "https://www.goudengids.be/bedrijf/Ukkel/L11144012/...",
    "fr": "https://www.pagesdor.be/entreprise/Uccle/L11144012/..."
  }
  // HIDDEN: country, phones, whatsapp, btw, kbo_url, employees_raw,
  //         employees_min, employees_max, reviews, languages, social_media,
  //         parking, categories, images
}
```

#### Fields

| Field | What it holds |
|---|---|
| `url`, `listing_id` | The listing on goldenpages.be and the ID it shares with the NL and FR editions |
| `name` | Trading name |
| `phone`, `phones`, `whatsapp` | Primary number, every number deduped, WhatsApp when listed |
| `email`, `website` | `email` is `null` when the listing hides it behind a click-to-reveal control |
| `street`, `postal_code`, `city`, `province`, `country` | Address components |
| `ondernemingsnummer`, `btw` | Belgian enterprise/VAT number and the raw VAT line |
| `kbo_status`, `kbo_url`, `founding_date` | The public KBO registration: status in English, link, founding date |
| `rating`, `rating_count`, `reviews` | Aggregate rating and the review list `{author, rating, text, date}` |
| `category`, `categories` | Primary English category and every tag |
| `opening_hours` | `{day, hours}` per weekday, English day names |
| `employees_min`, `employees_max`, `employees_raw` | Headcount band |
| `languages`, `social_media`, `parking` | Spoken languages, social profiles, parking info |
| `images` | Listing photos |
| `alternate_urls` | The same listing on goudengids.be (NL) and pagesdor.be (FR) |

### ⚙️ Use it as a Golden Pages 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~goldenpages/run-sync-get-dataset-items",
    params={"token": "YOUR_APIFY_TOKEN"},
    json={"what": "plumber", "where": "antwerp", "maxResults": 100},
)

for c in resp.json():
    print(c["name"], c["phone"], c["kbo_status"])
```

#### Node.js

```javascript
import axios from "axios";

const { data } = await axios.post(
  "https://api.apify.com/v2/acts/thodor~goldenpages/run-sync-get-dataset-items",
  { what: "dentist", where: "ghent", 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~goldenpages/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"what":"restaurant","where":"brussels","maxResults":100}'
```

Swap `run-sync-get-dataset-items` for `runs` to fire async with a webhook. 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 Golden Pages?

Billing is per company delivered, from $10.00 per 1,000: a 40-result run costs about $0.40, and `maxResults` stops the run at exactly the rows you asked for.

### ❓ FAQ

**Can I scrape Golden Pages for free?**
Yes. Registering on Apify comes with $5 of free platform credit every month, no credit card needed, good for roughly 500 companies.

**Does this work for goldenpages.ie (Ireland)?**
No. This actor covers goldenpages.be, the Belgian directory; Ireland's goldenpages.ie is an unrelated site.

**Why does the Dutch sibling return more fields?**
The English site doesn't publish the company description, logo, or verified badge. Since the `listing_id` is shared, you can run the [Gouden Gids Scraper](https://apify.com/thodor/goudengids) on the same searches and join the two datasets on that ID when you need both English labels and the extra fields.

**Is it legal to scrape goldenpages.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 arrive without breaking existing exports. I'm a solo dev, so don't hesitate.

Working in Dutch? The [Gouden Gids Scraper](https://apify.com/thodor/goudengids) reads the Dutch edition and returns a few fields this one can't.

- Thodor

# Actor input Schema

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

Search term in English, e.g. 'restaurant', 'plumber', 'dentist'. 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', 'sa' — they are not searchable categories on goldenpages.be. To list every business, use 'company' instead.

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

Location, e.g. 'antwerp', 'ghent', 'brussels'. 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": "antwerp",
  "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": "antwerp",
    "maxResults": 10
};

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

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

```

## MCP server setup

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

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/qXFJfDiGxOLFgJkjn/builds/7a79jeCahcjAix6LS/openapi.json
