# Europages Scraper \[$0.50/1K💰] | B2B Supplier Leads (`ahmed_jasarevic/europages-scraper`) Actor

Extract Europages B2B supplier profiles by keyword across 5 country portals. Returns named contacts, direct phone, website, VAT number, employees, certifications, documents and geo-coordinates for ~50 fields per company. Pay per company found.

- **URL**: https://apify.com/ahmed_jasarevic/europages-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 company listings

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/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 Supplier Leads With Contacts, Certificates and VAT Numbers

Extract **Europages B2B supplier profiles** by keyword across five country portals — `.co.uk`, `.fr`, `.de`, `.it` and `.es` — and get back roughly **50 fields per company**: named contacts, direct phone, website, VAT number, employee band, founding year, certifications, documents, geo-coordinates, supplier type and responsiveness signals.

Built for **B2B lead generation**, supplier sourcing, competitor mapping and **CRM enrichment**. One listing event finds the company; the profile event enriches it.

***

### What you get that other Europages scrapers drop

Most Europages scrapers return a name, a city and a URL. The fields that actually decide whether a lead is usable are the ones buried on the profile page — and they are exactly what this Actor returns:

- **`contacts[]`** — the **named** people Europages publishes on the profile, with their phone and role, not just a generic switchboard
- **`vatId`** — the company's VAT registration number, the fastest way to validate a business entity
- **`certificates[]` / `certificatesCount`** — ISO and industry certifications already matched for you
- **`responseRate` / `averageResponseTime` / `quickResponder`** — whether this supplier actually answers
- **`supplierTypes[]`** — manufacturer, distributor, service provider, wholesaler
- **`incoterms[]` / `paymentMethods[]` / `restrictedIn[]` / `distributionArea`** — trade-readiness fields that decide if a supplier can ship to you
- **`latitude` / `longitude`** — real coordinates for map clustering and territory planning
- **`documents[]` / `pictures[]` / `videos[]`** — brochures and catalogues, ready to feed a buying decision

***

### Main use cases

- **B2B lead generation** — keyword to named-contact list, already deduplicated per keyword
- **Supplier sourcing** — filter by supplier type, certifications, employee band and export capability
- **CRM enrichment** — fill in phone, website, VAT ID, employees and founding year on an existing company list
- **Competitor and market mapping** — who serves your product category, where they are based, how big they are
- **Territory and logistics planning** — geo-coordinates plus `incoterms` and `distributionArea`
- **Agency and consultancy research** — find every agency in a niche, then qualify by size and activity
- **Company registry enrichment** — `isActive`, `isEuropagesCustomer` and `canBeContacted` flags for list hygiene
- **Sustainability screening** — `sustainabilityScore` where the company publishes one

***

### Input

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `keywords` | array | no | `["stainless steel"]` | Product/category keywords. Each one becomes a Europages keyword-results page walk. |
| `site` | string | no | `europages.co.uk` | Which portal to scrape: `europages.co.uk`, `.fr`, `.de`, `.it` or `.es`. Coverage and profile URL format differ per portal. |
| `countryFilter` | array | no | `[]` | Restrict to companies located in these countries. Applied **server-side** by Europages, so it costs nothing extra. One listing walk per keyword per country. |
| `maxItems` | integer | no | `200` | Hard cap on company records written (1–5000). |
| `maxListPages` | integer | no | `10` | Listing pages walked per keyword (1–100). Up to 30 companies per page. Europages itself stops serving past page 100. |
| `maxConcurrency` | integer | no | `20` | Parallel requests (1–50). Europages handles 40 concurrent requests without throttling. |
| `maxRequestsPerSecond` | integer | no | `8` | Global rate cap shared by all parallel requests (1–60). Europages rate-limits per IP with an HTTP 405 *Human Verification* ban of minutes; on a block the Actor pauses, probes with a single request and halves the rate until it recovers. |
| `includeDetails` | boolean | no | `true` | `true` fetches every profile page for description, contacts, phone, website, employees, founding year, geo and documents. `false` returns listing data only and is roughly **10× faster**. |
| `startUrls` | array | no | `[]` | Direct listing or company profile URLs, used instead of or in addition to `keywords`. |
| `proxy` | object | no | `useApifyProxy: false` | Standard Apify proxy picker. Not needed for normal runs. |

#### Examples

**Cheapest market sizing** — listing data only, one keyword, two countries:

```json
{
  "keywords": ["cnc machining"],
  "countryFilter": ["Germany", "Italy"],
  "includeDetails": false,
  "maxListPages": 5,
  "maxItems": 300
}
```

**Full lead-gen run** — profile pages, contacts and VAT IDs:

```json
{
  "keywords": ["stainless steel", "aluminium extrusion"],
  "site": "europages.co.uk",
  "countryFilter": ["United Kingdom"],
  "includeDetails": true,
  "maxListPages": 10,
  "maxItems": 500,
  "maxConcurrency": 25
}
```

**German portal, services niche, enrichment off for speed:**

```json
{
  "keywords": ["marketing agency"],
  "site": "europages.de",
  "includeDetails": false,
  "maxItems": 1000,
  "maxConcurrency": 40
}
```

**Enrich a list you already have** — paste profile URLs directly:

```json
{
  "keywords": [],
  "startUrls": [
    "https://www.europages.co.uk/company/Acme-Steel-Ltd-123456.html",
    "https://www.europages.co.uk/company/Beta-Metals-654321.html"
  ],
  "includeDetails": true
}
```

***

### Output

One flat dataset — one row per company. The **Overview** view gives you logo, company, business area, city, country, employees, founded, phone, website, customer flag and profile link.

#### Core identity and location

| Field | Description |
|---|---|
| `name` / `acronym` | Company name and short form |
| `europagesId` / `companyId` / `uuid` | Stable Europages and registry identifiers — use these as join keys |
| `url` / `profileUrl` / `catalogUrl` | Listing URL, profile page URL, product catalogue URL |
| `city` / `region` / `country` / `address` / `postalCode` | Postal location |
| `latitude` / `longitude` | Numeric coordinates for mapping and territory work |
| `logoUrl` | Company logo |

#### Classification

| Field | Description |
|---|---|
| `mainBusinessArea` | What the company does, in Europages' own words |
| `categories[]` / `productCategories[]` | Classified categories and product categories |
| `supplierTypes[]` | Manufacturer, distributor, service provider, wholesaler |
| `keywords[]` | The search keyword that found this company — lets you group a merged dataset back by intent |

#### Qualification

| Field | Description |
|---|---|
| `description` | Full company description |
| `employees` | Employee band as a string (e.g. `10-49`) |
| `foundingYear` | Year founded |
| `vatId` | VAT registration number |
| `sustainabilityScore` | Sustainability score where published |
| `paymentMethods[]` / `incoterms[]` | Accepted payment methods, Incoterms offered |
| `restrictedIn[]` / `distributionArea` | Export restrictions and distribution coverage |

#### Contacts

| Field | Description |
|---|---|
| `phone` / `fax` | Main phone and fax |
| `website` | Company website |
| `contacts[]` | **Named** people published on the profile: `name`, `phone`, `role` |

#### Trust and activity signals

| Field | Description |
|---|---|
| `certificates[]` / `certificatesCount` | Certifications listed on the profile |
| `documents[]` | Brochures and catalogues: `url`, `title`, `filename`, `mimeType` |
| `pictures[]` / `videos[]` | Profile media: `url`/`title` and `videoId`/`kind`/`title` |
| `referencesCount` | Number of customer references — a strong activity signal |
| `responseRate` / `averageResponseTime` / `quickResponder` | Whether the supplier answers enquiries |
| `isActive` / `isEuropagesCustomer` / `canBeContacted` | Listing hygiene flags |

#### Provenance

| Field | Description |
|---|---|
| `site` / `keyword` | Which portal and which keyword produced this row |
| `detailScraped` | `true` when the profile page was fetched and fully enriched, `false` when only listing data was available |
| `scrapedAt` | ISO timestamp |

#### The two flags that matter most

- **`detailScraped`** — a `false` row means the profile page was blocked, errored or unreachable, and you have listing data only. Filter on `detailScraped == true` before treating a row as a complete lead.
- **`keyword`** — the same company can appear under several keywords in one run. Deduplicate on `europagesId` and use `keyword` to see which intent surfaced it.

#### Example output

```json
{
  "url": "https://www.europages.co.uk/company/Acme-Steel-Ltd-123456.html",
  "profileUrl": "https://www.europages.co.uk/company/Acme-Steel-Ltd-123456.html",
  "name": "Acme Steel Ltd",
  "acronym": "ASL",
  "europagesId": "123456",
  "companyId": 123456,
  "description": "Acme Steel Ltd manufactures cold drawn and hot rolled steel sections...",
  "phone": "+44 161 555 0142",
  "website": "https://www.acmesteel.co.uk",
  "city": "Manchester",
  "country": "United Kingdom",
  "address": "12 Ducie Street, Manchester, M1 2JW",
  "postalCode": "M1 2JW",
  "latitude": 53.4808,
  "longitude": -2.2344,
  "employees": "50-99",
  "foundingYear": "1987",
  "vatId": "GB123456789",
  "mainBusinessArea": "Steel and stainless steel",
  "categories": ["Metalworking", "Steel"],
  "productCategories": ["Steel profiles", "Stainless steel bars"],
  "supplierTypes": ["Manufacturer", "Distributor"],
  "certificates": ["ISO 9001", "EN 10088"],
  "certificatesCount": 2,
  "contacts": [
    { "name": "R. Whitfield", "phone": "+44 161 555 0142", "role": "Sales Director" },
    { "name": "K. Ahmed", "phone": null, "role": "Export Office" }
  ],
  "documents": [
    {
      "url": "https://www.europages.co.uk/companiesdocs/123456/catalogue.pdf",
      "title": "Product catalogue",
      "filename": "catalogue.pdf",
      "mimeType": "application/pdf"
    }
  ],
  "incoterms": ["EXW", "FOB", "CIF"],
  "paymentMethods": ["Credit Card", "Bank Transfer"],
  "referencesCount": 4,
  "responseRate": "Very responsive",
  "averageResponseTime": "Less than 24 hours",
  "quickResponder": true,
  "isEuropagesCustomer": true,
  "isActive": true,
  "canBeContacted": true,
  "logoUrl": "https://cdn.europages.com/logos/123456.png",
  "site": "europages.co.uk",
  "keyword": "stainless steel",
  "detailScraped": true,
  "scrapedAt": "2026-09-30T09:14:22.000Z"
}
```

#### Cheaper listing-only row

With `includeDetails: false` you get the light shape — everything needed for market sizing and list building, at 10× the speed:

```json
{
  "url": "https://www.europages.co.uk/company/Beta-Metals-654321.html",
  "name": "Beta Metals",
  "city": "Birmingham",
  "country": "United Kingdom",
  "employees": "10-49",
  "site": "europages.co.uk",
  "keyword": "aluminium extrusion",
  "detailScraped": false,
  "scrapedAt": "2026-09-30T09:12:04.000Z"
}
```

***

### Monitor supplier activity on a schedule

Europages listings are not a one-shot scrape — suppliers change certifications, add contacts and go quiet. Recurring runs turn the dataset into a monitoring feed:

- **Weekly** — same keywords and countries; diff `certificates[]` and `referencesCount` to spot suppliers who are growing
- **Monthly** — refresh contacts and `vatId` before a campaign; businesses re-key frequently
- **Quarterly** — re-run market-sizing passes with `includeDetails: false` to measure how saturated a niche has become
- **New-supplier alerts** — schedule the same keyword weekly and keep only rows with no `europagesId` from the previous run
- **Wire into your stack** — Apify webhooks, Zapier, Make, HubSpot, Salesforce and 100+ integrations fire on run completion; the dataset exports as JSON, CSV, Excel, XML, HTML or RSS

Keep the two modes on separate schedules: `includeDetails: false` for cheap weekly market sizing, `true` only when you are about to work the leads.

***

### Related Actors

- [Kompass Scraper](https://apify.com/ahmed_jasarevic/kompass-scraper) (`ahmed_jasarevic/kompass-scraper`) — the closest alternative B2B directory, useful for cross-checking a supplier list
- [Clutch.co Scraper](https://apify.com/ahmed_jasarevic/clutch-agency-scraper) (`ahmed_jasarevic/clutch-agency-scraper`) — agency and services B2B leads with reviews and deep profiles
- [Thomasnet Scraper](https://apify.com/ahmed_jasarevic/thomasnet-scraper) (`ahmed_jasarevic/thomasnet-scraper`) — North American industrial supplier data
- [Europages Scraper by saswave](https://apify.com/saswave/europages-scraper) (`saswave/europages-scraper`) — the most-used Europages Actor on the Store, thinner field set
- [Europages Business Directory Scraper by easyapi](https://apify.com/easyapi/europages-business-directory-scraper) (`easyapi/europages-business-directory-scraper`) — directory-style extraction for quick lists

***

### FAQ

#### Why not just crawl Europages myself?

You can, but you will hit three problems this Actor already handles. Europages serves **30 companies per listing page** and stops past page 100, so long tails need pagination. Profile pages carry the fields that matter, so a listing-only crawl leaves you with names and URLs. And a single run across multiple keywords hits exactly the request volume where you need session handling and concurrency tuning.

#### Why is `includeDetails` worth the extra cost?

Because `detailScraped: true` is the difference between a lead and a name. The profile event unlocks `contacts[]` (named people with direct phones), `vatId`, `website`, `certificates[]`, `documents[]`, `employees`, `foundingYear` and `latitude`/`longitude`. Turn it on when you are about to contact someone. Turn it off when you are counting the market.

#### Why do I get the same company more than once?

Because one run can walk several keywords, and the same supplier legitimately ranks for several. Deduplicate on **`europagesId`** (fall back to `uuid`, then `profileUrl`). The `keyword` field tells you which intent surfaced each appearance, which is useful signal on its own.

#### What is the difference between the five country portals?

Coverage and profile URL format differ by portal. `europages.co.uk` skews to UK and international suppliers listed for the UK, `.de` and `.fr` carry deeper DACH and Francophone coverage, `.it` and `.es` cover their home markets. Pick the portal that matches your buyer, and use `countryFilter` for the rest.

#### How do I target specific countries without losing the others?

Use `countryFilter`. It is applied **server-side** by Europages, so a country-restricted run returns exactly the companies in that country and nothing is wasted on filtering afterwards. One listing walk runs per keyword per country.

#### What happens if Europages blocks a request?

Europages rate-limits **per IP** on a leaky-bucket basis: traffic fills the bucket, it drains slowly, and an overflow buys an HTTP 405 *Human Verification* ban lasting minutes (the exact same profile URLs answer 200 from an unthrottled IP, so it is never about the page itself).

The Actor defends itself three ways:

1. **Pacing** — every request passes a global rate cap (`maxRequestsPerSecond`, default 8) with jitter, so a run cannot burst into the limiter.
2. **Circuit breaker** — on a 405 the whole run pauses 20 s, doubling per failed probe up to 2 min, and while recovering only a **single** probe request is released at a time. Crawlee's own retry is immediate, so without this one block cascades into hundreds of refetches. A success closes the breaker and the rate is restored gradually.
3. **No lost leads** — a profile that never gets served after all retries still produces a row from its listing data (`detailScraped: false`), billed as `company-listing` only.

If 405s keep appearing, drop `maxRequestsPerSecond` to 4–5, or enable the `proxy` input — rotating IPs is the only defence that raises the ceiling rather than working around it.

#### Is there an official Europages API?

Not a public one. Europages sells data products and partner arrangements directly; there is no open developer API for keyword search or profile reads. Commercial licensing is the right route for very large or continuous extraction — this Actor is the route for targeted runs and research.

#### Does it need a browser or a proxy?

No. Europages renders on the server and the default run uses no proxy at 512 MB. `maxConcurrency: 20` is the default, but throughput is governed by the `maxRequestsPerSecond` cap (8 by default) — raising concurrency alone will not make the run faster, it only decides how many requests overlap while they wait for their rate slot.

***

### For AI Agents & LLM Apps

Callable via the Apify MCP server and the Apify API. Returns one flat company-profile dataset — one row per company.

**Minimal valid input** — one keyword, listing data only, cheapest and fastest:

```json
{ "keywords": ["stainless steel"], "includeDetails": false }
```

**Full B2B lead-gen run** — profiles, named contacts, VAT IDs, certificates:

```json
{
  "keywords": ["stainless steel", "aluminium extrusion"],
  "site": "europages.co.uk",
  "countryFilter": ["United Kingdom"],
  "includeDetails": true,
  "maxItems": 500
}
```

**Output field list** — identity: `name`, `acronym`, `europagesId`, `companyId`, `uuid`, `url`, `profileUrl`, `catalogUrl`, `logoUrl`. Location: `city`, `region`, `country`, `address`, `postalCode`, `latitude`, `longitude`. Classification: `mainBusinessArea`, `categories`, `productCategories`, `supplierTypes`, `keyword`, `site`. Qualification: `description`, `employees`, `foundingYear`, `vatId`, `sustainabilityScore`, `paymentMethods`, `incoterms`, `restrictedIn`, `distributionArea`. Contacts: `phone`, `fax`, `website`, `contacts`. Trust: `certificates`, `certificatesCount`, `documents`, `pictures`, `videos`, `referencesCount`, `responseRate`, `averageResponseTime`, `quickResponder`, `isActive`, `isEuropagesCustomer`, `canBeContacted`. Provenance: `detailScraped`, `scrapedAt`.

**Behaviors an agent should know**

- **`includeDetails` defaults to `true` and bills two events per row.** The full-detail path charges `company-listing` **plus** `company-profile`; listing mode charges `company-listing` only. If you are counting cost, set `includeDetails: false` and budget one event per row.
- **Rows are billed as they are written.** A blocked or failed profile never produces a charge for data you cannot see — you get the listing row with `detailScraped: false`.
- **`detailScraped: false` is the completeness flag.** Filter on `detailScraped == true` before treating rows as enriched leads.
- **The same company appears once per matching keyword.** Deduplicate on `europagesId`; `keyword` records which query surfaced it.
- **`countryFilter` is server-side**, so it narrows results rather than filtering them out afterwards — it does not waste requests.
- **`maxListPages` is capped at 100** because Europages itself stops serving past page 100. Above that you get fewer results, not an error.
- **One dataset, one `overview` view** — no alternate dataset to switch to.

**Billing model** — pay per event: `company-listing` ($0.0005 per company found) and `company-profile` ($0.0014–$0.0015 per enriched company, charged only when `includeDetails: true`), plus a per-run Actor Start event scaled by memory.

***

### Legal & Compliance Disclaimer

This Actor is an independent third-party tool. It is not affiliated with, endorsed by, sponsored by, or connected with Europages S.A. or any of its country portals.

It reads **only publicly accessible pages** — keyword-results listing pages, company profile pages and public document links. It does not log in, does not bypass authentication, does not solve CAPTCHAs, does not use proxies by default, and does not access any private or paid Europages interface.

Output includes **published business contact data** — company names, phone numbers, named business contacts with roles, and VAT registration numbers. These are business-to-business records that the companies themselves submitted to a public directory, but you remain responsible for your own lawful basis for processing them and for complying with Europages' Terms of Service and applicable law, including GDPR, UK GDPR and ePrivacy rules on B2B marketing, plus CAN-SPAM and TCPA where relevant. Europages also **prohibits scraping and automated extraction in its terms of use** — review those terms and consider a commercial licence or data partnership before high-volume or continuous collection.

A single Actor run can deliberately capture thousands of business records, so data minimisation matters: extract what your use case needs, respect deletion requests, and keep retention periods short.

This Actor is a data-collection tool; it does not provide legal advice and makes no claim that any particular use is permitted.

***

### SEO Keywords

europages scraper, b2b lead generation, supplier database, b2b directory data, europages api alternative, supplier contact data, named business contacts, vat number lookup, company registry enrichment, supplier sourcing, industrial supplier data, certificates data, manufacturing leads, crm enrichment data, b2b contact list, supplier discovery, trade supplier search, keyword supplier search, europages uk, europages germany, europages france, company profiling data, procurement research, sales intelligence b2b

# Actor input Schema

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

One or more product/category keywords, e.g. "stainless steel", "cnc machining", "solar panels". Each keyword becomes a Europages keyword-results listing page.

## `site` (type: `string`):

Which Europages portal to scrape. Data coverage and the `.com`-style profile URLs differ per country portal.

## `countryFilter` (type: `array`):

Optional. Restrict results to companies located in these countries (Europages native filter, applied server-side). Runs one listing per keyword per country.

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

Hard cap on the number of company records written to the dataset.

## `maxListPages` (type: `integer`):

How many keyword-results/listing pages to walk per keyword. Each listing page yields up to 30 companies. Europages itself stops serving beyond page 100.

## `maxConcurrency` (type: `integer`):

How many pages to fetch at the same time. Higher is faster. Europages handles 40 concurrent requests without throttling.

## `maxRequestsPerSecond` (type: `integer`):

Global request rate cap shared by all parallel requests. Europages rate-limits per IP on a leaky-bucket basis (HTTP 405 "Human Verification", ban of minutes). On a block the Actor pauses everything, sends a single probe request, and halves the rate until it recovers - lower this if runs keep getting throttled, raise it if the site keeps up.

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

When true (default) each company profile page is fetched for description, phone, website, employees, founding year, named contacts, geo-coordinates, product categories and documents. When false only the lighter listing data is returned (roughly 10x faster, name/city/country/employees only).

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

Optional. Direct listing or company profile URLs to scrape instead of / in addition to the keywords.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "keywords": [
    "stainless steel"
  ],
  "site": "europages.co.uk",
  "countryFilter": [],
  "maxItems": 10,
  "maxListPages": 10,
  "maxConcurrency": 20,
  "maxRequestsPerSecond": 8,
  "includeDetails": true,
  "startUrls": [],
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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 = { "proxy": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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 '{
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/europages-scraper --silent --output-dataset

```

## MCP server setup

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