# Europages Scraper — B2B Company Data with Emails & VAT IDs (`memo23/europages-scraper`) Actor

Turn Europages into B2B lead lists with real emails and VAT IDs. Search 3M+ European suppliers by keyword, filter by country, size and supplier type, and get one deduplicated row per company — contacts, coordinates, certificates included. Billed per result.

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

## Pricing

from $6.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Europages Scraper

Turn Europages — Europe's largest B2B directory with 3M+ companies across 26+ countries — into structured supplier data. Search by keyword, filter by country, size and supplier type, and get one clean row per company with **real email addresses, VAT IDs, phone numbers and websites** included. No login, no browser automation, billed per result.

#### How it works

![How Europages Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-europages.png)

#### ✨ Why use this scraper?

- **Real contact emails + VAT IDs** — pulled from each company's profile page, not guessed or reconstructed. Most Europages scrapers stop at name + phone.
- **Full firmographics per row** — headcount range, founding year, supplier types, distribution area, certificates (ISO etc.), payment methods, incoterms, product counts.
- **GPS coordinates on nearly every row** — map supplier density, build territory analyses.
- **Country, size, supplier-type and verified filters** — partition a keyword across countries to reach far more results than a single search allows.
- **Structured JSON data source** — reads Europages' own machine-readable payloads, not brittle DOM selectors that break on the next redesign.
- **Deduplicated, one row per company** — you never pay twice for the same supplier, even across overlapping keywords and pages.

#### 🎯 Use cases

| Who | What they do with it |
|---|---|
| Sales / lead-gen teams | Build targeted prospect lists with verified emails and phone numbers, ready for outreach or CRM import |
| Procurement & sourcing | Find and compare suppliers for a product category across specific European countries |
| Market researchers | Map supplier density by country, size and category; track who lists a product over time |
| Data / RevOps teams | Enrich existing CRM records with VAT IDs, coordinates, headcount and founding year |
| Agencies | Deliver niche B2B contact datasets (e.g. "all verified German packaging manufacturers") |

#### 📥 Supported inputs

| Input | Example | Behaviour |
|---|---|---|
| Search keyword | `packaging` | Runs a Europages search, pages through results |
| Search URL | `https://www.europages.co.uk/en/search?q=solar panels` | Query is extracted and run as a keyword search |
| Company profile URL | `https://www.europages.co.uk/en/company/{slug}` | That company is scraped directly |
| Any market TLD | `europages.fr`, `europages.de`, `europages.com`, … | Auto-normalised; output is always the English-market view |

**Not supported:** category landing pages (`/bd/...`), product pages (`/products/p-...`), and RFQ pages — paste a keyword or a company URL instead.

#### 🔄 How it works

1. **Classify input** — keywords and pasted URLs are sorted into searches vs direct company fetches.
2. **Search** — each keyword (× each selected country) queries Europages' supplier search as paged JSON, 30 companies per page.
3. **Dedupe** — companies are deduplicated by ID across pages, keywords and countries.
4. **Enrich** *(default on)* — each company's profile page is fetched once, adding email, VAT ID, fax, certificates, payment methods, incoterms and named contacts.
5. **Push** — the merged row lands in the dataset; export as JSON, CSV, Excel or via API.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array | `["packaging"]` | Keywords to search; each collects up to `maxItems` rows |
| `startUrls` | array | `[]` | Europages search URLs and/or company profile URLs |
| `countries` | array | `[]` (all) | ISO-2 country codes (`FR`, `DE`, `IT`, …); each runs as its own partition |
| `verifiedOnly` | boolean | `false` | Only suppliers with the Europages "verified" badge |
| `employeeCounts` | array | `[]` (all) | Headcount ranges: `From1To4` … `MoreThan1000` |
| `supplierTypes` | array | `[]` (all) | `Production`, `CustomerSpecificManufacturing`, `Service`, `Wholesaler`, `Distributor`, `Retailer`, `ServiceProvider` |
| `enrichCompanyDetails` | boolean | `true` | Fetch each profile page for email, VAT, fax, certificates |
| `enrichEmails` | boolean | `false` | Extra pass: scan the company's own website when the profile has no public email |
| `maxItems` | integer | `1000` | Hard cap on company rows collected |
| `maxConcurrency` | integer | `10` | Companies processed in parallel |
| `proxy` | object | Apify residential | Proxy settings |

#### 📊 Output overview

One row per company. Rows from keyword searches carry everything the search surface exposes (name, address, coordinates, phone, website, headcount, founding year, products); with `enrichCompanyDetails` on (default), each row is completed with the profile-page fields — email, VAT ID, fax, certificates, payment methods, incoterms and named contact persons. Fields the source doesn't provide are `null` (or `[]`), so your column layout is stable across runs.

#### 📦 Output sample

```json
{
  "type": "company",
  "source": "europages",
  "companyId": "22336708",
  "slug": "doruk-matbaa-ve-etiket-22336708",
  "profileUrl": "https://www.europages.co.uk/en/company/doruk-matbaa-ve-etiket-22336708",
  "companyName": "Doruk Matbaa ve Etiket",
  "email": "handan@dorukmatbaa.com",
  "phoneNumber": "+905326127424",
  "faxNumber": null,
  "website": "https://www.dorukmatbaa.com/",
  "websiteDomain": "dorukmatbaa.com",
  "street": "Maltepe Mh. Davutpaşa Cd.Güven İş Merkezi",
  "city": "Zeytinburnu/İstanbul",
  "zipcode": "34000",
  "countryCode": "TR",
  "coordinates": { "latitude": 41.0308667, "longitude": 28.910028 },
  "vatId": null,
  "employeeCount": "10-19",
  "foundingYear": 1985,
  "supplierTypes": ["customer_specific_manufacturing", "service", "production", "wholesaler"],
  "distributionArea": "international",
  "description": "Since 1985, Doruk Printing & Label has been a trusted supplier of high-quality printing, packaging and labeling solutions...",
  "certificates": [],
  "paymentMethods": [],
  "contacts": [],
  "scrapedAt": "2026-07-16T14:52:24.891Z"
}
````

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| Identity | `companyId`, `slug`, `profileUrl`, `companyName`, `acronym`, `logoUrl` |
| Contact | `email`, `phoneNumber`, `faxNumber`, `website`, `websiteDomain`, `contacts[]` (named persons where published) |
| Location | `street`, `city`, `zipcode`, `countryCode`, `coordinates.{latitude,longitude}` |
| Firmographics | `vatId`, `employeeCount`, `foundingYear`, `supplierTypes[]`, `distributionArea` |
| Compliance & trade | `certificates[]`, `paymentMethods[]`, `paymentTerms[]`, `incoterms[]` |
| Catalogue | `productCount`, `portfolioProducts[]` (name, description, image), `topCategories`, `keywords[]` |
| Meta | `isPayingCustomer`, `isQuickResponder`, `averageResponseTime`, `scrapedAt` |

#### ❓ FAQ

**Does every row have an email address?**
No — only companies that publish one on their Europages profile. In practice coverage is high (all 40/40 rows in our packaging test run had one), and the `enrichEmails` option adds a second-chance pass over the company's own website for the rest.

**How many results can one keyword return?**
Europages caps how deep a single search can page. To go deeper, split the keyword by `countries` — each country runs as its own partition with its own ceiling — or add size/type filters.

**What's the difference between `enrichCompanyDetails` and `enrichEmails`?**
`enrichCompanyDetails` (default on) fetches the company's *Europages profile* — that's where email, VAT and certificates live. `enrichEmails` (default off) additionally scans the company's *own website* when the profile exposes no email.

**Can I scrape a specific company?**
Yes — paste its profile URL (`.../company/{slug}`) into `startUrls`. You'll get the full enriched row without running a search.

**Why do some rows have `vatId: null`?**
Not every company publishes a VAT number on Europages. The field is emitted as `null` rather than omitted so CSV columns stay stable.

#### 💬 Support

- Found a bug or need a field added? Open an issue on the actor's [Issues tab](https://apify.com/memo23/europages-scraper/issues).
- Direct contact: <muhamed.didovic@gmail.com>

#### 🛠 Additional services

- Custom output shape, additional fields, or one-off datasets: <muhamed.didovic@gmail.com>
- Need a similar scraper for another B2B directory (Kompass, wlw, ThomasNet, etc.)? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): <muhamed.didovic@gmail.com>

#### 🔎 Explore more scrapers

If this Europages Scraper was useful, see other scrapers and actors at [memo23's Apify profile](https://apify.com/memo23) — covering B2B directories, job boards, real estate, social media, and more.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Europages, Visable GmbH, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available company listings and profile pages on europages — no authenticated endpoints, member-only features, or content behind a Europages login. Users are responsible for ensuring their use complies with Europages' Terms of Service, applicable data-protection law (GDPR, CCPA, etc.) — particularly when processing personal contact data — and any contractual obligations of their own organisation.

***

### SEO Keywords

europages scraper, scrape europages, europages api, europages data extraction, Apify europages, b2b directory scraper, european supplier database, b2b lead generation europe, supplier discovery tool, manufacturer directory scraper, european company data, b2b contact scraper, vat number lookup europe, procurement sourcing data, supplier email list, wlw alternative scraper, kompass alternative scraper, b2b marketplace scraper, export import leads europe, industrial supplier list

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on Europages (e.g. 'packaging', 'steel pipes', 'solar panels'). Each keyword collects up to Maximum items rows.

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

Full europages URLs. Search URLs (https://www.europages.co.uk/en/search?q=packaging) are folded into keyword searches; company profile URLs (https://www.europages.co.uk/en/company/{slug}) are scraped directly. Any market TLD works (.co.uk, .fr, .de, .com, …).

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

Restrict results to these countries, e.g. FR, DE, IT, ES, PL. Each country runs as its own search partition, which also raises the per-keyword result ceiling. Leave empty for all countries.

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

Only return companies carrying the Europages 'verified' badge.

## `employeeCounts` (type: `array`):

Filter by headcount range. Allowed values: From1To4, From5To9, From10To19, From20To49, From50To99, From100To199, From200To499, From500To999, MoreThan1000. Leave empty for all sizes.

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

Filter by supplier type. Allowed values: Production, CustomerSpecificManufacturing, Service, Wholesaler, Distributor, Retailer, ServiceProvider. Leave empty for all types.

## `enrichCompanyDetails` (type: `boolean`):

When enabled, each company's profile page is fetched once to add `email`, `vatId`, `faxNumber`, `certificates`, `paymentMethods`, `incoterms`, and a fuller description. The search results already include name, phone, website, address and coordinates — disable this for faster, cheaper runs if those are enough.

## `enrichEmails` (type: `boolean`):

If enabled, companies whose Europages profile has no public email get their own website's contact/about pages scanned for one. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

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

Hard cap on the number of company rows collected across all keywords. Use this cap to limit billing.

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

Maximum number of company rows processed in parallel (detail fetch + push).

## `minConcurrency` (type: `integer`):

Minimum number of requests processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

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

Europages is generally reachable without a proxy, but its AWS WAF can challenge datacenter IP ranges — residential proxies are the safe default.

## Actor input object example

```json
{
  "searchQueries": [
    "packaging"
  ],
  "startUrls": [],
  "countries": [],
  "verifiedOnly": false,
  "employeeCounts": [],
  "supplierTypes": [],
  "enrichCompanyDetails": true,
  "enrichEmails": false,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQueries": [
        "packaging"
    ],
    "startUrls": [],
    "countries": [],
    "employeeCounts": [],
    "supplierTypes": [],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchQueries": ["packaging"],
    "startUrls": [],
    "countries": [],
    "employeeCounts": [],
    "supplierTypes": [],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/europages-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "packaging"
  ],
  "startUrls": [],
  "countries": [],
  "employeeCounts": [],
  "supplierTypes": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/europages-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/europages-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Europages Scraper — B2B Company Data with Emails & VAT IDs",
        "description": "Turn Europages into B2B lead lists with real emails and VAT IDs. Search 3M+ European suppliers by keyword, filter by country, size and supplier type, and get one deduplicated row per company — contacts, coordinates, certificates included. Billed per result.",
        "version": "0.0",
        "x-build-id": "bwTWyq2W2JESz4EXT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~europages-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-europages-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~europages-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-europages-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~europages-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-europages-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Keywords to search on Europages (e.g. 'packaging', 'steel pipes', 'solar panels'). Each keyword collects up to Maximum items rows.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Europages URLs (optional)",
                        "type": "array",
                        "description": "Full europages URLs. Search URLs (https://www.europages.co.uk/en/search?q=packaging) are folded into keyword searches; company profile URLs (https://www.europages.co.uk/en/company/{slug}) are scraped directly. Any market TLD works (.co.uk, .fr, .de, .com, …).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Countries (ISO-2 codes)",
                        "type": "array",
                        "description": "Restrict results to these countries, e.g. FR, DE, IT, ES, PL. Each country runs as its own search partition, which also raises the per-keyword result ceiling. Leave empty for all countries.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "verifiedOnly": {
                        "title": "Verified suppliers only",
                        "type": "boolean",
                        "description": "Only return companies carrying the Europages 'verified' badge.",
                        "default": false
                    },
                    "employeeCounts": {
                        "title": "Company size (headcount ranges)",
                        "type": "array",
                        "description": "Filter by headcount range. Allowed values: From1To4, From5To9, From10To19, From20To49, From50To99, From100To199, From200To499, From500To999, MoreThan1000. Leave empty for all sizes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "supplierTypes": {
                        "title": "Supplier types",
                        "type": "array",
                        "description": "Filter by supplier type. Allowed values: Production, CustomerSpecificManufacturing, Service, Wholesaler, Distributor, Retailer, ServiceProvider. Leave empty for all types.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichCompanyDetails": {
                        "title": "Fetch company profile page (adds email, VAT ID, fax, certificates)",
                        "type": "boolean",
                        "description": "When enabled, each company's profile page is fetched once to add `email`, `vatId`, `faxNumber`, `certificates`, `paymentMethods`, `incoterms`, and a fuller description. The search results already include name, phone, website, address and coordinates — disable this for faster, cheaper runs if those are enough.",
                        "default": true
                    },
                    "enrichEmails": {
                        "title": "Also scan company websites for extra contact emails (experimental)",
                        "type": "boolean",
                        "description": "If enabled, companies whose Europages profile has no public email get their own website's contact/about pages scanned for one. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of company rows collected across all keywords. Use this cap to limit billing.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of company rows processed in parallel (detail fetch + push).",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of requests processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Europages is generally reachable without a proxy, but its AWS WAF can challenge datacenter IP ranges — residential proxies are the safe default.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
