# Europages Scraper - B2B Leads, Phone, Website, VAT ID (`santis_hermes/europages-b2b-company-scraper`) Actor

Build European B2B supplier and lead lists from Europages by keyword and country: company name, address, phone, website, employee range, founding year, certificates, products and VAT ID. Only-new mode for scheduled runs.

- **URL**: https://apify.com/santis_hermes/europages-b2b-company-scraper.md
- **Developed by:** [Santi](https://apify.com/santis_hermes) (community)
- **Categories:** Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 companies

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

## Europages Scraper: B2B company leads with phone, website, size and VAT ID

Scrape the **Europages B2B supplier directory** by keyword and country to build European company lists: company name, address, phone, website, employee range, founding year, supplier type, certificates, products and VAT ID. Export to CSV, JSON or Excel, or call it from the API.

Use it for **B2B lead generation, supplier sourcing, manufacturer and wholesaler lists, and market mapping** across Germany, France, Italy, Spain, Poland, the Netherlands, the UK and more. Filter by supplier type, minimum employees, founding year and "has website", and run with only-new mode on a schedule. Works with AI agents through the Apify MCP server.

### Why this one

- **Filter by what you need**: keyword, supplier country (several at once), supplier type, minimum employees, founded after/before, only companies with a website. You only pay for companies that match.
- **Phone and website on the search results already** (97% of rows in our test), so a cheap run gives you a callable list.
- **Company pages optional**: VAT ID, main business area, certificates, catalogue PDF, pictures, product categories and top products.
- **Only-new mode** for scheduled runs: companies you already received are skipped and not charged.
- **No silent empty runs.** If Europages blocks the run before any data arrives, the run FAILS with the reason and charges nothing.
- **Hard spending cap**: `maxItems` is exact.

### Be aware of the directory's own limit

Europages serves roughly **50-130 companies per keyword** (for example 127 for "software", 110 for "packaging", 52 for "machinery" in our test), not every company in its database. For big lists use several specific keywords and several countries; each keyword + country search is a separate result set, and duplicates across searches are dropped only inside one search URL, so dedupe by `id` afterwards.

### Input (main fields)

| Field | Meaning |
|---|---|
| Keywords | What the companies do; one search per keyword |
| Europages search URLs | Alternative: paste a europages `/en/search/<keyword>.html` page |
| Supplier countries | `DE`, `FR`, `IT` ... several allowed (applied by Europages) |
| Supplier types | Production, Customer-specific manufacturing, Distribution, Service, Wholesaler (applied by Europages) |
| Min employees, Founded after / before, Only with website | Checked by the actor on each row |
| Fetch each company page | Adds VAT ID, business area, certificates, catalogue, pictures, categories, top products |
| Include named contacts | Off by default; people listed on the company page (personal data) |
| Only companies not seen before | Remembers IDs between runs |
| Max companies | Hard stop (default 50) |

### Output (one row per company)

`id, name, url, description, country, city, street, zipCode, latitude, longitude, phone, website, employeeRange, foundingYear, supplierTypes, distributionArea, productCount, certificatesCount, responseRate, averageResponseTime, isPaidProfile, logoUrl, searchUrl, scrapedAt` and, with company pages on: `vatId, mainBusinessArea, addressLines, certificates, catalogUrl, videos, pictures, categories, topProducts` (+ `contacts` if switched on). Email addresses are not published by Europages and are not returned.

See `sample-output.json` for real rows.

### Output example

Three real rows from a run of this Actor (columns trimmed; each row has many more fields, see Output above):

| Company | City | Country | Phone | Website | Employees | Founded |
|---|---|---|---|---|---|---|
| VKF Renzel GmbH | Isselburg | DE | +4928749100 | https://www.vkf-renzel.de/ | 500-999 | 1985 |
| Günthart & Co. KG | Hohentengen | DE | +4977428590 | https://www.guenthart.com/ | 200-499 | 1946 |
| Hutt-Verpackungen | Lorch | DE | +4971729169175 | http://www.hutt-verpackungen.de/ | 1-4 | 2008 |

### Pricing

Pay per event: **$0.004 per company**, plus **$0.003 per company page** if enabled. 1,000 companies = $4.00; with company pages = $7.00. See PRICING.md.

### Notes and limits

- Only publicly visible company data is collected; no logins. Business phone numbers and VAT IDs are company data; named contact persons are personal data under GDPR and are off by default. Use the data in line with Europages' terms and EU data-protection and direct-marketing law (B2B cold-calling and emailing rules differ by country).
- The size filter uses the lower end of the range Europages shows (50-99 counts as 50).

### FAQ

**How much does it cost?** Pay per event: $0.004 per company, plus $0.003 per company detail page (adds VAT ID, certificates, catalogue) if you switch details on, plus a $0.00005 start event per run (per GB of memory). 1,000 companys = $4.00 before details. You are not charged for items skipped by filters or only-new mode, duplicates, or anything past your max-items limit. Prices are on the Pricing tab and in PRICING.md.

**Is there a limit on results?** `maxItems` is a hard cap you set per run (default 50). Runs also stop at the paging limit in the input (`maxPagesPerSearch`). The source site may cap how deep its own search goes; see Notes and limits.

**Is it legal?** The Actor collects only publicly visible data from Europages, with no logins. You remain responsible for using the data in line with the site's terms and data-protection law (GDPR/UK GDPR), especially for personal data.

**Do I need proxies?** Not for normal runs: the default input works without one (no proxy is used). For very large runs you can add an Apify proxy or your own proxy URL in the Proxy configuration field; that cost is then yours.

**Can I schedule it?** Yes: use Apify Schedules or the API; a scheduled run with "only new" mode adds only companies you have not seen yet.

**Which export formats are available?** Download the dataset as JSON, CSV, Excel, XML, HTML or RSS from the Console or API, or pull it with the Apify API/clients (Python, JavaScript) and integrations such as Make, Zapier, n8n, Google Sheets.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab with the run link.

### Use with AI agents / MCP

Agents can call this Actor through the [Apify MCP server](https://mcp.apify.com) (`https://mcp.apify.com`). Add the Actor to the server, or let the agent find it with the `search-actors` tool, then call it by name:

- Actor: `santis_hermes/europages-b2b-company-scraper`
- Example prompt: "List 3 German packaging suppliers from Europages with phone and website."
- Minimal input:

```json
{
  "keywords": [
    "packaging"
  ],
  "countries": [
    "DE"
  ],
  "maxItems": 3
}
```

Results come back as dataset items (structured JSON), so an agent can read them directly. Keep `maxItems` small for agent calls to control cost. Docs: https://docs.apify.com/platform/integrations/mcp

### Feedback

If this saved you time, a rating on the Store page helps others find it. If it did not work for you, please open an issue on the Issues tab with the run link and I will look at it.

# Actor input Schema

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

What the companies sell or do. One search per keyword. Europages returns roughly 50-130 companies per keyword, so use several specific keywords (and countries) for large lists.

## `startUrls` (type: `array`):

Pages like https://www.europages.co.uk/en/search/packaging.html (copy from your browser).

## `countries` (type: `array`):

Two-letter codes: DE, FR, IT, ES, PL, NL, BE, GB ... Several allowed. Empty = all countries.

## `supplierTypes` (type: `array`):

Applied by Europages: Production, Customer-specific manufacturing, Distribution, Service, Wholesaler.

## `minEmployees` (type: `integer`):

Checked against the lower end of the company's size range (e.g. 50-99 counts as 50). Companies with no stated size are skipped when this is set.

## `foundedAfter` (type: `integer`):

Keep companies founded in or after this year, e.g. 2015. Companies with no founding year are skipped when set.

## `foundedBefore` (type: `integer`):

Keep companies founded in or before this year, e.g. 2000. Companies with no founding year are skipped when set.

## `onlyWithWebsite` (type: `boolean`):

Tick to keep only companies that list a website.

## `includeDetails` (type: `boolean`):

Adds VAT ID, main business area, certificates, catalogue, pictures, categories and top products. Slower and billed as an extra event.

## `includeNamedContacts` (type: `boolean`):

Names and direct phone numbers of people listed on the company page. These are personal data under GDPR: off by default, use only with a lawful basis.

## `onlyNew` (type: `boolean`):

Skip companies returned in earlier runs (IDs are remembered between runs). Good for scheduled lead-list updates; skipped companies are not charged.

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

Hard stop. You are never charged for more than this.

## `maxPagesPerSearch` (type: `integer`):

30 companies per page.

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

Optional. Apify Proxy or your own proxy URLs. Not needed for most runs.

## `customProxyUrl` (type: `string`):

Optional. Example: http://user:pass@host:port . Overrides the proxy setting above.

## Actor input object example

```json
{
  "keywords": [
    "packaging"
  ],
  "countries": [
    "DE"
  ],
  "onlyWithWebsite": false,
  "includeDetails": false,
  "includeNamedContacts": false,
  "onlyNew": false,
  "maxItems": 50,
  "maxPagesPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped companies as a table with the key columns.

## `results` (type: `string`):

Every scraped companies item with all fields.

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

Counts for the run: items pushed, skipped, charged events, block status.

# 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 = {
    "keywords": [
        "packaging"
    ],
    "countries": [
        "DE"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("santis_hermes/europages-b2b-company-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 = {
    "keywords": ["packaging"],
    "countries": ["DE"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("santis_hermes/europages-b2b-company-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 '{
  "keywords": [
    "packaging"
  ],
  "countries": [
    "DE"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call santis_hermes/europages-b2b-company-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santis_hermes/europages-b2b-company-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/yhK7L6RnrRHeElUUB/builds/fqubYePFcJ2OU69ni/openapi.json
