# Gelbe Seiten Scraper & API - German Business Leads & Emails (`rel8ble/gelbe-seiten-scraper`) Actor

Gelbe Seiten scraper and API: German B2B leads from gelbeseiten.de by category (Branche) and city. One result = one business: name, phone, email, website, address, rating, reviews, opening hours, services, fax, social links. Emails included. No login, no start fee. $1.20 per 1,000.

- **URL**: https://apify.com/rel8ble/gelbe-seiten-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.20 / 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/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

## Gelbe Seiten Scraper & API - German Business Leads & Emails

This **Gelbe Seiten scraper** turns gelbeseiten.de, Germany's biggest business directory, into clean **B2B lead lists**: give it categories (Branchen) like `Elektriker`, `Steuerberater` or `Zahnarzt` and German cities, and get one row per business with **name, phone, email, website, full address, rating and reviews, opening hours, fax, social links, services, payment methods and coordinates**, as JSON, CSV or Excel.
Use it as a **Gelbe Seiten API**, a **German business directory scraper**, a **Germany lead generation** tool for cold outreach and sales prospecting, or a **gelbeseiten.de email extractor** from your own code, Make, Zapier or n8n.

It reads the public category pages and business pages over plain HTTP, with **no headless browser and no login**. 120 businesses with email and opening hours take about 8 seconds.

### What you get

- **Contact**: business name, phone (as listed and in +49 format), email, website, fax, Facebook / Instagram / LinkedIn links.
- **Address**: street, postal code (PLZ), city, district, one-line address, latitude and longitude, distance from the city centre.
- **Reputation**: average rating and number of reviews.
- **Business profile**: main category and all categories, services / keywords (Leistungsumfang), description, opening hours per day, payment methods, schema.org business type (Dentist, Electrician, Attorney ...), logo, premium-listing flag, last-updated date.
- **Search context**: the category and city that found it, its position in the Gelbe Seiten results and how many businesses that search lists.

### Sample output

Real rows from the prefilled cloud run (`Elektriker` in Berlin, 20 businesses), a few of the 38 fields:

| name | category | phone | email | website | city | rating |
|---|---|---|---|---|---|---|
| Bahrke Elektroinstallation u. -geräte GmbH | Elektroinstallationen | 030 82 70 30 30 | bahrke-berlin@t-online.de | bahrke-elektro.de | 10713 Berlin | 5.0 (2) |
| Herzog Elektro-Anlagen GmbH | Elektroinstallationen | 030 7 65 92 90 | info@herzog-elektro.de | herzog-elektro.de | 12309 Berlin | 4.8 (2) |
| EF-ES-WE Elektroanlagen GmbH | Elektroinstallationen | 030 6 90 08 00 | kontakt@efeswe.de | efeswe.de | 13503 Berlin | 4.8 (39) |
| Griesbach Elektroanlagen | Elektroinstallationen | 030 78 71 81 31 | info@elektro-griesbach.de | elektro-griesbach.de | 12103 Berlin | 4.7 (17) |
| Elektro-Anlagen Südwest Elektromeister GmbH | Elektroinstallationen | 030 80 90 84 80 | info@e-a-s.berlin | e-a-s-gmbh.de | 14167 Berlin | 4.8 (314) |

All 20 rows of that run have a phone number and an email. Fill rates in a bigger 120-business test (`Steuerberater` and `Zahnarzt` in München and Hamburg): phone, address and coordinates 100%, **email 93%**, website 90%, services 73%, opening hours 62%, rating 23%, fax 23%, social links 13%.

### Use cases

- **B2B lead generation in Germany**: build call and email lists of tradespeople, tax advisors, lawyers, dentists, agencies or any other Branche, city by city
- **Sales territory planning**: count and map every business of a category in your cities (coordinates included)
- **Local SEO and marketing agencies**: find businesses without a website, with few reviews or with a low rating, and pitch them
- **Market research**: compare how many providers a category has across German cities, and what services they list
- **CRM enrichment**: add phone, email, website, hours and address to the companies you already track

### Pricing

**$1.20 per 1,000 businesses** (pay per result; one result = one business saved to the dataset). The two most-used Gelbe Seiten scrapers on the Store charge $2.00 and $1.40 per 1,000, plus a start fee per run.

| You scrape | You pay |
|---|---|
| 100 businesses | $0.12 |
| 1,000 businesses | $1.20 |
| 10,000 businesses | $12.00 |
| 100,000 businesses | $120.00 |

No start fee, and the same price with or without the business-page details (emails, hours, fax). The Apify free plan's $5 monthly credit covers about 4,150 businesses. The prefilled input (`Elektriker` in Berlin, 20 businesses with emails) costs $0.024 and took about 6 seconds in a cloud test. Businesses skipped by your filters, duplicates, categories that do not exist, removed listings and failed requests are never charged. If you set a maximum cost per run, the scraper stops cleanly when it reaches it.

#### Why this one

- **Cheaper than the most-used Gelbe Seiten scrapers**, with no start fee.
- **Emails at the same price**: each business page is opened for email, fax, opening hours and services.
- **Filters before you pay**: keep only businesses with an email, a website, a phone number or a minimum rating.
- **Ready for your CRM**: phone in +49 format, full address, coordinates and every category in each row.
- **Fast and light**: plain HTTP, no browser, no login; 120 businesses with emails in about 8 seconds.

### FAQ

**Does it need a browser, cookies or a Gelbe Seiten account?**
No. Plain HTTPS requests to the public pages, no login.

**Which proxy should I use?**
None: leave the default. The actor connects directly and retries any blocked request through Apify Proxy automatically (datacenter, then German residential).

**Is scraping Gelbe Seiten legal?**
The actor only reads public business listings that robots.txt allows. You are responsible for how you use the data: business contact data of sole traders can count as personal data under the GDPR, and German law (UWG) restricts unsolicited advertising emails and calls, so check your outreach before sending.

**Why is my category not found?**
Gelbe Seiten uses fixed German category names. Open gelbeseiten.de, search your category in your city, and paste the resulting `/branchen/...` URL into **Gelbe Seiten URLs**; if the page you land on is a `/suche/...` URL, it is a free-text search and cannot be scraped.

**Is there a cheaper mode without business pages?**
The price per business is the same; turning `scrapeDetails` off only makes the run faster (about 50 businesses per request instead of one request per business) and returns fewer emails.

### How to use

1. Type **Categories (Branchen)** in German, one per line: `Elektriker`, `Steuerberater`, `Zahnarzt`, `Restaurant`, `Immobilienmakler` ... Plurals are tried as singular automatically (`Hotels` -> `hotel`).
2. Type **Locations**, one per line: `Berlin`, `München`, `Frankfurt am Main`, `Berlin Mitte`. Every category is searched in every location.
3. Or paste **Gelbe Seiten URLs**: category pages (`https://www.gelbeseiten.de/branchen/elektriker/berlin`) and single business pages (`https://www.gelbeseiten.de/gsbiz/...`).
4. Set **Max businesses per category + city** (0 = every listing), keep **Open each business page** on for emails, and add filters if you only want businesses with an email, a website, a phone number or a minimum rating.
5. Click **Start** and download the leads from the **Output** tab, or fetch them through the Apify API.

### Input

| Field | Default | Description |
|---|---|---|
| `categories` | - | Gelbe Seiten categories in German, e.g. `Elektriker`, `Steuerberater` |
| `locations` | - | German cities or districts, e.g. `Berlin`, `München`, `Berlin Mitte` |
| `startUrls` | - | Category pages (`/branchen/<category>/<city>`) or business pages (`/gsbiz/<id>`) |
| `maxResultsPerSearch` | 100 | Businesses per category-city pair. 0 = all (up to 5,000) |
| `scrapeDetails` | true | Open each business page for email, fax, hours, services, geo |
| `requireEmail` / `requireWebsite` / `requirePhone` | false | Only keep businesses with that contact field |
| `minRating` | - | Only keep businesses rated at least this (0-5) |

With no input at all, a 20-business demo (Elektriker in Berlin) runs.

### Input example

```json
{
    "categories": ["Steuerberater", "Zahnarzt"],
    "locations": ["München", "Hamburg"],
    "startUrls": ["https://www.gelbeseiten.de/branchen/rechtsanwalt/frankfurt%20am%20main"],
    "maxResultsPerSearch": 100,
    "scrapeDetails": true,
    "requireEmail": true
}
```

### Output example

```json
{
    "id": "ffa71c1c-ee1c-4f3d-90ed-f35f5eac5a40",
    "name": "hansezahn I HAMBURG, Dr. Janke und Partner, Zahnärzte",
    "category": "Zahnärzte",
    "categories": ["Zahnärzte", "Schwerpunkt Endodontie", "Implantologie"],
    "phone": "040 6 53 99 82",
    "phoneE164": "+49406539982",
    "fax": "040 6 54 76 54",
    "email": "info@hansezahn-hh.de",
    "website": "http://www.hansezahn-hh.de",
    "socialLinks": ["https://www.facebook.com/hansezahn/?ref=settings"],
    "street": "Rodigallee 250",
    "postalCode": "22043",
    "city": "Hamburg",
    "country": "DE",
    "address": "Rodigallee 250, 22043 Hamburg",
    "latitude": 53.57074,
    "longitude": 10.125491,
    "distanceKm": 9.1,
    "rating": 4.7,
    "reviewCount": 3,
    "openingHours": ["Monday 08:00-19:00", "Tuesday 07:30-19:00", "Wednesday 07:30-18:30", "Thursday 07:30-18:00", "Friday 08:00-15:00"],
    "services": ["Brücken", "Implantologie", "Kronen", "Parodontologie", "Professionelle Zahnreinigung", "Wurzelkanalbehandlung"],
    "businessTypes": ["Dentist"],
    "premiumListing": true,
    "lastUpdated": "2026-05-03",
    "url": "https://www.gelbeseiten.de/gsbiz/ffa71c1c-ee1c-4f3d-90ed-f35f5eac5a40",
    "searchCategory": "Zahnarzt",
    "searchLocation": "Hamburg",
    "position": 9,
    "totalInSearch": 803,
    "detailsScraped": true,
    "scrapedAt": "2026-10-26T17:34:49.439Z"
}
```

(Shortened: rows also carry district, description, payment methods, logo, open-now text and the Gelbe Seiten participant number; services are cut here.)

The dataset has three views: **Leads**, **Details** and **Search order**. The `RUN_SUMMARY` record lists per category and city how many businesses Gelbe Seiten has, how many were saved, how many your filters skipped and why each search stopped, plus any category that does not exist.

### API example

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("rel8ble/gelbe-seiten-scraper").call(run_input={"categories": ["Steuerberater"], "locations": ["München", "Hamburg"], "maxResultsPerSearch": 200, "requireEmail": True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], "|", item["phone"], "|", item["email"])
```

One HTTP call that runs the actor and returns the rows (curl):

```bash
curl -X POST "https://api.apify.com/v2/acts/rel8ble~gelbe-seiten-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"categories": ["Elektriker"], "locations": ["Berlin"], "maxResultsPerSearch": 100}'
```

### Integrations

- **Our Website Contact Extractor**: pass the `website` column to collect more emails and social profiles from each company site.
- **Our Website Tech Stack Detector**: see which CMS, shop system or analytics each lead's website runs.
- **Make, Zapier and n8n**: run the actor and push the leads to your CRM, a mailing tool or Slack.
- **Google Sheets**: export the dataset straight to a spreadsheet.
- **Apify API**: start runs and download results over REST, or with the JavaScript and Python clients.
- **Webhooks**: get notified when a run finishes.
- **MCP for AI agents**: the Apify MCP server (https://mcp.apify.com) lets Claude, ChatGPT, Cursor and other agents call this Gelbe Seiten scraper as a tool.

### Limits

- **Categories, not free text.** The scraper uses Gelbe Seiten's category pages (`/branchen/<category>/<city>`); free-text searches (`/suche/...`) are not fetched because gelbeseiten.de's robots.txt excludes them. Use the German category name Gelbe Seiten uses (e.g. `zahnarzt`, not `dentist`). A category that does not exist for a city is listed in `RUN_SUMMARY` and costs nothing.
- **Germany only**, and the city or district must be one Gelbe Seiten knows (postal codes on their own are free-text searches and are skipped).
- **Emails, fax, hours and services** are only there when the business listed them; most emails come from the business page, so keep `scrapeDetails` on if you need them.
- **Up to 5,000 businesses per category-city pair.** For bigger cities, split by district (e.g. `Berlin Mitte`, `Berlin Pankow`).
- Gelbe Seiten sometimes lists the same business twice in one search; duplicates are saved once.

# Actor input Schema

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

What to search: Gelbe Seiten categories in German, one per line, e.g. "Elektriker", "Steuerberater", "Zahnarzt", "Restaurant", "Immobilienmakler". Every category is searched in every location below. Plural forms are tried as singular automatically ("Hotels" -> "hotel").

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

Where to search: German cities or city districts, one per line, e.g. "Berlin", "München", "Frankfurt am Main", "Berlin Mitte".

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

Optional. Category pages (https://www.gelbeseiten.de/branchen/elektriker/berlin) and/or single business pages (https://www.gelbeseiten.de/gsbiz/<id>), one per line. Use these instead of, or on top of, categories x locations.

## `maxResultsPerSearch` (type: `integer`):

Optional. Businesses saved per category-city pair, integer >= 0. Default 100; 0 = every listing (up to 5,000 per pair). You pay per business, so start small.

## `scrapeDetails` (type: `boolean`):

Optional boolean. true (default) = also open every business page for email, fax, social links, full opening hours, services, payment methods and coordinates. false = list data only (name, phone, website, address, rating): faster, fewer emails. Same price either way.

## `requireEmail` (type: `boolean`):

Optional filter. Skip businesses without an email address. Skipped businesses are not charged.

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

Optional filter. Skip businesses without a website. Skipped businesses are not charged.

## `requirePhone` (type: `boolean`):

Optional filter. Skip businesses without a phone number. Skipped businesses are not charged.

## `minRating` (type: `number`):

Optional filter, 0-5. Skip businesses rated below this (unrated businesses are skipped too). Skipped businesses are not charged.

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

Optional, advanced. Parallel requests, integer 1-20. Default 8. Leave unset.

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

Optional, advanced. Retries per failed or blocked request, integer 0-20; each retry uses a new session. Default 6.

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

Optional, advanced. Leave as is. Default {"useApifyProxy": false} = automatic: direct connection first, and only requests that get blocked are retried through Apify Proxy (datacenter, then German residential). Set your own Apify Proxy groups or proxy URLs to force them for every request.

## Actor input object example

```json
{
  "categories": [
    "Elektriker"
  ],
  "locations": [
    "Berlin"
  ],
  "maxResultsPerSearch": 20,
  "scrapeDetails": true,
  "requireEmail": false,
  "requireWebsite": false,
  "requirePhone": false,
  "maxConcurrency": 8,
  "maxRequestRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `businesses` (type: `string`):

One row per business: name, phone, email, website, address, rating, opening hours, services and categories.

## `summary` (type: `string`):

Counts per category and city, filtered businesses and any input that is not a Gelbe Seiten category.

# 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 = {
    "categories": [
        "Elektriker"
    ],
    "locations": [
        "Berlin"
    ],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/gelbe-seiten-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 = {
    "categories": ["Elektriker"],
    "locations": ["Berlin"],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

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

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

```

## CLI example

```bash
echo '{
  "categories": [
    "Elektriker"
  ],
  "locations": [
    "Berlin"
  ],
  "maxResultsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rel8ble/gelbe-seiten-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rel8ble/gelbe-seiten-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ackyhOkxVHnbpMhU7/builds/RkHnWmzhHdVdIDo4k/openapi.json
