ImmoScout24 Scraper – Germany Real Estate avatar

ImmoScout24 Scraper – Germany Real Estate

Pricing

from $1.35 / 1,000 results

Go to Apify Store
ImmoScout24 Scraper – Germany Real Estate

ImmoScout24 Scraper – Germany Real Estate

Export German ImmoScout24 apartment, house and plot listings with prices, size and location. Start with a city or search URL and a bounded result limit.

Pricing

from $1.35 / 1,000 results

Rating

0.0

(0)

Developer

ninhothedev

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

35

Total users

3

Monthly active users

5 days ago

Last modified

Categories

Share

ImmoScout24 Scraper — German property listings

Export apartment, house and plot listings from immobilienscout24.de into JSON or CSV. Collect source prices, living area, rooms and location for a spreadsheet or recurring property feed. Start with five listings; optional detail requests are off by default.

Quick start

In the Console, leave City as Berlin and use the small prefills: Maximum unique listings: 5, Max. Result Pages: 1. For the API, copy:

{"city":"Berlin","propertyType":"wohnung","priceType":"kauf","maxItems":5,"maxPages":1}

Open Listings (JSON) or Download CSV. Run outcome and limits explains why collection stopped and whether optional detail requests failed.

Use the exact search you configured on the website

{
"searchUrl":"https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=200000-600000",
"maxItems":5,
"maxPages":1,
"enrichDetails":false
}

searchUrl accepts German HTTPS /Suche/de/…/wohnung-kaufen, wohnung-mieten, haus-kaufen, haus-mieten and corresponding grundstueck search paths. Its source filters replace the form's city/type/price/room/area filters; they are not combined. Pagination starts at page one even when the pasted URL contains another page number. Austria, Switzerland, arbitrary websites and individual expose URLs are not supported search inputs.

Input

FieldAPI defaultMeaning
searchUrlEmptyExact supported German search URL; takes precedence over form filters.
cityBerlinGerman city, or empty for nationwide. Prefer a website URL for an exact location or a city path that cannot be resolved.
propertyTypewohnungwohnung, haus, grundstueck.
priceTypekaufkauf or miete.
priceMin, priceMaxUnsetSource price range in EUR.
roomsMin, roomsMaxUnsetRoom range; half rooms supported.
areaMin, areaMaxUnsetLiving area range in m².
maxItems2000Global unique-listing cap, 1–2000; Console prefill is 5.
maxPages5Source-page cap, 1–50; Console prefill is 1.
enrichDetailsfalseAttempt each selected expose page for additional fields, description and photos.
proxyConfigurationDirect connectionOptional Apify Proxy configuration. No proxy guarantees access.

The API defaults preserve existing page-based workflows; send explicit small limits for a first run. Actual results can be below either limit. Page sizes vary; 50 is this Actor's allowed page limit, not a claim about the portal's maximum. Invalid types/ranges fail before collection. Previously advertised but unwired fields such as zipCode, radiusKm and hasBalcony are rejected explicitly; configure these filters on the website and use searchUrl.

Output and data quality

Each row has a stable external_id, source: "immoscout24", the expose url and a UTC scraped_at. Existing field names are retained. detail_status is not_requested, enriched or failed.

Example values are illustrative:

{
"external_id":"123456789",
"source":"immoscout24",
"url":"https://www.immobilienscout24.de/expose/123456789",
"title":"Example apartment",
"price":449500,
"price_type":"kauf",
"property_type":"wohnung",
"area_sqm":62,
"rooms":3,
"city":"Berlin",
"zip_code":"10785",
"has_balcony":true,
"energy_kwh":null,
"detail_status":"not_requested",
"scraped_at":"2026-09-05T19:00:00+00:00"
}

Additional fields, when available: plot_sqm, additional_costs, heating_costs, deposit, total_rent, address, district, state, latitude, longitude, floor, total_floors, year_built, energy_rating, heating_type, condition, has_garden, has_garage, has_elevator, has_cellar, is_commission_free, commission, thumbnail_url, images, description.

Money fields are EUR; area fields are m²; energy_kwh represents source energy consumption in kWh/m²/year, not a boolean about warm water. Missing numbers and boolean features remain null. Legacy string fields may be empty. Missing state is not guessed from a city name. Coordinates and full addresses are only returned when exposed by the source. Search rows may already contain photos or a short description.

Detail mode makes additional requests before delivering each selected row. It can add description text up to 20,000 characters and available images/fields. enriched means a recognized detail page was parsed, not that every optional field exists. A failed detail attempt retains the valid search record with detail_status: "failed"; the run summary counts these failures. No completeness, full-gallery or source-access guarantee is made.

Recommendations stored separately as similarObjects are excluded because they may not match the search. IDs are deduplicated before detail requests and billing. Unrecognized or blocked search pages fail the run rather than masquerading as a successful empty search; previously delivered rows remain accessible. A recognized source response reporting zero hits can legitimately succeed with zero rows. A returned page number that differs from the requested page fails explicitly.

Pricing and spending control

As checked on September 5, 2026, published event pricing is $0.00135 per delivered listing ($1.35 per 1,000) plus $0.00005 per start at the default 1 GB memory. The Store pricing preview is authoritative; this release does not change pricing.

ScenarioActor event fees
5 listings, one run$0.00680
100 listings, one run$0.13505
1,000 listings, one run$1.35005

These are event fees, not an estimate of your whole Apify subscription, applicable tax or separately enabled platform usage. Higher run memory changes the start-event count. Detail mode has no new custom charge in this release but increases requests and runtime. A valid search record with a failed optional detail request remains a delivered listing.

Set maximum cost per run in Apify as well as maxItems and maxPages. Before fetching another page, the Actor checks the SDK's remaining result budget; it caps selected unique rows before details. Each row is saved immediately. Apify charges the synthetic dataset event automatically; the Actor never adds a duplicate manual charge.

A resurrected run skips IDs already in its dataset. Start a new run for fresh prices. Cookie sharing across separate runs, built-in historical change tracking and notifications are not provided. For monitoring, schedule new runs and compare stable IDs in your downstream workflow.

Troubleshooting

  • Blocked/unavailable search: the source may restrict this client. A bounded HTTP retry and browser fallback are attempted. No access guarantee follows from a user-agent or robots.txt statement.
  • Unexpected city: use the exact supported URL from the website; location names alone can be ambiguous.
  • Fewer rows: inspect the result/page/cost caps, deduplication and RUN_SUMMARY.
  • Missing detail fields: inspect detail_status; optional source fields can remain unavailable even after enrichment.

Report bugs through the Actor's Issues tab with a run ID and minimal example input. Remove sensitive parameters before sharing. This Actor does not send alerts or messages itself.

Development

Use Python 3.11+ and install requirements.txt (includes the pinned requirements.lock) plus requirements-dev.txt. Run python -m pytest -q and apify validate-schema. For the local Actor runtime, place the quick-start JSON into storage/key_value_stores/default/INPUT.json, activate the virtual environment, and run apify run. Local storage is not uploaded to Apify. Browser fallback requires the pinned Playwright Chromium installation.