# Europages Scraper — European B2B Suppliers & Contacts (`tortuga/europages-scraper`) Actor

Scrape Europages B2B supplier listings by keyword, sector or country: company name, address, website, phone, business type, employees, founding year, products and keywords. Lead lists.

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

## Pricing

from $3.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

Scrape Europages company listings by keyword, sector or country: company name, country, city, address, website, phone, business type (manufacturer, distributor, wholesaler, service provider), employees, founding year, delivery area, verified badge, matching products and keywords. Build European B2B supplier, manufacturer and distributor lead lists in minutes.

Type a few search terms (`packaging`, `cnc machining`, `olive oil`), optionally pick supplier countries and business types, and the Actor walks the Europages search results page by page (30 companies each) and saves one clean record per company. Every listing record already carries the full company description, street address, website and switchboard phone. Turn on **Open each company profile** to add activity keywords, product categories, the product catalogue with images, certifications, payment methods, incoterms, VAT number, PDF catalogues and videos.

Works on all 20 language editions (europages.co.uk, .de, .fr, .es, .it, .nl, .pt, .pl, ...). No login, no browser. With profile visits you also get the named contact persons a profile displays (name and department). Export as JSON, CSV or Excel, or pull the dataset through the API into Google Sheets, a CRM or an LLM pipeline. You pay only for the companies you get.

See also: [Clutch Scraper](https://apify.com/tortuga/clutch-scraper) for agency and service-provider leads with rates and verified reviews.

### What data does Europages Scraper extract?

Every company record (search listings, charged as `result`):

| Field | Description |
|---|---|
| `id`, `uuid`, `epId`, `slug` | Europages company ids and URL slug |
| `name` | Company name |
| `profileUrl` | Europages profile URL (on the chosen domain) |
| `website` | The company's own website as published on Europages (direct link, no tracking redirect) |
| `country`, `countryName`, `city` | ISO country code, English country name and city |
| `address` | `{street, postalCode, city, country}` |
| `location` | `{latitude, longitude}` |
| `businessType`, `supplierTypes` | Business types as labels (`Manufacturer/Producer`, `Distributor`, `Wholesaler`, `Service provider`, `Customer-specific manufacturer`) and as raw keys |
| `deliveryArea`, `deliveryAreaLabel` | Delivery area: `international` (Worldwide), `europe`, `national`, `regional`, `local` |
| `description` | Full company description (in the language of the chosen domain) |
| `employeesRange`, `employeesMin`, `employeesMax` | Employee band such as `50-99` plus parsed numbers |
| `foundedYear` | Founding year |
| `isVerified` | Europages "Verified" badge |
| `certificatesCount`, `productsCount` | Number of certifications and of products in the catalogue |
| `products` | Up to 5 products matching the search: `{id, name, url, imageUrl, description, keywords}` |
| `productKeywords` | Keywords of those products (a quick view of what the company sells) |
| `phone` | Company switchboard number published on the listing |
| `responseRate`, `averageResponseTime` | Responsiveness to Europages contact requests, when shown |
| `logoUrl` | Logo image |
| `rank`, `page`, `searchTerm`, `sourceUrl`, `scrapedAt` | Position in the search results, the search term and listing page it came from, timestamp |

With **Open each company profile** (charged as `detail`, one extra request per company):

| Field | Description |
|---|---|
| `keywords` | The company's activity keywords (typically 10-30 terms) |
| `mainBusinessArea`, `productCategories` | Main business area and product category names |
| `products` | Up to 16 catalogue products with `{id, name, url, imageUrl, description, sellPoints, minimumOrderQuantity, price}` |
| `certifications` | Certification names, e.g. `ISO 9001:2015` |
| `paymentMethods`, `paymentTerms`, `incoterms` | Accepted payment methods and terms, supported incoterms |
| `vatNumber`, `fax` | VAT id and fax number when the company publishes them |
| `documents`, `videos`, `pictures` | PDF catalogues, YouTube videos and company photos |
| `contentLanguage`, `canBeContacted` | Language of the profile content, whether the contact form is enabled |
| `contactPersons` | Named contact persons listed in the profile's "Contacts" block: `[{name, department}]`, e.g. a person's full name with `"department": "Marketing"` (department label in the domain's language). `[]` when the profile lists none or only "N/A" placeholders |

`contactPersons` contains only what the profile page displays. A contact person's direct phone number is shown only after clicking their name, so it is not collected (the company switchboard number is in `phone`). Europages does not publish e-mail addresses (contact goes through its form), so there are none to collect. Contact persons are on profile pages only, so listing-only runs do not have this field.

### How to use Europages Scraper

1. Enter one or more **Search terms** (products, services or sectors), or paste Europages search pages or company profile URLs into **Start URLs**.
2. Optionally restrict **Supplier countries** (ISO codes such as `DE`, `FR`, `IT`), **Supplier types** and **Verified companies only**.
3. Set **Max companies** to cap the run and the cost. Turn on **Open each company profile** if you need keywords, certifications, the product catalogue or VAT numbers.
4. Click **Start**. Results appear in the **Dataset** tab; export from there or use the API.

### Input example

```json
{
  "searchTerms": ["packaging", "injection moulding"],
  "countries": ["DE", "PL", "IT"],
  "supplierTypes": ["production"],
  "maxItems": 500,
  "maxPagesPerSearch": 20,
  "includeDetails": true,
  "domain": "europages.co.uk"
}
```

### Output example

```json
{
  "type": "company",
  "id": "22159521",
  "epId": "00000005424124-761159001",
  "name": "ALYA PACKAGING",
  "profileUrl": "https://www.europages.co.uk/ALYA-PACKAGING/00000005424124-761159001.html",
  "website": "https://alyapackaging.com/",
  "country": "TR",
  "countryName": "Turkey",
  "city": "Istanbul",
  "address": { "street": "Vizyon Park 5.plaza no:508 29ekim cd.", "postalCode": "34197", "city": "Istanbul", "country": "TR" },
  "location": { "latitude": 41.0031073, "longitude": 28.8196995 },
  "businessType": ["Manufacturer/Producer"],
  "deliveryArea": "international",
  "deliveryAreaLabel": "Worldwide",
  "description": "Alya Packaging, based in Istanbul, brings over 30 years of expertise to custom printed packaging solutions. ...",
  "employeesRange": "50-99",
  "employeesMin": 50,
  "employeesMax": 99,
  "foundedYear": null,
  "isVerified": true,
  "certificatesCount": 0,
  "productsCount": 53,
  "products": [
    { "id": "35372297", "name": "Printed Apparel – Shirt Boxes - Custom Printed Packaging Boxes", "url": "https://www.europages.co.uk/en/company/alya-packaging-22159521/products/printed-apparel-shirt-boxes-custom-printed-packaging-boxes-35372297", "imageUrl": "https://supplier-offers-media-production.s3.eu-central-1.amazonaws.com/f15fb7cb-6caa-11ef-9b66-0a58a9feac02.jpeg", "keywords": ["Boxes, cardboard", "Shirt Boxes", "clothing packaging"] }
  ],
  "productKeywords": ["Boxes, cardboard", "Shirt Boxes", "clothing packaging", "Bottle Boxes", "bakery packaging"],
  "phone": "+902126032466",
  "logoUrl": "https://wlw-1-company-facts-media20191122174836234900000006.s3.eu-central-1.amazonaws.com/e955c550-df29-4906-a264-f55fa4376aa1.gif",
  "rank": 1,
  "page": 1,
  "searchTerm": "packaging",
  "sourceUrl": "https://www.europages.co.uk/companies/packaging.html",
  "scrapedAt": "2026-10-02T17:00:00Z",
  "keywords": ["BOXES FOR PERFUMES AND COSMETIC PRODUCTS", "Cardboard box and packaging", "Custom gift boxes"],
  "mainBusinessArea": "Packaging material",
  "productCategories": ["Bags & Pouches (Other)", "Bottle Packaging", "Boxes", "Gift Boxes"],
  "certifications": [],
  "paymentMethods": ["swift_transfer"],
  "incoterms": ["cost_and_freight", "cost_insurance_and_freight", "ex_works", "FOB"],
  "vatNumber": null,
  "contactPersons": [],
  "documents": [{ "title": "FSC certificate of registration", "url": "https://wlw-1-company-facts-media20191122174836234900000006.s3.eu-central-1.amazonaws.com/c2ecd2c4-5b65-47d1-9c12-4f81a292a3b8.pdf", "mimeType": "application/pdf" }],
  "videos": [{ "title": "ALYA PACKAGING PRODUCTION", "url": "https://www.youtube.com/watch?v=cMotIAiQ15E", "kind": "youtube" }]
}
```

### How to scrape Europages suppliers by country or sector

Every search term becomes a Europages company search. Use **Supplier countries** to keep only companies based in given countries (`DE`, `FR`, `IT`, `ES`, `PL`, `TR`, `GB`, ...), **Supplier types** to keep manufacturers, distributors, wholesalers or service providers, and **Verified companies only** for checked profiles. Sector pages copied from the site work as well, for example `https://www.europages.co.uk/companies/germany/packaging.html` or a filtered URL such as `https://www.europages.co.uk/companies/packaging.html?countries=AT_CH&supplierTypes=production`.

Europages shows at most 100 pages (3,000 companies) per search. To export a bigger sector, run the same term once per country or split it into narrower terms; the Actor deduplicates companies by id within a run.

### How to get supplier websites and phone numbers from Europages

The listing data Europages serves already contains each company's own website and switchboard phone number, so a listing-only run (no profile visits) gives you `website` and `phone` for most companies at the lowest price. E-mail addresses are not published on Europages (contact goes through its form), so there are none to collect. Turn on **Open each company profile** to also get the named contact persons a profile lists (`contactPersons`: name and department); their direct numbers are only revealed by a click on the site and are not collected.

### Does it work in other languages (europages.de, europages.fr, ...)?

Yes. Pick the **Europages domain**: the company data is the same, but descriptions, business-type labels and product names come in that language and `profileUrl` points to that domain. Search terms in the domain's language give the best results (`verpackung` on europages.de, `emballage` on europages.fr); English terms work everywhere.

### Does it work without login or proxies?

Yes. Europages pages are public and server-rendered, so no login or browser is needed. Apify Proxy is on by default for reliability; Europages uses an AWS WAF that challenges IPs after a burst of requests, so for long runs keep the proxy on and switch to residential proxies if the run summary reports `challenges`.

### Pricing

Pay per company: a `result` event for every company saved from a search listing (or profile URL), plus a `detail` event for every company whose profile page was opened. No subscription; Apify's free plan is enough to try it.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets.

### Is it legal to scrape Europages?

This Actor collects only data Europages shows publicly to signed-out visitors: company names, addresses, websites, switchboard numbers, products and activities, and, with profile visits, the names and departments of the contact persons a company lists on its profile. It does not collect anything behind a login, click-to-reveal numbers (such as a contact person's direct line), portraits or e-mail addresses (Europages does not publish them). Contact person names are personal data under GDPR and similar laws: make sure you have a lawful basis for processing them (for B2B outreach typically legitimate interest, with the information and opt-out duties that come with it). You are responsible for how you use the data and for complying with Europages' terms and applicable law, including GDPR/CCPA.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords, products or sectors to search companies for, one per line (e.g. packaging, cnc machining, olive oil, injection moulding). Each term becomes a Europages company search (30 companies per page, up to 100 pages = 3,000 companies). Use the filters below to narrow it down; split big searches by country to go past 3,000.

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

Europages pages to scrape instead of (or in addition to) search terms: company search pages copied from the site, with or without filters and page (https://www.europages.co.uk/companies/germany/packaging.html, https://www.europages.de/unternehmen/pg-2/verpackung.html?countries=AT_CH), or company profile pages (https://www.europages.co.uk/en/company/printmasta-20041825). Search pages are paginated automatically; the filters below are not applied to start URLs.

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

Optional ISO 3166 country codes to keep only suppliers based there, e.g. DE, FR, IT, ES, PL, TR, GB. Applied to the search terms (it is the site's own country filter, so the 3,000-company cap applies per country).

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

Optional business-type filter for the search terms: production (manufacturer/producer), distribution (distributor), wholesaler, service (service provider), customer_specific_manufacturing (customer-specific manufacturer).

## `verifiedOnly` (type: `boolean`):

Keep only companies with the Europages 'Verified' badge (paying members with a checked profile). Applied to the search terms.

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

Stop after this many companies (across all search terms and start URLs). Keeps cost predictable.

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

Listing pages to read per search term or start URL (30 companies each). Europages serves at most 100 pages per search.

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

Fetch every company's profile page for the full record: activity keywords, main business area, product categories, up to 16 products with images, certifications, payment methods and terms, incoterms, VAT number and fax when published, catalogues (PDF), videos and photos. One extra request per company, charged as a `detail` event. Company name, description, address, website, phone, business type, employees, founding year and delivery area are already in the listing data.

## `domain` (type: `string`):

Which language edition to search. Company data is the same everywhere; descriptions, business-type labels and product names come translated in that language, and profile URLs point to that domain. Search terms should be in the domain's language for best results (the site's search is multilingual, English terms work everywhere).

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

Apify Proxy is recommended for reliability on long runs. Europages serves plain HTTP pages; if runs report anti-bot challenges in the SUMMARY (AWS WAF can challenge some datacenter ranges), switch to residential proxies.

## Actor input object example

```json
{
  "searchTerms": [
    "packaging"
  ],
  "verifiedOnly": false,
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "includeDetails": false,
  "domain": "europages.co.uk",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchTerms": [
        "packaging"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/europages-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 = {
    "searchTerms": ["packaging"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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