# Das Oertliche Scraper (`automation-lab/das-oertliche-scraper`) Actor

🇩🇪 Scrape Das Örtliche by keyword and city for German business leads with names, addresses, phones, websites, emails, ratings, and profile URLs.

- **URL**: https://apify.com/automation-lab/das-oertliche-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Das Oertliche Scraper

Extract public German local-business listings from Das Örtliche by keyword and city. Use it to build lead lists, verify contact details, and enrich CRM or local SEO workflows with structured business data.

### What does Das Oertliche Scraper do?

Das Oertliche Scraper searches `dasoertliche.de` result pages and saves public business listings to an Apify dataset.

It can:

- 🔎 Search by business keyword and German city
- 🧾 Read existing Das Örtliche result URLs
- ☎️ Extract public phone and fax numbers
- 🌐 Open profile pages for public website and email links
- 📍 Parse address components such as street, postal code, city, and district
- ⭐ Capture rating and review count when visible
- 🧹 Deduplicate overlapping leads by profile URL and phone

### Who is it for?

This actor is designed for teams that need German local directory data in a repeatable workflow.

- 💼 B2B sales teams building local prospect lists
- 📈 Local SEO agencies mapping competitors and citations
- 🧑‍💼 Recruiters and staffing teams researching regional employers
- 🏢 Market researchers sizing city-level business categories
- 🧰 Data teams enriching CRM records with public directory fields

### Why use it?

Manual Das Örtliche searches are fine for a few contacts, but they do not scale. This actor turns repeated searches into a structured dataset with consistent fields, export formats, and API access.

Use it when you need:

- Faster lead collection across many cities
- A repeatable enrichment process
- Standard JSON, CSV, Excel, or API output
- A transparent source URL for every record
- Optional profile-page enrichment for public email and website links

### What data can it extract?

| Field | Description |
| --- | --- |
| `name` | Business or professional name |
| `profileUrl` | Das Örtliche detail page URL |
| `category` | Main category shown in the result |
| `categories` | Category/snippet terms split into a list |
| `streetAddress` | Street and house number when parsed |
| `postalCode` | German postal code |
| `city` | City from the listing |
| `district` | District/neighborhood when shown |
| `phone` | Public telephone number |
| `fax` | Public fax number when available |
| `email` | Public email from the profile page when available |
| `website` | Public website from the profile page when available |
| `rating` | Public rating score when visible |
| `reviewCount` | Number of public reviews when visible |
| `openingStatus` | Opening-hours status text when visible |
| `sourceKeyword` | Keyword used for the search |
| `sourceCity` | City used for the search |
| `position` | Search result position |
| `scrapedAt` | ISO timestamp of extraction |

### How much does it cost to scrape Das Örtliche leads?

The actor uses pay-per-event pricing.

- A small start event is charged once per run.
- A result event is charged for each saved listing.
- Your final run cost depends on `maxItems`, detail enrichment, and proxy settings.

For the cheapest first run, keep `maxItems` low and leave proxy disabled unless you see rate limiting.

### How to use Das Oertliche Scraper

1. Open the actor on Apify.
2. Enter one or more `keywords`, for example `Zahnarzt` or `Steuerberater`.
3. Enter one or more German `cities`, for example `Berlin` or `München`.
4. Set `maxItems` to the number of listings you need.
5. Keep `includeDetails` enabled if you need public website and email fields.
6. Run the actor.
7. Export the dataset as JSON, CSV, Excel, XML, or HTML.

### Input options

#### Keywords

Use business categories, services, professions, or company types.

Examples:

- `Zahnarzt`
- `Steuerberater`
- `Rechtsanwalt`
- `Physiotherapie`
- `Friseur`

#### Cities

Use German cities or localities supported by Das Örtliche.

Examples:

- `Berlin`
- `Hamburg`
- `München`
- `Köln`
- `Dresden`

#### Exact keyword/city pairs

Use `searchQueries` when each keyword should only run against a specific city.

```json
[
  { "keyword": "Steuerberater", "city": "München" },
  { "keyword": "Zahnarzt", "city": "Berlin" }
]
```

#### Start URLs

You can paste Das Örtliche result URLs directly.

```json
[
  { "url": "https://www.dasoertliche.de/?form_name=search_nat&kw=Zahnarzt&ci=Berlin" }
]
```

### Example input

```json
{
  "keywords": ["Zahnarzt"],
  "cities": ["Berlin"],
  "maxItems": 50,
  "includeDetails": true,
  "useApifyProxy": false
}
```

### Example output

```json
{
  "name": "KU64 Dr. Ziegler & Partner",
  "profileUrl": "https://www.dasoertliche.de/?form_name=detail&id=...",
  "category": "Zahnärzte",
  "streetAddress": "Kurfürstendamm 64",
  "postalCode": "10707",
  "city": "Berlin",
  "district": "Charlottenburg",
  "phone": "030 8 64 73 20",
  "email": "info@example.de",
  "website": "http://example.de",
  "sourceKeyword": "Zahnarzt",
  "sourceCity": "Berlin",
  "position": 1,
  "scrapedAt": "2026-07-03T00:00:00.000Z"
}
```

### Tips for better results

- Use German business terms rather than broad English categories.
- Start with one city and a small `maxItems` value.
- Enable proxy only if direct requests are rate-limited.
- Use exact `searchQueries` for carefully planned regional campaigns.
- Keep `includeDetails` enabled when email and website fields matter.

### Lead generation workflows

Common workflows include:

- Build a list of dentists in Berlin.
- Find tax advisors in Munich.
- Map tradespeople across several German cities.
- Enrich CRM rows with public website and phone fields.
- Compare local competitors for agency audits.

### Local SEO workflows

Agencies can use the actor to check category coverage, discover competitors, and build citation-audit source lists.

Useful columns for SEO work:

- `name`
- `category`
- `address`
- `phone`
- `website`
- `profileUrl`

### CRM enrichment workflows

Export results to CSV or call the Apify API to feed records into HubSpot, Pipedrive, Salesforce, Airtable, Google Sheets, or a warehouse.

Match records by:

- Company name
- Phone number
- Website domain
- Postal code and city

### Integrations

Apify datasets can connect to many tools.

- 📊 Google Sheets for review and cleanup
- 🧲 CRM systems for sales outreach
- 🗄️ BigQuery or Snowflake for analysis
- 🔁 Make, Zapier, or n8n for automations
- 🧪 Custom Node.js or Python scripts through the Apify API

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/das-oertliche-scraper').call({
  keywords: ['Zahnarzt'],
  cities: ['Berlin'],
  maxItems: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Using the API with Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/das-oertliche-scraper').call(run_input={
    'keywords': ['Zahnarzt'],
    'cities': ['Berlin'],
    'maxItems': 50,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Using cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~das-oertliche-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"keywords":["Zahnarzt"],"cities":["Berlin"],"maxItems":50}'
```

### MCP usage

Use this actor through Apify MCP tools in Claude Code, Claude Desktop, or compatible MCP clients.

MCP tool URL:

```text
https://mcp.apify.com/?tools=automation-lab/das-oertliche-scraper
```

Add it in Claude Code:

```bash
claude mcp add apify-das-oertliche https://mcp.apify.com/?tools=automation-lab/das-oertliche-scraper
```

Claude Desktop JSON config example:

```json
{
  "mcpServers": {
    "apify-das-oertliche": {
      "url": "https://mcp.apify.com/?tools=automation-lab/das-oertliche-scraper"
    }
  }
}
```

Example prompts:

- "Run Das Oertliche Scraper for tax advisors in Munich and summarize the top websites."
- "Find 100 dentists in Berlin and return a CSV-ready table."
- "Compare categories for electricians in Hamburg from Das Örtliche results."

### Proxy and reliability notes

Direct HTTP is used by default to reduce cost. If Das Örtliche rate-limits your workload, enable Apify Proxy and start with a low-cost proxy group before using residential proxies.

The actor retries transient HTTP errors and skips detail enrichment failures without losing the base listing.

### FAQ and troubleshooting

#### Why are email or website fields empty?

Not every Das Örtliche listing exposes email or website links. Keep `includeDetails` enabled, and remember that the actor only extracts public links visible on the profile page.

#### Why did I get fewer rows than `maxItems`?

The source may have fewer matching listings than requested, or duplicate records may be removed when searches overlap.

#### Why does a city return no results?

Check the spelling and try the same keyword/city on Das Örtliche manually. Some smaller locations may require nearby city names.

### Data freshness

Each run fetches current public pages from Das Örtliche and saves a `scrapedAt` timestamp. Schedule runs if you need recurring refreshes.

### Legality and responsible use

This actor extracts publicly available business directory information. You are responsible for using the data lawfully, respecting applicable privacy, database, anti-spam, and terms-of-service requirements. Do not use scraped contact data for unlawful outreach.

### Related scrapers

You may also find these automation-lab actors useful:

- https://apify.com/automation-lab/das-telefonbuch-business-scraper
- https://apify.com/automation-lab/gelbeseiten-scraper
- https://apify.com/automation-lab/goyellow-business-directory-scraper
- https://apify.com/automation-lab/11880-local-business-directory-scraper

### Changelog

Initial version extracts Das Örtliche result listings with optional profile-page enrichment.

### Support

If you need a field that is visible on Das Örtliche but not returned by this actor, open an Apify issue with an example URL and expected field.

# Actor input Schema

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

Business type, profession, company category, or service to search for on Das Örtliche.

## `cities` (type: `array`):

German cities or locations to combine with every keyword.

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

Optional list of exact searches. Use this when each keyword should be paired with a specific city.

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

Optional Das Örtliche search result URLs. URLs should include kw and ci parameters.

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

Maximum business listings to save across all searches.

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

Fetch each Das Örtliche profile page to extract public email, website, and extra contact fields when available.

## `includeWebsiteEmail` (type: `boolean`):

Compatibility alias for detail enrichment. Keep enabled if you mainly need public email and website fields.

## `useApifyProxy` (type: `boolean`):

Enable Apify Proxy if Das Örtliche rate-limits your run. Direct HTTP is used by default to keep costs low.

## `proxyGroups` (type: `array`):

Optional Apify Proxy groups, for example SHADER or RESIDENTIAL. Leave empty for automatic proxy selection.

## Actor input object example

```json
{
  "keywords": [
    "Zahnarzt"
  ],
  "cities": [
    "Berlin"
  ],
  "searchQueries": [
    {
      "keyword": "Steuerberater",
      "city": "München"
    }
  ],
  "startUrls": [
    {
      "url": "https://www.dasoertliche.de/?form_name=search_nat&kw=Zahnarzt&ci=Berlin"
    }
  ],
  "maxItems": 20,
  "includeDetails": true,
  "includeWebsiteEmail": true,
  "useApifyProxy": false,
  "proxyGroups": [
    "SHADER"
  ]
}
```

# 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 = {
    "keywords": [
        "Zahnarzt"
    ],
    "cities": [
        "Berlin"
    ],
    "searchQueries": [
        {
            "keyword": "Steuerberater",
            "city": "München"
        }
    ],
    "startUrls": [
        {
            "url": "https://www.dasoertliche.de/?form_name=search_nat&kw=Zahnarzt&ci=Berlin"
        }
    ],
    "maxItems": 20,
    "includeDetails": true,
    "includeWebsiteEmail": true,
    "useApifyProxy": false,
    "proxyGroups": [
        "SHADER"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/das-oertliche-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 = {
    "keywords": ["Zahnarzt"],
    "cities": ["Berlin"],
    "searchQueries": [{
            "keyword": "Steuerberater",
            "city": "München",
        }],
    "startUrls": [{ "url": "https://www.dasoertliche.de/?form_name=search_nat&kw=Zahnarzt&ci=Berlin" }],
    "maxItems": 20,
    "includeDetails": True,
    "includeWebsiteEmail": True,
    "useApifyProxy": False,
    "proxyGroups": ["SHADER"],
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/das-oertliche-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 '{
  "keywords": [
    "Zahnarzt"
  ],
  "cities": [
    "Berlin"
  ],
  "searchQueries": [
    {
      "keyword": "Steuerberater",
      "city": "München"
    }
  ],
  "startUrls": [
    {
      "url": "https://www.dasoertliche.de/?form_name=search_nat&kw=Zahnarzt&ci=Berlin"
    }
  ],
  "maxItems": 20,
  "includeDetails": true,
  "includeWebsiteEmail": true,
  "useApifyProxy": false,
  "proxyGroups": [
    "SHADER"
  ]
}' |
apify call automation-lab/das-oertliche-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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