# Real Estate Agent Leads (Immowelt, willhaben, Kleinanzeigen) (`mocha_tassel/real-estate-agent-leads`) Actor

Turns property listings into a ranked list of estate agencies: how many properties each one markets, total portfolio value, average price and market segment. Built for B2B prospecting, private sellers are excluded by default.

- **URL**: https://apify.com/mocha\_tassel/real-estate-agent-leads.md
- **Developed by:** [Niko T.](https://apify.com/mocha_tassel) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 agency profiles

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?

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

## Real Estate Agent Leads — Immowelt, willhaben & Kleinanzeigen

![real-estate-agent-leads](https://api.apify.com/v2/key-value-stores/yfnvtbimUC1yUnStx/records/real-estate-agent-leads.png?signature=iCeDR0hTVijGi08rEOc7)

A list of property listings is not a sales pipeline. This Actor turns listings into a **ranked list of the estate agencies behind them**, with the numbers that tell you which ones are worth approaching.

For each agency you learn how many properties it currently markets, what that portfolio is worth, its average and median price level, which market segment it operates in, and which cities and postal codes it covers.

### Who this is for

Anyone selling to estate agencies: CRM and portal software, photography and virtual tours, home staging, mortgage brokers, marketing agencies, valuation services. Instead of a flat directory, you get agencies sorted by how much business they actually do right now, in the exact region and price segment you care about.

It is equally useful for **competitive research**: who dominates a city, which segment each competitor sits in, how portfolio sizes shift over time when you run it monthly.

### What you get

```json
{
  "name": "CTR Löbtauer GmbH",
  "type": "agency",
  "portal": "immowelt",
  "contactPersons": ["Frau Heidrun Weingart"],
  "listingCount": 15,
  "portfolioValue": 7146629,
  "averagePrice": 476441.93,
  "medianPricePerSqm": 4210.5,
  "averageLivingArea": 96.4,
  "segment": "mid market",
  "imageUrl": "https://mms.immowelt.de/example/photo.jpg",
  "cities": ["Dresden"],
  "postalCodes": ["01067", "01069", "01187"],
  "sampleListings": [
    {
      "title": "3-Zimmer-Wohnung mit Balkon",
      "price": 389000,
      "url": "https://www.immowelt.de/expose/...",
      "imageUrl": "https://mms.immowelt.de/example/photo.jpg"
    }
  ],
  "collectedAt": "2026-08-10T15:19:09.777Z"
}
```

Sort by number of properties, portfolio value, average price or name. **Segment** is derived from the median price: `entry level`, `mid market`, `upper market` or `luxury`.

### How to set it up

1. Choose a portal and a location, or paste a **Search URL** copied from the portal.
2. Set **Listings to analyse** — this is what determines how complete your agency list is. For a mid-sized city, 500 to 1000 works well; a run over 250 Dresden listings surfaced 26 agencies.
3. Set **Minimum properties per agency** to 3 if you only want the professionally active ones.

### Pricing

You pay a small amount per listing analysed, plus a larger amount per agency in your results. The split reflects how the work actually happens: hundreds of listings have to be read to identify a few dozen agencies, and a city dominated by two large players would otherwise cost more to analyse than it returns.

### Proxies

German and Austrian property portals reject data-centre requests with HTTP 403, so the Actor uses Apify residential proxies from the matching country by default. You can supply your own instead.

### Data protection — please read

**Private sellers are excluded by default and this default exists for a reason.** Private sellers are natural persons. Under the GDPR their contact data must not be processed for marketing purposes without a legal basis, and unsolicited advertising to them is unlawful in Germany and Austria (§ 7 UWG / § 107 TKG).

The `Include private sellers` switch exists for legitimate cases such as market research and statistics. Turning it on does not create a legal basis — that remains your responsibility as the data controller.

For commercial agencies the situation is different: business contact data published on a portal for exactly the purpose of being contacted can, depending on the case, be processed under legitimate interest. Even then, B2B cold outreach rules still apply.

The Actor deliberately collects **only what the portal publishes on its own search result pages**. It does not log in, does not follow profile pages to harvest email addresses or phone numbers, and does not enrich data from other sources.

### Limitations

- Agencies are identified by the name shown on the listing card. An agency that uses several spellings may appear more than once.
- Portfolio value is the sum of asking prices of the listings found in this run, not the agency's total business.
- Contact persons are only included where the portal shows them on the result card.

***

### Auf Deutsch

Dieser Actor macht aus Immobilieninseraten eine **nach Geschäftsvolumen sortierte Maklerliste**: Wie viele Objekte vermarktet ein Anbieter gerade, welchen Wert hat dieses Portfolio, in welchem Preissegment arbeitet er, welche Orte und Postleitzahlen deckt er ab.

**Für wen:** Alle, die an Makler verkaufen — CRM- und Portalsoftware, Fotografie und Rundgänge, Home Staging, Finanzierungsvermittlung, Marketing, Wertermittlung. Statt eines Branchenverzeichnisses bekommen Sie Anbieter danach sortiert, wie viel Geschäft sie tatsächlich machen, und zwar genau in Ihrer Region und Ihrem Preissegment. Ebenso brauchbar für Wettbewerbsanalyse: Wer beherrscht eine Stadt, wie verschieben sich die Portfolios über die Monate.

**Datenschutz — bitte lesen:** Privatanbieter sind bewusst standardmäßig ausgeschlossen. Sie sind natürliche Personen; ihre Kontaktdaten dürfen ohne Rechtsgrundlage nicht zu Werbezwecken verarbeitet werden, unaufgeforderte Werbung ihnen gegenüber ist nach § 7 UWG bzw. § 107 TKG unzulässig. Der Schalter existiert für berechtigte Fälle wie Marktforschung — er schafft keine Rechtsgrundlage, dafür bleiben Sie als Verantwortlicher zuständig. Bei gewerblichen Anbietern sieht es anders aus: geschäftliche Kontaktdaten, die auf einem Portal genau zum Zweck der Kontaktaufnahme veröffentlicht sind, lassen sich je nach Fall auf ein berechtigtes Interesse stützen. Die Regeln für Kaltakquise im B2B gelten trotzdem weiter.

Erfasst wird ausschließlich, was das Portal auf seinen öffentlichen Ergebnisseiten selbst anzeigt. Kein Login, kein Abklappern von Profilseiten nach E-Mail-Adressen oder Telefonnummern, keine Anreicherung aus anderen Quellen.

**Kosten:** Ein kleiner Betrag je ausgewertetem Inserat, dazu ein höherer je gefundenem Anbieter. Diese Aufteilung bildet die tatsächliche Arbeit ab — für einige Dutzend Makler müssen hunderte Inserate gelesen werden.

# Actor input Schema

## `portal` (type: `string`):

Which portal to identify agencies from.

## `searchUrl` (type: `string`):

Paste any search URL from the portal. If set, the location and category fields below are ignored.

## `location` (type: `string`):

For Immowelt, a German city name such as Berlin, Munich (München) or Leipzig. For willhaben, an Austrian town or state such as Wien, Graz or Steiermark.

## `offerType` (type: `string`):

Whether to profile agencies marketing properties for sale or for rent.

## `estateType` (type: `string`):

Type of property. Applies to Immowelt only; willhaben and Kleinanzeigen use the category field instead.

## `category` (type: `string`):

For willhaben: eigentumswohnung, mietwohnung, haus-kaufen, haus-mieten, grundstuecke. For Kleinanzeigen: mietwohnung, eigentumswohnung, haus-mieten, haus-kaufen, grundstueck.

## `locationSlug` (type: `string`):

The location exactly as it appears in the Kleinanzeigen URL, for example karlsruhe.

## `locationCode` (type: `string`):

The code starting with l from the Kleinanzeigen URL, for example l9186 for Karlsruhe.

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

The more listings are analysed, the more complete the agency list and the more accurate the portfolio sizes. For a mid-sized city, 500 to 1000 works well.

## `includePrivateSellers` (type: `boolean`):

Off by default. Private sellers are natural persons; under GDPR their data must not be processed for marketing without a legal basis. Only turn this on if you have one.

## `minListings` (type: `integer`):

Hides agencies with very small portfolios. A value of 3 usually leaves the professionally active ones.

## `sortBy` (type: `string`):

How to order the agency list.

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

Property portals block requests from data centres. The default uses Apify residential proxies from the matching country — without them runs fail with HTTP 403. Your own proxies work too.

## Actor input object example

```json
{
  "portal": "immowelt",
  "location": "berlin",
  "offerType": "buy",
  "estateType": "apartment",
  "category": "eigentumswohnung",
  "maxItems": 500,
  "includePrivateSellers": false,
  "minListings": 1,
  "sortBy": "listingCount",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `agencies` (type: `string`):

Estate agencies ranked by portfolio size, value and price segment.

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

How many listings were analysed and how many agencies were found.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("mocha_tassel/real-estate-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("mocha_tassel/real-estate-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 '{}' |
apify call mocha_tassel/real-estate-agent-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mocha_tassel/real-estate-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/helKxT76Up6ZaPdVC/builds/amcGYet89jghw7M8E/openapi.json
