# DACH & Benelux Business Leads — Impressum, VAT & Register (`eurodata-tools/dach-business-leads`) Actor

Find businesses in Germany, Austria, Switzerland, the Netherlands, Belgium and Luxembourg by category and city, then enrich each one from its website: legal name, VAT ID, commercial register (HRB, FN, CHE, KvK, KBO, RCS), emails, phones, socials. Open data, pay only for leads with contact data.

- **URL**: https://apify.com/eurodata-tools/dach-business-leads.md
- **Developed by:** [EuroData Tools](https://apify.com/eurodata-tools) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 business leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## DACH & Benelux Business Leads — Impressum, VAT & Register

Find **businesses in Germany, Austria, Switzerland, the Netherlands, Belgium and Luxembourg** by category and city, and get one clean B2B row for each: name, address, phone, website, **company emails**, and the legal data each business must publish on its own website: **legal name and form, VAT ID, Handelsregister (HRB), Austrian FN, Swiss UID (CHE), Dutch KvK, Belgian KBO/BCE, Luxembourg RCS**.

Pick "Tax advisors in Leipzig", "Dentists in Wien", "Car dealers in Bayern" or "Bakeries in Amsterdam", and press Start. You do not need a list of websites to begin with.

**You pay only for leads with contact or registry data: $5 per 1,000 leads.** Businesses with only a name and an address are free.

### How it works

1. **Finds the businesses in OpenStreetMap**, the open map of the world. OpenStreetMap is very detailed in German-speaking countries and the Benelux: names, addresses, phones, websites and opening hours, kept up to date by local mappers. The data is open (ODbL), so you can use it commercially.
2. **Visits each business website**: the start page, the **Impressum** / legal notice / *colofon* / *mentions légales* and the contact page. There it reads the legal name, VAT ID, register number, company mailboxes, phones and social profiles.
3. **Merges everything into one row per business**, with phone numbers in international format and VAT IDs checked with the official check-digit algorithm.

### What can you use it for?

- **Local lead lists without Google Maps.** Find every electrician, architect or physiotherapist in a city or region, with a phone and a company email.
- **B2B sales in DACH.** German, Austrian and Swiss websites must publish an Impressum, so you also get the legal name, the commercial register entry and the VAT ID, ready for your CRM or for invoicing.
- **Market sizing.** Count how many dentists, car dealers or hotels there are in each city, with coordinates for a map.
- **Supplier and partner research (KYB).** Check that a business is a GmbH, AG, B.V. or SRL and get its official register number before you sign.
- **Agencies and SaaS sales teams.** Build target lists of businesses that have a website (and see which ones do not).

### Example output

One row per business (real result from a test run, shortened):

```json
{
  "name": "Zahnklinik Wien Döbling",
  "category": "dentist",
  "legalName": "Zahnklinik Wien Döbling GmbH",
  "legalForm": "GmbH",
  "address": "Sieveringer Straße 17, 1190 Wien",
  "country": "AT",
  "latitude": 48.245951,
  "longitude": 16.339652,
  "website": "https://www.zwd.at/",
  "emails": [
    "office@zwd.at"
  ],
  "phones": [
    "+4313209797"
  ],
  "vatIds": [
    "ATU38109104"
  ],
  "commercialRegister": "FN 32129z",
  "chUid": null,
  "kvkNumber": null,
  "beEnterpriseNumber": null,
  "luRcsNumber": null,
  "linkedin": "https://www.linkedin.com/company/zahnklinik-wien-d%C3%B6bling",
  "instagram": "https://www.instagram.com/zahnklinikwiendoebling",
  "openingHours": "Mo-Fr 08:00-18:00",
  "operator": "Sanodent Krankenhausbetriebs GmbH",
  "websiteStatus": "ok",
  "impressumUrl": "https://www.zahnklinik-wien-doebling.at/impressum",
  "osmUrl": "https://www.openstreetmap.org/node/1861617643",
  "source": "OpenStreetMap contributors (ODbL) + company website"
}
```

More real rows from the test runs:

| Business | Country | Legal name | Register | VAT ID | Email | Phone |
|---|---|---|---|---|---|---|
| ABSS Schwarz Architekten AG | CH | ABSS Schwarz Architekten AG | CHE-101.485.103 | — | info@abss.ch | +41434449494 |
| Heer Architektur GmbH | CH | Heer Architektur GmbH | CHE-477.093.725 | — | info@heer-architektur.com | +41443961010 |
| Jonke | AT | Jonke GmbH | FN 518587d | ATU74815818, ATU38713601 | — | +43152448680 |
| Zahnzauber | AT | Zahnzauber GmbH | FN 504927s | ATU74170504 | mail@zahnzauber.at | +4319971110 |
| De Snelbinder | NL | — | KvK 61069094 | NL854191628B01 | info@desnelbinder.nl | +31207370747 |
| Amsterdam's Scooter City | NL | Amsterdam's Scootercity BV | KvK 50298917 | — | info@scootercity.nl | +31204708340 |
| Van Coile & Partners | BE | — | KBO 0443.127.375 | BE0443127375 | info@vancoile.be | +3292166655 |
| All-Account | BE | All-Account BV | KBO 0475.034.734 | BE0475034734 | — | +32474365043 |
| City Hotel | LU | — | — | LU34798887 | mail@cityhotel.lu | +352291122 |

### Why this Actor?

| | This Actor | Google Maps scrapers | Website contact scrapers |
|---|---|---|---|
| You start from a category and a city, no list needed | ✅ | ✅ | ❌ |
| Legal name and company form from the Impressum | ✅ | ❌ | partly |
| VAT ID with check-digit validation | ✅ | ❌ | partly |
| HRB / FN / CHE UID / KvK / KBO / RCS register numbers | ✅ | ❌ | ❌ |
| Open data you may reuse (OpenStreetMap, ODbL) | ✅ | ❌ | — |
| Company mailboxes only by default (GDPR-friendly) | ✅ | ❌ | ❌ |
| You pay only for leads with contact data | ✅ | ❌ | ❌ |

### How to use it

1. Choose the **Country**.
2. Type one or more **Cities, regions or postcodes**: `Leipzig`, `München`, `Wien`, `Zürich`, `Amsterdam`, `Bruxelles`, a region code such as `DE-BY` (Bavaria), `AT-9` (Vienna), `CH-ZH` (Zurich), or a postcode such as `80331`. Leave it empty for the whole country.
3. Pick one or more **Business categories** (65 ready-made ones, from dentists to roofers), or type any **OpenStreetMap tag** such as `shop=bicycle` or `craft=*`.
4. Set **Max businesses** and press **Start**. Download the results as Excel, CSV or JSON, or get them through the API.

### Input

| Field | Default | What it does |
|---|---|---|
| `country` | `DE` | `DE`, `AT`, `CH`, `NL`, `BE` or `LU` |
| `locations` | whole country | Cities, districts, region codes (`DE-BY`) or postcodes, one per line |
| `categories` | — | Ready-made categories, e.g. `tax_advisor`, `dentist`, `car_dealer`, `electrician` |
| `osmTags` | — | Any OpenStreetMap tag, e.g. `shop=bicycle`, `office=*` |
| `nameContains` | — | Keep only names containing this text, e.g. `Bio` |
| `maxResults` | 100 | Businesses in total. Listings with a website and phone come first |
| `requireWebsite` | `false` | Only businesses with a website |
| `includeLeadsWithoutContact` | `true` | Also return (free) rows with only name and address |
| `visitWebsites` | `true` | Visit websites for Impressum data. Off = OpenStreetMap data only |
| `maxPagesPerWebsite` | 4 | Start page + Impressum, contact and about pages |
| `emailMode` | `generic` | `generic` = company mailboxes only. `all` = also named people (only with a lawful basis) |
| `includeManagingDirectors` | `false` | Names next to "Geschäftsführer", "Inhaber", "Directie", "Gérant" (personal data: only with a lawful basis) |
| `respectRobotsTxt` | `true` | Skip website pages that robots.txt disallows |
| `proxyConfiguration` | off | Turn on Apify Proxy only if many websites come back as `blocked` |
| `overpassEndpoint` | public servers | Your own Overpass API server, if you have one |

### Output fields

`name`, `category`, `osmTag`, `legalName`, `legalForm`, `street`, `houseNumber`, `postcode`, `city`, `country`, `address`, `latitude`, `longitude`, `website`, `domain`, `emails`, `personalEmailsHidden`, `phones`, `vatIds`, `vatIdDetails` (with `checksumValid`), `commercialRegister`, `chUid`, `kvkNumber`, `beEnterpriseNumber`, `luRcsNumber`, `managingDirectors`, `linkedin`, `facebook`, `instagram`, `x`, `youtube`, `tiktok`, `openingHours`, `brand`, `operator`, `wikidata`, `websiteStatus`, `impressumUrl`, `contactPageUrl`, `pagesCrawled`, `errorMessage`, `searchLocation`, `osmId`, `osmUrl`, `source`, `scrapedAt`.

`websiteStatus` tells you what happened on the website:

| websiteStatus | meaning |
|---|---|
| `ok` | data found on the website |
| `no-data` | the website works but shows no contacts or IDs |
| `no-website` | OpenStreetMap has no website for this business |
| `not-visited` | website visits were turned off |
| `unreachable` | domain does not exist, timeout, connection refused |
| `blocked` | the website blocks automated visits (try with Apify Proxy) |
| `js-only` | the website is built only with JavaScript |
| `parked` | the domain is parked or for sale |
| `robots-disallowed` | the website's robots.txt does not allow crawling |

A row is charged when it has at least one email, phone, VAT ID or register number, whatever its `websiteStatus`.

### Pricing

**$5 per 1,000 leads with contact or registry data** (`business-lead` event, $0.005 each). Rows with only a name and an address are free. Set **Max cost per run** in the run options and the Actor stops exactly there: you never pay more.

Example: 1,000 businesses where 800 have a phone or an email cost **$4.00**.

### Good to know

- **Coverage.** The Actor finds what is mapped in OpenStreetMap. In German-speaking countries and the Benelux that is most shops, offices, practices and craftsmen in cities, less in small villages. Try a nearby city or the whole region if you get few results.
- **Place names.** Use the local name (`München`, `Wien`, `Genève`, `Den Haag`); English names work too in most cases. If a name exists several times (e.g. `Neustadt`), all matching places are searched. Region codes (`DE-BY`) are the most precise. In Luxembourg, `Luxembourg` means the capital city; leave the field empty for the whole country.
- **Chains.** Branches of a chain often share one website, so they get the legal data of the company that runs the website.
- **VAT IDs** are returned only when the official check digit is correct (`checksumValid: true`). Run a VIES lookup if you need to know that a VAT ID is currently active.
- **Attribution.** Data from OpenStreetMap is © OpenStreetMap contributors and available under the Open Database License (ODbL). If you publish the data, credit OpenStreetMap.
- **Legal.** The Actor reads open map data and public pages of business websites, respects robots.txt, and returns company mailboxes by default. You are responsible for how you use the data, for example under GDPR and anti-spam rules (UWG in Germany) when you contact businesses.

### FAQ

**How many businesses can I get?** Up to 20,000 per run. For a whole country, split by region code (`DE-BY`, `DE-NW` …) for faster runs.

**Which category should I pick for X?** If it is not in the list, look up the tag on the [OpenStreetMap wiki](https://wiki.openstreetmap.org/wiki/Map_features) and put it in **OpenStreetMap tags**, e.g. `shop=bicycle`, `craft=tiler`, `office=architect`.

**Do I need a proxy?** Usually not. Small business websites rarely block. Turn on Apify Proxy if you see many `blocked` rows.

**Something is missing or wrong?** Open an issue on the Actor page with an example. Issues are usually answered within a day.

# Actor input Schema

## `country` (type: `string`):

Country to search in.

## `locations` (type: `array`):

Where to search inside the country, one per line: a city or district (`München`, `Wien`, `Zürich`, `Amsterdam`), a region code (`DE-BY`, `AT-9`, `CH-ZH`) or a postcode (`80331`). Use the local name of the place. Leave empty to search the whole country.

## `categories` (type: `array`):

Ready-made categories. Each one is mapped to the right OpenStreetMap tags (e.g. Tax advisors = office=tax_advisor).

## `osmTags` (type: `array`):

Advanced: any OpenStreetMap tag as `key=value`, e.g. `shop=bicycle`, `craft=electrician`, `office=*` (any value). Combined with the categories above. Full list: https://wiki.openstreetmap.org/wiki/Map_features

## `nameContains` (type: `string`):

Optional: keep only businesses whose name contains this text (case-insensitive), e.g. `Bio` or `Solar`.

## `maxResults` (type: `integer`):

Maximum number of businesses in total (all locations together). When more are found, the ones with a website and a phone number come first.

## `requireWebsite` (type: `boolean`):

Skip businesses that have no website in OpenStreetMap.

## `includeLeadsWithoutContact` (type: `boolean`):

Also return businesses where no email, phone, VAT ID or register number was found (name and address only). These rows are free.

## `visitWebsites` (type: `boolean`):

Visit each business website (start page, Impressum / legal notice, contact page) to add legal name, VAT ID, register number, emails, phones and social profiles. Turn off to get only the OpenStreetMap listing.

## `maxPagesPerWebsite` (type: `integer`):

The start page plus the most useful sub-pages (Impressum, contact, about us). 3–4 is enough for almost every small business website.

## `emailMode` (type: `string`):

`generic` returns only company mailboxes such as info@, kontakt@, praxis@, office@ (GDPR-friendly). `all` also returns emails that look like a named person (max.mustermann@...). Only choose `all` if you have a lawful basis to process them.

## `includeManagingDirectors` (type: `boolean`):

Adds the names written next to "Geschäftsführer", "Inhaber", "Vorstand", "Directie" or "Gérant" on the legal notice page. These are personal data: only turn this on if you have a lawful basis (GDPR) to process them.

## `respectRobotsTxt` (type: `boolean`):

Skip website pages that the website's robots.txt does not allow to crawl. Recommended.

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

How many website pages are downloaded in parallel (across different websites).

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

Usually not needed: small business websites rarely block. Turn on Apify Proxy if many websites come back as `blocked`.

## `overpassEndpoint` (type: `string`):

Optional: your own Overpass API URL (e.g. `https://overpass.example.com/api/interpreter`). By default the public OpenStreetMap servers are used, with automatic fallback.

## Actor input object example

```json
{
  "country": "DE",
  "locations": [
    "Leipzig"
  ],
  "categories": [
    "tax_advisor"
  ],
  "osmTags": [],
  "maxResults": 100,
  "requireWebsite": false,
  "includeLeadsWithoutContact": true,
  "visitWebsites": true,
  "maxPagesPerWebsite": 4,
  "emailMode": "generic",
  "includeManagingDirectors": false,
  "respectRobotsTxt": true,
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Leipzig"
    ],
    "categories": [
        "tax_advisor"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eurodata-tools/dach-business-leads").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 = {
    "locations": ["Leipzig"],
    "categories": ["tax_advisor"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("eurodata-tools/dach-business-leads").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 '{
  "locations": [
    "Leipzig"
  ],
  "categories": [
    "tax_advisor"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call eurodata-tools/dach-business-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eurodata-tools/dach-business-leads"
        }
    }
}
```

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/AhCUtaaiVoNpARgIL/builds/PmCRdL5JnpeFBY8nW/openapi.json
