# Peppol Directory Participants Scraper (`automation-lab/peppol-directory-participants-scraper`) Actor

🔎 Verify Peppol participants and export official directory records by country, keyword, participant ID, website, or contact term.

- **URL**: https://apify.com/automation-lab/peppol-directory-participants-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Peppol Directory Participants Scraper

Find Peppol participants, verify e-invoicing identifiers, and export compliance-ready business records from the official public Peppol Directory.

### What does Peppol Directory Participants Scraper do?

Peppol Directory Participants Scraper extracts participant records from the official public Peppol Directory.

It helps teams find organizations that can receive Peppol e-invoices, verify participant identifiers, and export country or keyword lists for compliance and sales workflows.

The actor uses the public REST API rather than a browser, so runs are fast, predictable, and inexpensive.

### Who is it for?

🏢 ERP and e-invoicing vendors use it to build account lists.

💳 AP automation teams use it to verify suppliers before onboarding.

🧾 Compliance consultants use it to document Peppol readiness by country.

📊 B2B data teams use it to enrich company records with participant identifiers.

### Why use this actor?

The public Directory is searchable, but repeatable exports are easier with an Apify actor.

You get structured JSON, CSV, Excel, and API access, plus run history, webhooks, scheduled runs, and integrations with your existing Apify workflows.

### Data you can extract

The dataset includes participant ID, participant scheme, participant value, business name, alternate names, country code, registration date, websites, additional identifiers, optional contacts, optional document type identifiers, and source URL.

### How much does it cost to scrape Peppol Directory participants?

This actor uses pay-per-event pricing.

Each run has a $0.005 start charge and then charges per participant record saved.

| Plan tier | Price per Peppol participant | 1,000 participants |
|---|---:|---:|
| Free | $0.000029802 | $0.03 |
| Starter / Bronze | $0.000025915 | $0.03 |
| Scale / Silver | $0.000020213 | $0.02 |
| Business / Gold | $0.000015549 | $0.02 |
| Platinum | $0.000010366 | $0.01 |
| Diamond | $0.00001 | $0.01 |

The input prefill is intentionally small enough for a useful first run while still demonstrating the country search workflow.

### How to scrape Peppol Directory participants

1.

Open the actor.

2.

Add keywords, country codes, names, or participant IDs.

3.

Set the maximum participant count.

4.

Decide whether to include document type identifiers and contacts.

5.

Run the actor and export the dataset.

### Input options

Use `queries` for broad search, `countries` for exact country lists, `names` for partial business-name matching, `participantIds` for exact verification, and `geoInfo`, `website`, or `contact` for targeted filters.

### Output example

Each row represents one Peppol participant/entity.

Key fields include `participantId`, `businessName`, `countryCode`, `registrationDate`, `websites`, `identifiers`, `documentTypeCount`, `searchType`, `searchValue`, and `scrapedAt`.

### Tips for better Peppol searches

Use ISO country codes such as BE, NL, DE, AT, or DK for large prospecting runs.

Use exact participant IDs for supplier validation.

Enable document type identifiers when you need capability details, but leave them off for compact lead exports.

### Integrations

Send results to Google Sheets, Airtable, Make, Zapier, or your own API.

Common workflows include supplier onboarding checks, monthly country monitoring, e-invoicing market mapping, and CRM enrichment for Peppol-capable companies.

### API usage

Run the actor through Apify API clients using actor ID `automation-lab/peppol-directory-participants-scraper`.

Store input as JSON and fetch the default dataset after the run finishes.

### Node.js API example

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/peppol-directory-participants-scraper').call({ countries: ['BE'], maxItems: 100 });
const items = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.items[0]);
````

### Python API example

```python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/peppol-directory-participants-scraper').call(run_input={'countries': ['BE'], 'maxItems': 100})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items[0])
```

### cURL API example

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab/peppol-directory-participants-scraper/runs?token=$APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"countries":["BE"],"maxItems":100}'
```

### MCP integration

Peppol Directory Participants Scraper is available as a tool for AI assistants that support the Model Context Protocol (MCP).

Add the Apify MCP server to your AI client — this gives you access to all Apify actors, including this one.

**Claude Code setup**

```bash
claude mcp add --transport http apify "https://mcp.apify.com"
```

**Claude Desktop, Cursor, or VS Code setup**

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com"
    }
  }
}
```

Example prompts:

- "Use automation-lab/peppol-directory-participants-scraper to find 100 Belgian Peppol participants."
- "Verify Peppol participant 9915:b and include document type capabilities."
- "Export companies with Government in their Peppol Directory name for compliance review."

### Scheduling and monitoring

Schedule the actor weekly or monthly to monitor participant availability by country or keyword.

Use webhooks to notify your compliance or sales systems when new exports are ready.

### Legality and source terms

The actor uses the public Peppol Directory search API.

Use the data responsibly, respect the Directory rate limit, and comply with applicable privacy, procurement, and marketing regulations in your jurisdiction.

### Troubleshooting

If a query returns no records, try broader keywords or a country search.

If a name search fails, ensure it has at least three characters.

If you see rate-limit warnings, reduce parallel scheduled runs and keep result limits reasonable.

### Related scrapers

Explore related Automation Lab actors on Apify for business directories, contact discovery, website checks, and B2B enrichment.

Use `https://apify.com/automation-lab/` links when composing workflows.

### FAQ

**Can I scrape the whole Peppol Directory?** The public search API caps browsed results per query, so use country and keyword slices.

**Does it require login?** No.

**Does it use a browser?** No, it uses HTTP requests to the official REST API.

### Field reference

- `participantId` — structured Peppol Directory participant data for exports and integrations.

- `participantScheme` — structured Peppol Directory participant data for exports and integrations.

- `participantValue` — structured Peppol Directory participant data for exports and integrations.

- `businessName` — structured Peppol Directory participant data for exports and integrations.

- `allNames` — structured Peppol Directory participant data for exports and integrations.

- `countryCode` — structured Peppol Directory participant data for exports and integrations.

- `registrationDate` — structured Peppol Directory participant data for exports and integrations.

- `websites` — structured Peppol Directory participant data for exports and integrations.

- `identifiers` — structured Peppol Directory participant data for exports and integrations.

- `contacts` — structured Peppol Directory participant data for exports and integrations.

- `additionalInfo` — structured Peppol Directory participant data for exports and integrations.

- `documentTypes` — structured Peppol Directory participant data for exports and integrations.

- `documentTypeCount` — structured Peppol Directory participant data for exports and integrations.

- `searchType` — structured Peppol Directory participant data for exports and integrations.

- `searchValue` — structured Peppol Directory participant data for exports and integrations.

- `sourceUrl` — structured Peppol Directory participant data for exports and integrations.

- `scrapedAt` — structured Peppol Directory participant data for exports and integrations.

### Example inputs

#### Country prospecting

```json
{"countries":["BE"],"maxItems":100}
```

#### Supplier verification

```json
{"participantIds":["9915:b"],"includeDocumentTypes":true}
```

#### Keyword search

```json
{"queries":["Austrian Government"],"includeContacts":true}
```

### Support

If you need a new Peppol filter or integration pattern, open an issue on the actor page and include the query you tried, the expected records, and a sample participant ID if available.

# Actor input Schema

## `queries` (type: `array`):

Generic Peppol Directory search terms. Searches participant names, addresses, identifiers, websites, and other indexed fields.

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

Exact ISO 3166-1 alpha-2 country codes. Use this for country prospecting or compliance checks.

## `names` (type: `array`):

Partial matches in business entity names. Values must be at least 3 characters.

## `participantIds` (type: `array`):

Exact Peppol participant identifiers, with or without the iso6523-actorid-upis:: prefix, e.g. 9915:b.

## `geoInfo` (type: `array`):

Partial matches in geographical/address information, where available.

## `website` (type: `string`):

Optional partial website/domain search term.

## `contact` (type: `string`):

Optional partial contact search term such as support or billing.

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

Maximum participant/entity records to save across all searches. The public API allows up to 1000 browsed results per query.

## `includeDocumentTypes` (type: `boolean`):

Include full Peppol document type identifiers. Disable for smaller, easier exports.

## `includeContacts` (type: `boolean`):

Include contact records when the Directory returns them.

## Actor input object example

```json
{
  "queries": [
    "Austrian Government"
  ],
  "countries": [
    "BE"
  ],
  "maxItems": 20,
  "includeDocumentTypes": false,
  "includeContacts": true
}
```

# Actor output Schema

## `overview` (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 = {
    "queries": [
        "Austrian Government"
    ],
    "countries": [
        "BE"
    ],
    "maxItems": 20,
    "includeDocumentTypes": false,
    "includeContacts": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/peppol-directory-participants-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 = {
    "queries": ["Austrian Government"],
    "countries": ["BE"],
    "maxItems": 20,
    "includeDocumentTypes": False,
    "includeContacts": True,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/peppol-directory-participants-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 '{
  "queries": [
    "Austrian Government"
  ],
  "countries": [
    "BE"
  ],
  "maxItems": 20,
  "includeDocumentTypes": false,
  "includeContacts": true
}' |
apify call automation-lab/peppol-directory-participants-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Peppol Directory Participants Scraper",
        "description": "🔎 Verify Peppol participants and export official directory records by country, keyword, participant ID, website, or contact term.",
        "version": "0.1",
        "x-build-id": "kRDgYDaJ8p1j4s2qu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~peppol-directory-participants-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-peppol-directory-participants-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/automation-lab~peppol-directory-participants-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-peppol-directory-participants-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/automation-lab~peppol-directory-participants-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-peppol-directory-participants-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": {
                    "queries": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Generic Peppol Directory search terms. Searches participant names, addresses, identifiers, websites, and other indexed fields.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Country codes",
                        "type": "array",
                        "description": "Exact ISO 3166-1 alpha-2 country codes. Use this for country prospecting or compliance checks.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "names": {
                        "title": "Business names",
                        "type": "array",
                        "description": "Partial matches in business entity names. Values must be at least 3 characters.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "participantIds": {
                        "title": "Participant IDs",
                        "type": "array",
                        "description": "Exact Peppol participant identifiers, with or without the iso6523-actorid-upis:: prefix, e.g. 9915:b.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "geoInfo": {
                        "title": "Geography or address terms",
                        "type": "array",
                        "description": "Partial matches in geographical/address information, where available.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "website": {
                        "title": "Website contains",
                        "type": "string",
                        "description": "Optional partial website/domain search term."
                    },
                    "contact": {
                        "title": "Contact contains",
                        "type": "string",
                        "description": "Optional partial contact search term such as support or billing."
                    },
                    "maxItems": {
                        "title": "Maximum participants",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum participant/entity records to save across all searches. The public API allows up to 1000 browsed results per query.",
                        "default": 20
                    },
                    "includeDocumentTypes": {
                        "title": "Include document type identifiers",
                        "type": "boolean",
                        "description": "Include full Peppol document type identifiers. Disable for smaller, easier exports.",
                        "default": false
                    },
                    "includeContacts": {
                        "title": "Include contacts",
                        "type": "boolean",
                        "description": "Include contact records when the Directory returns them.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
