# ImmoScout24 Gewerbe Scraper — Commercial Real Estate (`studio-amba/immoscout24-gewerbe-scraper`) Actor

Scrape commercial property listings (Gewerbeimmobilien) from immobilienscout24.de: offices, retail, industrial halls, gastronomy, hotels and land plots. Rent and sale, with EUR/m²/Monat price units.

- **URL**: https://apify.com/studio-amba/immoscout24-gewerbe-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 result scrapeds

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

## ImmoScout24 Gewerbe Scraper

Scrape commercial real estate listings (Gewerbeimmobilien) from [immobilienscout24.de](https://www.immobilienscout24.de/gewerbe/), Germany's largest property portal. Covers offices (Büro & Praxis), retail (Einzelhandel), industrial space (Hallen, Produktion, Lager), gastronomy and hotels (Gastronomie, Hotel), and land (Grundstücke, Gewerbegrundstücke) — for rent and for sale, across all of Germany.

Each result is a structured JSON record with price, price unit, surfaces, location, coordinates, agency and images. No login, no cookies, no browser setup — the actor handles ImmoScout24's anti-bot protection automatically.

### What you get

- **Correct German commercial price units.** Office and retail rents on ImmoScout24 are usually quoted as cold rent per square meter per month. The actor keeps the quote as published (`price` + `priceUnit`, e.g. `28.5` + `EUR/m²/Monat`) and adds the site-calculated total monthly rent (`totalMonthlyRent`) so you get both views of the same listing.
- **Honest prices.** "Preis auf Anfrage" (price on application) is common in this market. Those listings come through with `price: null` — never a fake zero.
- **Segment labels on every record**: office, retail, industrial, gastronomy\_hotel, land or commercial\_land, taken from ImmoScout24's own typing, not guessed from text.
- **Commercial surface fields**: net floor space, total floor space, plot area, and the smallest divisible unit for flexible office space.
- **Full Germany coverage**: search a city, a federal state, or the whole country in one run.

### Use cases

- Track office rents per m² in Berlin, München or Frankfurt over time
- Feed availability of industrial and logistics space into a market model
- Find retail units or gastronomy locations matching an expansion profile
- Monitor commercial land (Gewerbegrundstücke) supply and asking prices
- Build lead lists of listing agencies active in a segment and region

### How to scrape ImmobilienScout24 Gewerbe data

1. Pick a **Location** — a German city or state, in German spelling or common English spelling ("München" or "Munich" both work). Leave it empty to search all of Germany.
2. Pick a **Commercial Segment** — offices, retail, industrial, gastronomy & hotels, land, or commercial land.
3. Pick a **Listing Type** — rent (Mieten/Pachten) or buy (Kaufen).
4. Set **Max Results** and run. The actor fetches search result pages (20 listings each) and outputs one record per listing.

Alternatively, paste one or more ImmoScout24 URLs into **Start URLs**: any `/Suche/` result page built on immobilienscout24.de (with your own filters for price, size, radius and so on), or individual `/expose/{id}` listing pages. Start URLs override the Location and Segment fields.

#### Example: office space for rent in Berlin

```json
{
    "searchQuery": "Berlin",
    "segment": "office",
    "listingType": "rent",
    "maxResults": 100
}
```

#### Example: land for sale in München

```json
{
    "searchQuery": "München",
    "segment": "land",
    "listingType": "sale",
    "maxResults": 50
}
```

#### Example: industrial halls, state-wide

```json
{
    "searchQuery": "Nordrhein-Westfalen",
    "segment": "industrial",
    "listingType": "rent",
    "maxResults": 200
}
```

#### Example: your own filtered search URL

```json
{
    "startUrls": [
        { "url": "https://www.immobilienscout24.de/Suche/de/hamburg/hamburg/einzelhandel-mieten" }
    ],
    "maxResults": 100
}
```

### Output example

```json
{
    "name": "Landmark-Office am Potsdamer Platz mit Panoramablick",
    "segment": "office",
    "listingType": "rent",
    "price": 28.5,
    "currency": "EUR",
    "priceUnit": "EUR/m²/Monat",
    "priceType": "RENT_PER_SQM/MONTH",
    "pricePerSqm": 28.5,
    "totalMonthlyRent": 22800,
    "surface": 6595,
    "totalFloorSpace": null,
    "plotArea": null,
    "minDivisibleSurface": 800,
    "address": "",
    "city": "Berlin",
    "postalCode": "10785",
    "district": "Tiergarten",
    "latitude": 52.5096,
    "longitude": 13.3759,
    "privateOffer": false,
    "agencyName": "Beispiel Immobilien GmbH",
    "imageUrl": "https://pictures.immobilienscout24.de/listings/...jpg",
    "imageUrls": ["https://pictures.immobilienscout24.de/listings/...jpg"],
    "url": "https://www.immobilienscout24.de/expose/169614139",
    "source": "immobilienscout24.de",
    "scrapedAt": "2026-08-18T09:00:00.000Z"
}
```

### Price units explained

German commercial listings quote prices in three ways, and the `priceUnit` field tells you which one you are looking at:

| priceUnit | Meaning | Typical for |
|---|---|---|
| `EUR/m²/Monat` | Cold rent per m² per month | Offices, retail, halls |
| `EUR/Monat` | Total cold rent per month | Smaller units, gastronomy |
| `EUR` | One-time purchase price | All sale listings, land |

When the quote is per m², `totalMonthlyRent` carries the site-calculated total for the full space. When a listing is price on application, `price`, `priceUnit` and `totalMonthlyRent` are all null.

### Input reference

| Field | Type | Description |
|---|---|---|
| `searchQuery` | string | City or federal state (optional; empty = all Germany). ~90 largest cities and all 16 states supported; other locations via Start URLs |
| `segment` | string | `office`, `retail`, `industrial`, `gastronomy_hotel`, `land`, `commercial_land` (default `office`) |
| `listingType` | string | `rent` or `sale` (default `rent`) |
| `startUrls` | array | ImmoScout24 `/Suche/` or `/expose/` URLs; overrides the fields above |
| `maxResults` | integer | Hard cap on listings returned, 1–10,000 (default 100) |
| `brightDataApiKey` | string | Optional: your own Bright Data Web Unlocker key |

### Cost of usage

Pricing is pay-per-result: a run start fee plus a fixed cost per result, about $0.02 per result (one result = one listing; see the pricing box on this page for the current rates). A run capped at 100 listings therefore costs in the order of a few dollars at most. There are no compute or proxy charges on top.

One note on how charging works: a run's usage cost only settles after the run has SUCCEEDED. If a run fails, you are not charged for its results — including the deliberate failure the actor raises when a search returns zero listings.

### Good to know

- **20 listings per page.** `maxResults: 100` means 5 page fetches; results arrive fast.
- **Broad searches are big.** Office rentals Germany-wide are 10,000+ listings. Narrow by city or state for full coverage of a market.
- **Long runs resume safely.** Crawl state is persisted, so a platform migration mid-run continues where it left off instead of restarting and duplicating.
- **Unknown locations fail loudly.** If a location is not in the built-in city map and ImmoScout24 has no page for it, the run fails with a clear message instead of silently returning data for the wrong area — use a Start URL for exotic locations.
- **Sister actor.** For apartments and houses, use the residential [ImmoScout24 Scraper](https://apify.com/store?search=immoscout24).

### Legality

This actor scrapes only publicly visible listing data — the same information any visitor sees in a browser. It collects no personal data beyond the agency contact details published on the listings, respects the site's robots.txt (which allows the scraped paths), and paces its requests. You are responsible for using the data in compliance with the site's terms and applicable law in your jurisdiction.

# Actor input Schema

## `searchQuery` (type: `string`):

German city or federal state to search (e.g. 'Berlin', 'München', 'Frankfurt am Main', 'Bayern'). Covers the ~90 largest cities and all 16 states. Leave empty to search all of Germany. For other locations, use Start URLs instead.

## `segment` (type: `string`):

Which commercial segment to search.

## `listingType` (type: `string`):

Rent (Mieten/Pachten) or buy (Kaufen).

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

ImmoScout24 search result URLs or /expose/ listing URLs, as an alternative to the Location field. Go to immobilienscout24.de/gewerbe, set your filters, and paste the resulting /Suche/ URL(s). Overrides Location/Segment/Listing Type when provided.

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

Hard cap on the number of listings returned (20 listings per fetched page). Broad Germany-wide searches can have 10,000+ hits — narrow the location or segment for full coverage.

## `brightDataApiKey` (type: `string`):

Optional: your own Bright Data API key for the Web Unlocker zone. Leave empty to use the built-in unlocking service.

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

Not used for fetching — ImmoScout24's Akamai anti-bot is handled automatically by the built-in unlocking service. Kept for platform compatibility.

## Actor input object example

```json
{
  "searchQuery": "Berlin",
  "segment": "office",
  "listingType": "rent",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "Berlin",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/immoscout24-gewerbe-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 = {
    "searchQuery": "Berlin",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/immoscout24-gewerbe-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 '{
  "searchQuery": "Berlin",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call studio-amba/immoscout24-gewerbe-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/immoscout24-gewerbe-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/4YluFuYv7L8b4dt8x/builds/ocELfdNzz7zymyrly/openapi.json
