# Immowelt Scraper - Germany Real Estate & Agent Leads (`scrapesage/immowelt-scraper`) Actor

Scrape Immowelt.de property listings: rent and purchase price, service charges, rooms, living space, year built, energy class, address, coordinates and photos, plus each listing agency and its contact details. Independent tool, not affiliated with Immowelt.

- **URL**: https://apify.com/scrapesage/immowelt-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (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 $0.55 / 1,000 property listings

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

## Immowelt Scraper - Germany Real Estate & Agent Leads

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by AVIV Germany GmbH or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Immowelt" is referenced only to describe the publicly available website this Actor collects data from.

Turn any **Immowelt** search into a clean spreadsheet of German property listings - **cold rent, warm rent, service charges, deposit, purchase price, rooms, living space, plot size, year built, heating, energy certificate, address and coordinates**, every photo and floor plan - plus the **estate agency behind each listing with its contact person, phone, website and imprint**.

No API key and no login. Give it a city (`berlin`), a district (`berlin-lichtenberg`) or paste Immowelt search URLs. Works for apartments, houses, plots of land, temporary and furnished living, and retail units, to rent or to buy.

### Why this Immowelt scraper?

Two levels of depth, and you pick per run - so a market survey stays cheap and a shortlist gets everything Immowelt publishes.

| Data | **Listing** (always) | **Full detail** (opt-in) |
|---|---|---|
| Title, price, price label, price per m² | ✅ | ✅ |
| Rooms, living space, availability | ✅ | ✅ |
| District, city, postcode | ✅ | ✅ |
| Photos + photo count, teaser text | ✅ | ✅ |
| Agency name + contact person | ✅ | ✅ |
| **Cost breakdown** - service charges, heating, warm rent, deposit | | ✅ |
| **Exact street address + latitude / longitude** | | ✅ |
| **Year built, condition, heating system, energy source** | | ✅ |
| **Energy certificate** - class, demand, type, validity | | ✅ |
| **Agency phone, website, imprint URL, profile URL, private-owner flag** | | ✅ |
| **Floor plans, videos, 3D-tour flag, documents** | | ✅ |
| **Amenities by category + detected features** | | ✅ |
| Plot area, commission text, reference number, listed / updated dates | | ✅ |

Full detail is **off by default**. Switch on **Scrape full listing details** to enable it; those rows are charged as the detail event instead of the standard one, never on top of it.

### Use cases

- **Rental and sale market analysis** - cold rent, warm rent, service charges and price per m² across as many districts as you like, in one dataset.
- **Estate-agent lead lists** - every listing names the agency and its contact person; with full detail on, you also get the phone, website and imprint. A search doubles as a prospect list for proptech, photography, financing and energy-certificate services.
- **Investment sourcing** - filter by price, rooms and living space, then sort by price per m² to find what is mispriced in a district.
- **Energy and building datasets** - energy class, demand, heating system, energy source, year built and condition are the columns retrofit, ESG and heat-pump businesses need.
- **New-listing alerts** - monitor mode remembers what it has returned, so a scheduled run emits only what is new.
- **Relocation and portfolio tooling** - coordinates, exact address, floor plans and amenity lists feed map-based search products.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) - the free plan is enough to try this Actor.
2. Open the **Immowelt Scraper**, enter one or more **locations**, choose **rent or buy** and a **property type**, and click **Start**.
3. Watch listings stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML or RSS - or pull results programmatically through the [Apify API](https://docs.apify.com/api/v2).

### How deep does a search go?

Read this before you plan a big export - it is the one thing that decides how you should configure a run.

**Immowelt does not publish a crawlable "page 2".** Its results pages paginate through routes that `immowelt.de/robots.txt` disallows, so this Actor does not request them. One search page therefore returns the 25-42 listings Immowelt renders on it, not the whole result set.

Two supported ways to get real volume, both using Immowelt's own published pages:

1. **Search narrower places.** A city URL and a district URL are each one page of results - but a district page is a much larger share of its own market than a city page is of the city. Pass many district slugs rather than one city.
2. **Turn on *Follow Immowelt's related searches*.** Every results page publishes dozens of narrower searches of its own - top neighbourhoods, nearby towns, room-count splits, property sub-types and feature searches - each with its own result count. With this on, the Actor follows them, bounded by **Max search pages**.

### Input

| Field | What it does |
|---|---|
| **Locations** | City or district slugs as Immowelt writes them - `berlin`, `muenchen`, `koeln`, `berlin-lichtenberg`. |
| **Property types** | Apartments, houses, plots, temporary living, retail units. A pick-list; leave empty for all types. |
| **Deal type** | For rent (`mieten`) or for sale (`kaufen`). |
| **Search URLs** | Paste Immowelt search URLs. A direct `/expose/` listing URL also works when full detail is on. |
| **Search URLs from a file or pasted list** | The same as a pasted block, or one link to a `.txt`/`.csv`/Google Sheet/Drive/key-value-store record. |
| **Scrape full listing details** | Opens each listing's own page for the complete record. Off by default because it costs more per listing. |
| **Follow Immowelt's related searches** | Depth, as described above. |
| **Max listings per search / Max listings in total / Max search pages** | Caps. |
| **Min/Max price, Min/Max rooms, Min/Max living space** | Filters, applied **before** billing - filtered listings are never charged. |
| **Only private owners / Only with a floor plan** | Filters. Both need full detail on. |
| **Output fields** | Tick exactly the columns you want. |
| **Monitor mode** | Emit only listings not seen on previous runs. Ideal on a schedule. |

Rent listings are matched on the cold rent (Kaltmiete); sale listings on the purchase price.

### Output

One row per listing. A rented apartment, with full detail on:

```json
{
    "type": "listing",
    "classifiedId": "264C9FHP3E4H",
    "url": "https://www.immowelt.de/expose/5ea9bbf0-2214-4886-adca-4b54a78b77c6",
    "title": "Wohnung zur Miete auf Zeit - Erstbezug",
    "dealType": "RENT",
    "propertyType": "APARTMENT",
    "priceText": "1.799 €/Monat",
    "priceLabel": "Kaltmiete",
    "price": 1799,
    "pricePerSqm": 20.52,
    "costs": [
        { "label": "Nebenkosten", "text": "240 €/Monat", "amount": 240 },
        { "label": "Heizkosten", "text": "110 €", "amount": 110 },
        { "label": "Warmmiete", "text": "2.149 €/Monat", "amount": 2149 }
    ],
    "deposit": "3 Nettokaltmieten",
    "rooms": 3,
    "livingSpaceSqm": 87.7,
    "availability": "frei ab sofort",
    "yearOfConstruction": 2025,
    "condition": "Erstbezug",
    "heatingSystem": "Fußbodenheizung",
    "energySource": "Fernwärme",
    "energyEfficiencyClass": "B",
    "energyDemand": "64 kWh/(m²·a)",
    "street": "Archenholdstraße 21",
    "district": "Friedrichsfelde",
    "city": "Lichtenberg",
    "zipCode": "10315",
    "latitude": 52.50751686007757,
    "longitude": 13.50397718192735,
    "agencyName": "STRATEGIS AG",
    "contactPerson": "Stefan Prill",
    "phone": "030 44353300",
    "website": "https://www.strategis.eu/",
    "publisherType": "AGENCY",
    "isPrivateOwner": false,
    "imageCount": 27,
    "hasVirtualTour": true
}
```

Three dataset views ship with it: **Listings overview**, **Agency & contact leads**, and **Building & energy**.

### Good to know

- **Search pages are read over ordinary HTTP** - no browser, and a few seconds per page.
- **Listing detail pages sit behind bot protection.** They are fetched over a residential IP and retried on a fresh one if refused - no API key of any kind is needed. This is why full detail is opt-in and costs more per listing than list data. A detail page that still cannot be read is reported and **never charged**.
- **Robots.txt is honoured.** Only `/liste/`, `/suche/` and `/expose/` pages are requested. URLs Immowelt disallows (`/classified-search?…`, `/classified-map?…`, `/classifiedList/`, `*bff/*`, `/liste/getlistitems`) are skipped and named in the run's status message.
- **`wohnen-auf-zeit` is rent-only.** Immowelt does not publish it for sale, so that combination is skipped before the request and nothing is charged.
- **Some fields depend on the property type.** Plots of land carry no room count or living space; houses report a total area and a plot area; only apartments report a floor. Sale listings show no price label on the results page - that arrives with full detail.
- **Coordinates only when the advertiser publishes the address.** Immowelt returns an exact point for a published address and an approximate area otherwise. This Actor emits `latitude`/`longitude` **only** for a real point and sets `locationIsApproximate: true` for the rest - it never invents a coordinate.
- **A run never fails on a transient block.** It ends *Succeeded* with whatever it collected plus a status message explaining what happened, and stops before its own time limit rather than timing out.

Listings on Immowelt name estate agents and, on some listings, private sellers, so the contact columns are personal data. See **Data & lawful use** below before you use them.

### How much does it cost to scrape Immowelt?

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Property listing** - One property listing returned from an Immowelt search - price, rooms, living space, address, photos and the listing agency. Listings filtered out by your price, room, living-space, owner or floor-plan filters are never charged.
- **Full listing detail** - Charged in addition to the listing only when 'Scrape full listing details' is on AND that listing's own page was actually read - full cost breakdown, deposit, year built, heating, energy certificate, exact street address, coordinates, all photos, floor plans and the agency's phone, website and imprint. Immowelt protects listing pages with DataDome, so each one is fetched through Bright Data Web Unlocker. A detail page that could not be read is never charged.

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

### Automate & schedule

Run this Actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** - start runs, fetch datasets and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** - official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** - run it hourly, daily or weekly and keep your dataset current.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** - trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/immowelt-scraper').call({
    // your input - see the Input section above
});

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

### Integrate with any app

Connect the dataset to thousands of apps - no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** - multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** - push new records straight into your CRM or spreadsheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** - get notified when a scheduled run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** - auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** - pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** - trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this Actor from Claude, ChatGPT or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** - describe the data you need and let the assistant run this Actor for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Related Actors in the same category:

- **[Real Estate Scraper for Redfin](https://apify.com/scrapesage/redfin-scraper)** - Listings, Sold Comps & Leads
- **[BizBuySell Scraper](https://apify.com/scrapesage/bizbuysell-scraper)** - Businesses For Sale & Broker Leads
- **[VivaReal & ZAP Imóveis Scraper](https://apify.com/scrapesage/vivareal-zap-imoveis-scraper)** - Brazil Real Estate
- **[PropertyGuru Scraper](https://apify.com/scrapesage/propertyguru-scraper)** - Singapore Property & Agent Leads
- **[Airbnb Scraper & Market Monitor](https://apify.com/scrapesage/airbnb-scraper)**

### Tips

- **Districts beat cities.** Pass ten district slugs instead of one city slug and you will end up with far more of the market for the same number of requests.
- **Two-pass workflow.** Survey with full detail off, then re-run with it on over the shortlist - detail rows cost more, so spend them where they matter.
- **Let the site find the depth for you.** Turn on *Follow Immowelt's related searches* and raise **Max search pages** rather than hand-writing dozens of URLs.
- **Agent prospecting.** Deduplicate on `agencyName` with full detail on to get one row per agency, complete with phone, website and imprint.
- **Watch a district.** Monitor mode plus a daily [Schedule](https://docs.apify.com/platform/schedules) gives you new listings only, and you pay for nothing else.

### FAQ

**How is this Actor billed?** Pay-per-event: you pay only for the results it delivers, with no monthly rental and no start fee. The per-event price is shown on the Pricing tab.

**Can I schedule it and get results automatically?** Yes - create a [Schedule](https://docs.apify.com/platform/schedules) and add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or an integration (Google Sheets, Slack, Make, Zapier) to push each run's dataset wherever you need it.

**Which export formats are available?** Every run's dataset can be downloaded as JSON, CSV, Excel (XLSX), XML, HTML or RSS from the Apify Console or the API.

**Can I run it from code or an AI agent?** Yes - through the [Apify API](https://docs.apify.com/api/v2) and client libraries, or from Claude, ChatGPT and other assistants via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

**Is it legal to scrape Immowelt?** This Actor collects publicly available data only. You are responsible for using the output in compliance with applicable laws (including data-protection law where personal data is involved) and the source's terms. See **Data & lawful use** and the **Disclaimer** below.

**Is this an official Immowelt tool?** No. It is an independent, third-party Actor with no affiliation to, endorsement by or sponsorship from AVIV Germany GmbH. See the **Disclaimer** below.

### Data & lawful use

This Actor reads public listings and the seller information shown on them. Sellers on Immowelt include private individuals, so seller names, usernames and any contact details are personal data. If you are in the EU or UK you are the data controller for what you do with them: have a lawful basis, use the data for market research, price monitoring or lawful sourcing, honour deletion requests, and do not send private sellers unsolicited marketing.

Under [Apify's Standard Actor Contract](https://docs.apify.com/legal/standard-actor-contract), which governs your use of this Actor, you are the controller of any personal data in your input and output and scrapesage acts only as your processor: that data is processed solely to run your job, written only to your own Apify storage, never used for any other purpose and never shared onward. If you need help with a data-subject request that involves this Actor's output, open an issue on the Issues tab.

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by AVIV Germany GmbH or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"Immowelt" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Immowelt product, is not authorised or certified by AVIV Germany GmbH, and does not distribute Immowelt software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

Open an issue on the Actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome - this Actor is actively maintained.

# Actor input Schema

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

German city or district slugs as Immowelt writes them, for example <code>berlin</code>, <code>muenchen</code>, <code>koeln</code>, <code>berlin-lichtenberg</code>. Each location is combined with every property type below. Narrower places give you a much larger share of that market - see "How deep does a search go?" in the README.

## `propertyTypes` (type: `array`):

Which kinds of property to search for. Every value here was verified live against Immowelt.

## `dealType` (type: `string`):

Rent or buy. Temporary / furnished living is published for rent only; that combination is skipped before the request and nothing is charged for it.

## `searchUrls` (type: `array`):

Immowelt search pages to scrape, instead of (or as well as) the Locations above. Paste them, link a text file, or upload one. A single listing URL (<code>/expose/...</code>) also works. Only <code>/liste/</code>, <code>/suche/</code> and <code>/expose/</code> pages are requested - URLs that Immowelt's robots.txt disallows are skipped and reported.

## `urlsFromFile` (type: `string`):

Paste a block of Immowelt search URLs (one per line), or give ONE link to a .txt/.csv file, a Google Sheet, a Drive file or an Apify key-value-store record holding them. Blank lines, quotes, # comments and extra CSV columns are tolerated.

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

Open each listing's own page for the complete record - full cost breakdown, deposit, year built, heating, energy certificate, exact street address, coordinates, every photo, floor plans, and the agency's phone, website and imprint. OFF by default because it costs more per listing: Immowelt protects listing pages with DataDome, so each one is fetched over a residential IP (retried on a fresh IP if it is refused). No API key is needed. With it off you still get everything the results page shows, at the cheaper per-listing price.

## `maxListingsPerSearch` (type: `integer`):

Cap on how many listings to take from each search page. Immowelt serves 25-42 listings on a search page; see the README for how to go deeper.

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

Overall cap across every search. 0 means no cap - the run stops when the searches are exhausted or the run time budget is reached.

## `expandSeoLinks` (type: `boolean`):

Each Immowelt results page publishes up to ~66 narrower searches of its own - top neighbourhoods, nearby towns, room counts, property sub-types and feature searches. Turn this on to follow them, which is how you get well beyond one page of results for a city. Bounded by "Max search pages".

## `maxSearchPages` (type: `integer`):

Hard ceiling on how many search pages one run may request, including any followed from "Follow Immowelt's related searches".

## `minPrice` (type: `integer`):

Only keep listings at or above this price, in EUR. Rent listings are matched on the cold rent (Kaltmiete), sale listings on the purchase price. Filtered listings are not charged.

## `maxPrice` (type: `integer`):

Only keep listings at or below this price, in EUR. Filtered listings are not charged.

## `minRooms` (type: `integer`):

Only keep listings with at least this many rooms. Filtered listings are not charged.

## `maxRooms` (type: `integer`):

Only keep listings with at most this many rooms. Filtered listings are not charged.

## `minLivingSpaceSqm` (type: `integer`):

Only keep listings with at least this much living space. Filtered listings are not charged.

## `maxLivingSpaceSqm` (type: `integer`):

Only keep listings with at most this much living space. Filtered listings are not charged.

## `onlyPrivateOwners` (type: `boolean`):

Keep only listings published by a private owner rather than an estate agency. Needs "Scrape full listing details" on, because the owner flag comes from the listing page. Filtered listings are not charged.

## `onlyWithFloorplan` (type: `boolean`):

Keep only listings that publish at least one floor plan. Needs "Scrape full listing details" on. Filtered listings are not charged.

## `outputFields` (type: `array`):

Pick exactly the columns you want. Leave empty for every field. The list is generated from the Actor's own record builder, so it can never drift from what the run emits.

## `monitorMode` (type: `boolean`):

Remember which listings this Actor has already returned and emit only listings it has not seen before. Ideal on a schedule for new-listing alerts. Already-seen listings are skipped and never charged.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the monitor's memory. Use different names to track different searches independently.

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

How many listing detail pages to fetch at once.

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

Proxy used for Immowelt search pages. Apify Proxy (datacenter) is enough - search pages are not anti-bot protected. Listing detail pages always go through Bright Data Web Unlocker and ignore this setting.

## Actor input object example

```json
{
  "locations": [
    "berlin-friedrichsfelde"
  ],
  "propertyTypes": [
    "wohnungen"
  ],
  "dealType": "mieten",
  "searchUrls": [],
  "scrapeDetails": false,
  "maxListingsPerSearch": 50,
  "maxResults": 0,
  "expandSeoLinks": false,
  "maxSearchPages": 25,
  "onlyPrivateOwners": false,
  "onlyWithFloorplan": false,
  "monitorMode": false,
  "monitorStoreName": "immowelt-monitor",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every property listing scraped by this run.

# 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": [
        "berlin-friedrichsfelde"
    ],
    "propertyTypes": [
        "wohnungen"
    ],
    "dealType": "mieten",
    "searchUrls": [],
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/immowelt-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 = {
    "locations": ["berlin-friedrichsfelde"],
    "propertyTypes": ["wohnungen"],
    "dealType": "mieten",
    "searchUrls": [],
    "urlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/immowelt-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 '{
  "locations": [
    "berlin-friedrichsfelde"
  ],
  "propertyTypes": [
    "wohnungen"
  ],
  "dealType": "mieten",
  "searchUrls": [],
  "urlsFromFile": ""
}' |
apify call scrapesage/immowelt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/immowelt-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/G2pYPWlEh9fE8U2R5/builds/5z2ypig8K2SpXvJal/openapi.json
