# German Estate Agent Leads — Verified Makler Emails & Phone (`programmx/immoscout24-agent-leads`) Actor

Contact database of German estate agencies from ImmobilienScout24 Impressum data: company name, verified email, phone, registered address, owners, VAT ID. One row per agency.

- **URL**: https://apify.com/programmx/immoscout24-agent-leads.md
- **Developed by:** [Yasir Azeem](https://apify.com/programmx) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 agency verified emails

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

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

## What's an Apify Actor?

Actors are 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

## German Estate Agent Leads — Verified Makler Emails, Phone & Company Data

![How the Immobilienmakler lead scraper works: pick cities or regions, one row per agency, emails verified live](https://raw.githubusercontent.com/PTechFusion/programmx-actor-assets/main/immoscout24-how-it-works.png)

Build a **contact database of German estate agents (Immobilienmakler)** from ImmobilienScout24: company name, business email with a live deliverability status, phone, registered address, agency rating and ImmoScout membership tier — **one row per agency**, never one per listing.

Every record comes from the **Impressum** that German businesses are legally required to publish under [§5 DDG](https://www.gesetze-im-internet.de/ddg/__5.html) (formerly §5 TMG) and §18 MStV. That is why the email is there at all: it is a legal disclosure, not something an agency opted into. In testing, **100% of returned agencies carried a business email**.

> **Read the [Compliant use](#compliant-use--please-read-before-you-buy) section before buying.** Under German **UWG §7**, unsolicited commercial email to these contacts is **not permitted without prior consent**. This is a database for CRM enrichment, phone and postal outreach, ABM and account research — **not** a cold-email list. We are explicit about this because the alternative is selling you something you cannot legally use.

### What this German estate agent scraper extracts

For every unique agency:

- **Company name** — as registered in the Impressum
- **Business email** and a **`emailStatus`** of `valid`, `risky`, `undeliverable` or `unknown`
- **Phone number**
- **Registered address** — street with house number, postcode, city, region
- **Website** where the agency publishes one
- **Rating and review count** on ImmoScout — a real quality signal, not a vanity metric
- **Membership tier** (Gold, Premium…) — identifies agencies paying for visibility
- **Source URL**, **first-seen** date and **scraped-at** timestamp

Anything an agency has not published comes back as `null`. **Nothing is ever pattern-generated** — no `firstname@domain` guessing, because a fabricated address breaks both the legal basis and the accuracy claim.

### Verified emails, and what "verified" honestly means

Every captured address is checked live against the receiving mail server. The result is on the row:

| `emailStatus` | Meaning |
|---|---|
| `valid` | The mailbox was confirmed to accept mail. |
| `risky` | The domain is **catch-all** — it accepts every address, so acceptance proves nothing. |
| `undeliverable` | Confirmed dead. **Discarded, never delivered, never billed.** |
| `unknown` | No determination was possible, or verification was switched off. |

Only `valid` bills at the verified rate. A catch-all domain is *not* sold to you as verified, because that is precisely how a "verified" list ends up bouncing.

### One row per agency, not one per listing

An agency advertising 200 properties is **one lead, not 200 rows**. German Estate Agent Leads deduplicates on ImmoScout's own stable agency identifier, so multi-branch firms collapse to a single record and you are billed once. Repeat runs of a saved task carry a `firstSeen` date, so you can tell genuinely new agencies from ones you already hold.

### Coverage

Sixteen major German markets: Berlin, Hamburg, München, Köln, Frankfurt am Main, Stuttgart, Düsseldorf, Leipzig, Dresden, Hannover, Nürnberg, Essen, Bremen, Bielefeld, Heidelberg and Potsdam. Berlin alone lists over 600 agencies. Every city you select is crawled in full, page by page, until the directory is exhausted.

### How to use

1. **Pick your cities.** Start with one — Berlin is the deepest — and widen once the data looks right for your use case.
2. **Set Max unique agencies.** This caps both the results and the bill.
3. **Leave verification on.** You only pay the higher rate for addresses that actually verify.
4. **Run.** Directory pages are read in a browser; every agency profile is then fetched over plain HTTP, which is what keeps this cheap.
5. **Export** as CSV, Excel or JSON from the [Apify dataset](https://docs.apify.com/platform/storage/dataset), or pull it via API into HubSpot, Airtable, Google Sheets, or anything reachable from Zapier, Make or n8n.
6. **Schedule it** — [set up a recurring run](https://docs.apify.com/platform/schedules) and use `firstSeen` to isolate agencies that are new since last time.

### Pricing

| You get | Price |
|---|---|
| Agency with a **verified** email (`valid`) | **$0.03** — $30 per 1,000 |
| Agency with a published but unverified email | **$0.02** — $20 per 1,000 |
| Agency with no published email | **Free** — returned only if you ask for them |

You are billed **per unique agency**, never per listing, per page or per request. Confirmed-dead addresses are discarded and cost you nothing. Free actor starts.

#### What a real run costs

A **500-agency sweep of Berlin**, with verification left on. Say 400 of those addresses come back `valid` and 100 land as `risky` (catch-all domains) or `unknown`:

| Line | Count | Rate | Cost |
|---|---|---|---|
| Agencies with a verified (`valid`) email | 400 | $0.03 | $12.00 |
| Agencies with an unverified email (`risky` / `unknown`) | 100 | $0.02 | $2.00 |
| Confirmed-dead addresses, discarded | — | free | $0.00 |
| Actor start | 1 | $0.00005 | $0.00 |
| **Total** | **500 leads** | | **$14.00** |

The 400/100 split above is an illustration, not a promise — your actual bill follows the verification result on each row, and you can see the exact counts in the run summary. The ceiling is fixed regardless: 500 agencies can never cost more than 500 × $0.03 = **$15.00**, and `maxAgencies` is the hard cap on both results and spend.

### Input example

Copy this into the **JSON** tab of the input editor:

```json
{
  "cities": ["berlin"],
  "maxAgencies": 500,
  "verifyEmails": true,
  "onlyWithEmail": true
}
```

Several markets at once, including agencies that published no email address:

```json
{
  "cities": ["berlin", "hamburg", "muenchen", "koeln", "frankfurt-am-main"],
  "maxAgencies": 2000,
  "verifyEmails": true,
  "onlyWithEmail": false
}
```

### Output example

```json
{
  "agencyId": "escon-gmbh",
  "companyName": "ESCON GmbH",
  "street": "Olivaer Platz 16",
  "postcode": "10707",
  "city": "Berlin",
  "region": "berlin",
  "phone": "+49 30 809331638",
  "email": "anfrage@escon-objekte.de",
  "emailStatus": "valid",
  "website": "escon-objekte.de",
  "rating": 4.4,
  "reviewCount": 66,
  "membership": "Gold",
  "sourceUrl": "https://www.immobilienscout24.de/anbieter/profil/escon-gmbh/escon-gmbh",
  "firstSeen": "2026-08-07T09:12:44.000Z",
  "scrapedAt": "2026-08-07T09:12:44.000Z"
}
```

### Compliant use — please read before you buy

German law treats email marketing more strictly than the UK or US, and this matters for how you can use this data.

- **Unsolicited commercial email is not permitted under UWG §7** without the recipient's prior consent — including business-to-business. There is no "legitimate interest" route to cold email in Germany equivalent to the UK's PECR corporate-subscriber rule.
- **What this data is properly for:** enriching records you already hold, verifying that a contact is still reachable before you call, phone and postal outreach, account research and ABM targeting, market and competitor mapping, and nurture to people who have consented.
- **Under UK GDPR / DSGVO**, you are the controller of what you do with these records. You need your own lawful basis, you must honour opt-outs, and Art. 14 notification duties may apply to data you obtained indirectly.
- **What we do not do:** we take only what is published in a legally-mandated public disclosure. No logins, no scraped private data, no invented addresses.

This is a description of the framework, not legal advice — if you are running outreach at scale in Germany, take advice on your specific programme.

### FAQ

#### How do I get contact details for German estate agents?

Run German Estate Agent Leads on the cities you care about. It reads the Impressum data that German businesses must publish by law and returns it as structured rows — company name, email, phone and registered address — deduplicated to one row per agency.

#### Are the email addresses verified?

Yes. Each address is checked live and carries an `emailStatus`. Only addresses confirmed to accept mail are marked `valid`. Catch-all domains are marked `risky` rather than passed off as verified, and confirmed-dead addresses are discarded before you ever see them.

#### Can I cold-email these German estate agents?

**No — not without prior consent.** UWG §7 prohibits unsolicited commercial email in Germany, including B2B. Use these records for CRM enrichment, phone or postal outreach, and ABM instead. See [Compliant use](#compliant-use--please-read-before-you-buy).

#### How is this different from an ImmoScout24 property scraper?

Property scrapers return listings. This returns the **agency behind the listings** as a contact record, deduplicated so a firm with 200 properties is one lead rather than 200 rows.

#### Can I export the leads to my CRM?

Yes — CSV, Excel or JSON straight from the dataset, or via the API into HubSpot, Airtable, Google Sheets, Zapier, Make or n8n.

#### Which German cities are covered?

Sixteen major markets including Berlin, Hamburg, München, Köln and Frankfurt. Berlin alone carries over 600 agencies.

#### How do I find only agencies that are new since last week?

Save your configuration as a task and schedule it. Each row carries a `firstSeen` date, so anything stamped since your last run is new.

#### Is it legal to collect this data?

It reads only the Impressum — a disclosure German businesses are legally required to publish, with no login and no private data involved. How you then use it is your responsibility, and UWG §7 constrains email specifically. Not legal advice.

### Häufige Fragen (auf Deutsch)

#### Wie bekomme ich eine Liste von Immobilienmaklern in Deutschland?

Wählen Sie die Städte aus, die Sie interessieren, und starten Sie den Actor. Sie erhalten eine strukturierte Maklerliste — Firmenname, E-Mail-Adresse, Telefonnummer und Anschrift — mit **einer Zeile pro Maklerbüro**, nicht pro Immobilienangebot.

#### Woher stammen die Kontaktdaten?

Ausschließlich aus dem **Impressum**, das deutsche Unternehmen nach [§5 DDG](https://www.gesetze-im-internet.de/ddg/__5.html) (ehemals §5 TMG) und §18 MStV veröffentlichen müssen. Es werden keine Adressen geraten oder aus Mustern erzeugt: Was nicht veröffentlicht wurde, bleibt `null`.

#### Sind die E-Mail-Adressen geprüft?

Ja. Jede Adresse wird live gegen den Mailserver geprüft und erhält den Status `valid`, `risky`, `undeliverable` oder `unknown`. Nur `valid` wird zum höheren Preis berechnet. Catch-all-Domains werden ehrlich als `risky` gekennzeichnet, nachweislich tote Adressen werden verworfen und nie berechnet.

#### Darf ich diese Makler per E-Mail anschreiben?

**Nein — nicht ohne vorherige Einwilligung.** Nach **UWG §7** ist unerwünschte Werbung per E-Mail in Deutschland unzulässig, auch im B2B-Bereich. Diese Datenbank ist für **CRM-Anreicherung, Telefon- und Postakquise, ABM und Marktrecherche** gedacht. Wir sagen das deutlich, weil das Gegenteil bedeuten würde, Ihnen etwas zu verkaufen, das Sie rechtlich nicht einsetzen dürfen.

#### Welche Städte werden abgedeckt?

16 große deutsche Märkte, darunter Berlin, Hamburg, München, Köln, Frankfurt am Main, Stuttgart und Düsseldorf. Allein Berlin umfasst über 600 Maklerbüros.

#### Was kostet die Maklerliste?

$0,03 pro Agentur mit verifizierter E-Mail ($30 pro 1.000), $0,02 bei unverifizierter Adresse. Agenturen ohne E-Mail sind kostenlos. Abgerechnet wird **pro Maklerbüro**, nie pro Angebot oder pro Seitenaufruf.

#### Kann ich die Daten in mein CRM exportieren?

Ja — als CSV, Excel oder JSON, oder direkt per API nach HubSpot, Airtable, Google Sheets, Zapier, Make oder n8n.

### Works together with

| Actor | What it gives you |
|---|---|
| **[Instantly Lead Pusher](https://apify.com/programmx/instantly-lead-pusher)** | Push a dataset into an Instantly.ai campaign or lead list without a CSV step. **For German contacts, use a lead list rather than a live campaign** — UWG §7 means these records are for enrichment and consented nurture, not cold sequences. |
| **[eBay Business Leads Scraper](https://apify.com/programmx/ebay-business-leads)** | Verified B2B contacts for eBay business sellers across Germany and the EU, from the DSA/GPSR trader disclosure — one row per seller. |
| **[Property Finder Scraper + AI Deal Score](https://apify.com/programmx/propertyfinder-deal-scraper)** | The same one-row-per-business idea applied to UAE property, with agent contacts in every row. |

***

*ProgrammX · [programmx.com](https://programmx.com) · hello@programmx.com*

# Actor input Schema

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

Which German cities to pull estate agents from. Berlin alone lists over 600 agencies. Each city is crawled independently, so more cities means a longer run and a larger bill — start with one and widen once the data looks right.

## `maxAgencies` (type: `integer`):

Hard cap on unique agencies returned — and the only thing you are billed for. Billing is per agency, never per listing or per page. Multi-branch firms are collapsed to a single row.

## `verifyEmails` (type: `boolean`):

On (recommended): every captured address is checked live and rows carry an emailStatus. Confirmed-deliverable rows bill at the verified rate; addresses that cannot be confirmed — including catch-all domains, which accept anything and so prove nothing — bill at the lower unverified rate. Confirmed-dead addresses are discarded and never billed. Off: nothing is checked and every row bills at the unverified rate.

## `onlyWithEmail` (type: `boolean`):

On (recommended): agencies whose Impressum publishes no email address are skipped. Turn off to also receive those rows — they are delivered free of charge, since only rows with an email are billable.

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

Parallel profile fetches. Higher is faster but heavier on the source; 4 is a good citizen.

## `requestDelayMs` (type: `integer`):

Politeness spacing. Lower it only if you know what you are doing.

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

German residential proxy is used by default and is effectively required — ImmobilienScout24 serves German visitors. Leave as-is unless you have a specific reason to change it.

## Actor input object example

```json
{
  "cities": [
    "berlin"
  ],
  "maxAgencies": 25,
  "verifyEmails": true,
  "onlyWithEmail": true,
  "maxConcurrency": 4,
  "requestDelayMs": 900,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per unique German estate agency: company name, email with its verification status, phone, registered address, owners, VAT ID and register entry. Fields the agency did not publish are null, never guessed. Use Export to download as CSV or Excel for a CRM or outreach tool.

# 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 = {
    "cities": [
        "berlin"
    ],
    "maxAgencies": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("programmx/immoscout24-agent-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 = {
    "cities": ["berlin"],
    "maxAgencies": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("programmx/immoscout24-agent-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 '{
  "cities": [
    "berlin"
  ],
  "maxAgencies": 25
}' |
apify call programmx/immoscout24-agent-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,programmx/immoscout24-agent-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/UfBnxmZoO3OMiFd5s/builds/X3gME9rbivBAslr3I/openapi.json
