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

37

Total users

3

Monthly active users

13 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 any ImmoScout24 result list URL whose path starts with /Suche/ (city, district, radius and filtered paths such as wohnung-mit-balkon-mieten). city accepts a German city, district or postcode and is resolved with ImmoScout24's own location search. 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–100; 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; 100 is this Actor's allowed page limit, not a claim about the portal's maximum. Out-of-range or mistyped values are coerced (for example swapped min/max, numbers sent as strings) and every adjustment is listed in RUN_SUMMARY.input_warnings. Legacy fields zipCode, yearBuiltMin/Max, hasBalcony, hasElevator, hasCellar, hasGarage and energyClassMax are applied; radiusKm and commissionFree are ignored with a warning (configure them 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, failed or skipped (not attempted because the run timeout was close).

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. If plain HTTP access is challenged, the Actor switches to a real browser. A run fails only when no listing at all could be delivered (blocked first page, unknown location, invalid URL), with the reason in the status message. Problems after rows were delivered (later page blocked, source repeating a page, charge limit, run timeout close) end the run successfully with the rows collected so far; RUN_SUMMARY.stop_reason and errors explain why. A recognized source response reporting zero hits succeeds with zero rows. RUN_SUMMARY.status is partial when pages repeat, a later source error occurs, details fail or are skipped, or the time limit interrupts coverage. A successful Apify run can therefore contain partial output; configured item/page/budget limits do not imply full-market coverage.

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. Selected rows are saved after any requested detail enrichment. 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.