# Belgium BCE/KBO · Company Directors (`corent1robert/belgium-bce-kbo-company-enrich`) Actor

Paste Belgian BCE/KBO numbers or a company name — get directors, NACE, VAT, address, phone and website from the official public register. No API key. CRM-ready rows.

- **URL**: https://apify.com/corent1robert/belgium-bce-kbo-company-enrich.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 company — register onlies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Belgium BCE/KBO · Company Registry Enrich

Paste **Belgian enterprise numbers** (or a **company name**) and get **CRM-ready company rows** from the official public BCE/KBO register: directors, NACE, VAT, address, phone and website — with an **optional** crawl of the company site for public email, phone and socials.

**No login. No API key. No account on the register.**

Sister Actor to [French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper) — same dual-mode workflow for Belgium.

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| B2B SDR / AE selling into Belgium | Named directors + phone/web before outreach | **Enterprise numbers** from CRM / VAT · website enrich **OFF** first |
| Compliance / KYB analyst | Official status, legal form, VAT flag | Enrich IDs · **Compliance** dataset view · enrich **OFF** |
| Lead-gen / data agency | Name → company list | **Name search** (optional Advanced postal narrow for common names) |
| RevOps / enrichment pipeline | Stable BCE/KBO + BE VAT columns | Bulk VAT list · `maxResults = 0` |
| Outbound needing inbox / socials | Fill gaps when CBE has no email | Same list · **Enrich website contacts = Yes** ($9.99 / 1k) |

**What you get by default (website enrich OFF):** one row per unique enterprise — identity, status, legal form, registered address, phone/email/website **when published in CBE**, directors, primary NACE (VAT 2025), characteristics, KBO URL.

**When to enable website enrichment:** turn **Yes** only if the register lists a website and you need public **email / phone / socials** from that site (bounded crawl, up to 3 pages). Costs more per row — leave **No** for KYB / register-only exports.

### How to use

1. Open the Actor in [Apify Console](https://console.apify.com/actors/yNDEAIBWboaJOyd4b).
2. Keep Mode = **Enterprise numbers** with sample `0202239951` (Proximus), or paste your list / switch to **Name search**.
3. Leave **Enrich contacts from company website = No** for a first run.
4. Click **Start**. Export JSON / CSV / Excel (views: Overview, Outreach / CRM, Compliance).

**Max companies = 0** → no cap (Free plan still capped at **100** rows / run).

### Ready-made examples (published tasks)

| Example | Best for |
|---------|----------|
| [enrich-proximus-bce-kbo](https://apify.com/corent1robert/belgium-bce-kbo-company-enrich/examples/enrich-proximus-bce-kbo) | Flagship Proximus enrich demo |
| [name-search-brussels-companies](https://apify.com/corent1robert/belgium-bce-kbo-company-enrich/examples/name-search-brussels-companies) | Name search sample (Brussels postal narrow) |
| [active-belgian-sme-name-sample](https://apify.com/corent1robert/belgium-bce-kbo-company-enrich/examples/active-belgian-sme-name-sample) | Active-only SME name sample |
| [bulk-be-vat-list-enrich](https://apify.com/corent1robert/belgium-bce-kbo-company-enrich/examples/bulk-be-vat-list-enrich) | Bulk BE VAT / BCE list |

### What it extracts

| Category | Fields |
|----------|--------|
| Identity | `enterprise_number`, `enterprise_number_formatted`, `vat_number`, `name`, `status`, `legal_situation`, `start_date` |
| Contacts (register) | `address`, `phone`, `email`, `website` |
| Legal / activity | `entity_type`, `legal_form`, `establishment_units`, `nace_codes[]`, `nace_primary`, `nace_primary_label`, `characteristics`, `subject_to_vat` |
| Directors | `directors[]`, `director_count`, `director_1`, `director_1_role` |
| Website enrich (when ON) | `email_from_website`, `phone_from_website`, `emails_from_website[]`, `socials`, `website_pages_crawled` — also fills empty `email` / `phone` when found |
| Provenance | `kbo_url`, `language`, `source` |

### How much does it cost?

**HTTP-only** public register (default **512 MB**). Enrichment runs with **bounded concurrency** (about 4 parallel lookups, polite pacing) so bulk lists finish faster without flooding the register. Optional website crawl adds a few GETs per company — no residential proxy required.

Pay-per-event (Store study 2026-08-17 vs BE comps: regdata Free **$8 / 1k**, neuralverge **~$5 / 1k**, website-only qualifyops **$4 / 1k**, Maps place→enriched uplift **+$3**):

| Event | When | Free | Bronze | Silver | Gold |
|-------|------|------|--------|--------|------|
| **Company — register only** (`company-basic`) | Website enrich **No** | **$5.99 / 1k** | $4.99 | $4.49 | $3.99 |
| **Company — register + website** (`company-with-website`) | Website enrich **Yes** | **$9.99 / 1k** | $8.99 | $7.99 | $6.99 |
| Actor start | Per run | $0.05 / GB | same | same | same |

**Not-found or invalid numbers are logged only and are never billed.**

Scenarios (Free, PPE only, excl. start):

| Run | Approx. cost |
|-----|----------------|
| 50 companies, enrich OFF | ~$0.30 |
| 1,000 companies, enrich OFF | **$5.99** |
| 1,000 companies, enrich ON | **$9.99** |

Title shows the base price **| $5.99 / 1k**; enrichment is opt-in at $9.99.

### Is it legal to use the BCE/KBO public search?

This Actor reads the **official public CBE search** ([kbopub.economie.fgov.be](https://kbopub.economie.fgov.be)) — the same register businesses and citizens can open in a browser. No login, no private API key. Optional website enrichment only collects **publicly linked** emails, phones and social URLs from the company site. As with any personal / business data, ensure your use complies with GDPR and Belgian marketing rules (legitimate interest, B2B outreach, opt-out).

### Input

#### Mode A — Enterprise numbers (default)

```json
{
  "mode": "enterpriseNumbers",
  "enterpriseNumbers": ["0202239951", "BE0202239951"],
  "maxResults": 25,
  "language": "en",
  "enrichWebsiteContacts": "no"
}
```

#### Mode B — Name search

```json
{
  "mode": "nameSearch",
  "searchName": "Proximus",
  "postalCode": "1030",
  "activeOnly": true,
  "maxResults": 25,
  "language": "en",
  "enrichWebsiteContacts": "no"
}
```

| Parameter | Description |
|-----------|-------------|
| `mode` | `enterpriseNumbers` or `nameSearch` |
| `enterpriseNumbers` | List of IDs / BE VAT |
| `searchName` | Company name query |
| `postalCode` | Optional local 4-digit filter on hit address text (not a KBO query param) |
| `activeOnly` | Prefer active entities in name search |
| `includeEstablishments` | Include EU hits (still deduped by enterprise) |
| `maxResults` | Cap enriched companies (`0` = no cap) |
| `language` | `en` / `fr` / `nl` / `de` |
| `enrichWebsiteContacts` | `no` (default) or `yes` — see pricing |

Console has **no Delay / Proxy** fields — pacing is internal.

### Output example

```json
{
  "enterprise_number": "0202239951",
  "enterprise_number_formatted": "0202.239.951",
  "vat_number": "BE0202239951",
  "name": "PROXIMUS",
  "status": "Active",
  "legal_situation": "Normal situation",
  "address": "Boulevard du Roi Albert II 27 1030 Schaerbeek",
  "phone": "022024111",
  "website": "http://www.proximus.com",
  "legal_form": "Public limited company",
  "director_1": "Attout, Emmanuèle",
  "director_1_role": "Director",
  "nace_primary": "61.100",
  "nace_primary_label": "Wired, wireless, and satellite telecommunication activities",
  "subject_to_vat": true,
  "email_from_website": null,
  "phone_from_website": null,
  "socials": {},
  "source": "kbopub.economie.fgov.be"
}
```

*(Website fields populate when `enrichWebsiteContacts` is `yes` and the site publishes contacts.)*

### Local development

```bash
npm install
npm test
apify run --purge
```

### Support

Questions or custom Belgium enrichment workflows: **corentin@outreacher.fr**

# Actor input Schema

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

**Enterprise numbers** — paste BCE/KBO IDs (10 digits, dotted, or BE VAT).

**Name search** — company name, then enrich each unique hit.

## `enterpriseNumbers` (type: `array`):

One BCE/KBO number per line (e.g. `0202239951`, `0202.239.951`, or `BE0202239951`). **Required** in Enterprise numbers mode.

## `searchName` (type: `string`):

Name (or part of name) to search. **Required** in Name search. **Ignored** in Enterprise numbers mode — leave empty.

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

Cap how many companies to enrich. Default **25** = quick preview. Set **0** for no cap (longer runs — raise timeout if needed).

## `enrichWebsiteContacts` (type: `string`):

**No (default):** register data only — **$5.99 / 1k** Free.

**Yes:** when the register lists a website, visit it (up to 3 pages) for public email, phone and social links — **$9.99 / 1k** Free.

## `activeOnly` (type: `boolean`):

Prefer **active** entities in Name search (official register filter). **Ignored** in Enterprise numbers mode.

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

Optional Belgian 4-digit code (e.g. `1000`). **Local filter** on the address text of name-search hits — not an official KBO query. Useful for common names; skips hits with no visible postal. **Ignored** in Enterprise numbers mode.

## `includeEstablishments` (type: `boolean`):

Also match local sites (établissement / vestiging), not only the head office. Unique enterprise numbers are still enriched once. **Ignored** in Enterprise numbers mode.

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

Labels wording only (EN/FR/NL/DE). **Company data is the same** — leave English unless you prefer another language.

## Actor input object example

```json
{
  "mode": "enterpriseNumbers",
  "enterpriseNumbers": [
    "0202239951"
  ],
  "maxResults": 25,
  "enrichWebsiteContacts": "no",
  "activeOnly": true,
  "includeEstablishments": true,
  "language": "en"
}
```

# Actor output Schema

## `overview` (type: `string`):

Name, BCE/KBO, VAT, status, contacts

## `outreachCrm` (type: `string`):

Director-first CRM view

## `compliance` (type: `string`):

Legal status and NACE

## `dataset` (type: `string`):

All rows

## `output` (type: `string`):

No description

## `runLog` (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 = {
    "mode": "enterpriseNumbers",
    "enterpriseNumbers": [
        "0202239951"
    ],
    "maxResults": 25,
    "enrichWebsiteContacts": "no",
    "activeOnly": true,
    "includeEstablishments": true,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/belgium-bce-kbo-company-enrich").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 = {
    "mode": "enterpriseNumbers",
    "enterpriseNumbers": ["0202239951"],
    "maxResults": 25,
    "enrichWebsiteContacts": "no",
    "activeOnly": True,
    "includeEstablishments": True,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/belgium-bce-kbo-company-enrich").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 '{
  "mode": "enterpriseNumbers",
  "enterpriseNumbers": [
    "0202239951"
  ],
  "maxResults": 25,
  "enrichWebsiteContacts": "no",
  "activeOnly": true,
  "includeEstablishments": true,
  "language": "en"
}' |
apify call corent1robert/belgium-bce-kbo-company-enrich --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/belgium-bce-kbo-company-enrich"
        }
    }
}

```

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/yNDEAIBWboaJOyd4b/builds/reT8J2dYoIs5L0HwT/openapi.json
