Immoweb.be Scraper with Contacts | Fast & Reliable avatar

Immoweb.be Scraper with Contacts | Fast & Reliable

Pricing

from $0.70 / 1,000 property listings

Go to Apify Store
Immoweb.be Scraper with Contacts | Fast & Reliable

Immoweb.be Scraper with Contacts | Fast & Reliable

Extract unlimited Immoweb.be property listings across Belgium with rich property detail, agency contacts, EPC data, media, pricing, and flexible market filters. Built for enterprise-grade Belgian real estate intelligence, lead enrichment, and automated analytics pipelines.

Pricing

from $0.70 / 1,000 property listings

Rating

0.0

(0)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Immoweb.be Scraper

Slug: fatihtahta/immoweb-be-scraper

Overview

Immoweb.be Scraper collects structured Belgian real estate listing data, including property identity, pricing, location, building attributes, transaction details, media, contacts, publication metadata, and source context. Immoweb.be is a major Belgian property marketplace, making its public listing data useful for market research, investment analysis, rental monitoring, and property intelligence workflows. The actor turns repeatable search criteria into normalized JSON records that can be exported, scheduled, and connected to downstream systems. It is designed for operationally consistent recurring data acquisition, helping teams validate, monitor, and refresh property datasets without relying on manual collection. Results reflect the public information available at run time and can vary based on listing availability, filters, and source data completeness.

Why Use This Actor

  • Market research and analytics teams: collect structured extraction results for pricing analysis, supply tracking, geographic comparisons, and operational reporting.
  • Product and content teams: enrich internal property experiences with normalized listing attributes, images, locations, and public availability signals.
  • Developers and data engineering teams: feed repeatable collection jobs into downstream systems, warehouses, dashboards, and dataset normalization workflows.
  • Lead generation and enrichment teams: build property, agency, and listing datasets for qualification, CRM enrichment, and market intelligence.
  • Monitoring and competitive tracking teams: schedule recurring data acquisition to track new listings, price movement, availability, and category-level changes.

Common Use Cases

  • Market intelligence: monitor supply, pricing, availability, property categories, bedroom counts, EPC labels, and geographic distribution.
  • Lead generation: build targeted prospect lists from public property listings and agency contact information when available.
  • Competitive monitoring: track listing movement, new inventory, pricing changes, and market positioning across Belgian real estate segments.
  • Catalog and directory building: populate internal property databases with structured public records, media, address data, and transaction attributes.
  • Data enrichment: add current public listing attributes to CRM, BI, underwriting, portfolio, or analytics datasets.
  • Recurring reporting: schedule periodic runs for dashboards, alerts, and trend analysis across selected locations or property types.

Quick Start

  1. Choose a deal_type such as buy or rent, then select a property_type that matches the inventory you want to collect.
  2. Add a Belgian location when you need a focused market, or leave it empty for Belgium-wide discovery.
  3. Set a small limit, such as 25, for the first validation run.
  4. Run the actor in Apify Console and wait for the dataset to be created.
  5. Inspect the first records to confirm that fields such as pricing, location, property, and source_context match your workflow.
  6. Increase the limit, add filters, adjust enrich_data, or schedule recurring runs once the output is verified.

Input Parameters

Configure sale or rental listing collection by deal type, property category, optional Belgian location, filters, sorting, enrichment, and result limit.

ParameterTypeDescriptionDefault
deal_typestringListing mode to collect. Allowed values: buy, rent.buy
property_typestringProperty category to collect. Allowed values: house, apartment, house_and_apartment, kot, garage, office, business, industry, land, other.house_and_apartment
locationstringBelgian city, postal code, district, province, neighborhood, or market. Leave empty for a national search.-
min_priceintegerMinimum listing price in EUR. For rental searches, this applies to rental price; for sale searches, it applies to purchase price.-
max_priceintegerMaximum listing price in EUR. Leave empty when you do not want an upper price cap.-
min_building_yearintegerEarliest construction year to include.-
max_building_yearintegerLatest construction year to include.-
immediately_availablebooleanWhen true, only includes listings marked as immediately available.false
min_areaintegerMinimum living area in square meters.-
max_areaintegerMaximum living area in square meters.-
min_bedroomintegerMinimum number of bedrooms.-
max_bedroomintegerMaximum number of bedrooms.-
min_parkingintegerMinimum number of parking spaces required.-
3d_tourbooleanWhen true, only includes listings with a virtual visit or 360-degree tour where available.false
epc_labelarray of stringsEPC energy labels to include. Allowed values: A++, A+, A, B, C, D, E, F, G, X. Leave empty to include all available labels.-
sort_bystringResult order. Allowed values: relevance, cheapest, most_expensive, postal_code, newest.relevance
enrich_databooleanWhen true, collects richer property listing details, such as full descriptions, all photos, detailed features, agent contacts, and more.true
maximize_coveragebooleanWhen true, keeps collecting within the selected criteria when a broad search may exceed Immoweb's visible-result limit.true
limitintegerMaximum number of listings to save. Minimum value: 1. Leave empty to collect as many matching listings as are available.-

Choosing Inputs

Use deal_type and property_type to define the core market segment before adding optional filters. A specific location is best for city, postal-code, district, province, neighborhood, or local market reporting; leaving it empty is better for broad Belgium-wide discovery. Narrower filters such as price, bedroom count, living area, construction year, immediate availability, parking, 3D tour, and EPC labels produce more targeted datasets, while broader inputs improve discovery. Use maximize_coverage for very broad searches where Immoweb reports more matching listings than are usually visible at once. Use sort_by to prioritize the collection order, for example newest for monitoring or cheapest for affordability analysis. Start with a small limit to validate the output shape, then increase it after confirming that the results match your intended scope.

Example Inputs

Broad discovery with a conservative limit

{
"deal_type": "buy",
"property_type": "house_and_apartment",
"sort_by": "relevance",
"enrich_data": false,
"limit": 25
}

Brussels rental monitoring

{
"deal_type": "rent",
"property_type": "apartment",
"location": "Brussels",
"max_price": 1800,
"min_bedroom": 1,
"sort_by": "newest",
"limit": 50
}

Targeted sale search with energy and size filters

{
"deal_type": "buy",
"property_type": "house",
"location": "Antwerp",
"min_area": 120,
"min_bedroom": 3,
"epc_label": ["A", "B", "C"],
"enrich_data": true,
"limit": 100
}

Output

The actor writes one JSON object per Immoweb property listing to the default Apify dataset. Each record uses a normalized real estate envelope with stable snake_case field names and source-specific details preserved in nested objects.

Record envelope and stable identifiers

Each dataset item has record_type: "property_listing". Use record_id as the primary idempotency key for deduplication and upserts. It is the Immoweb listing identifier represented as a string so it remains safe across warehouses, spreadsheets, and CRM systems.

Use source_context.canonical_url, source_context.listing_url, and source_context.fingerprint as audit or fallback matching keys. source_context.external_ids preserves the listing id plus advertisement or external references when Immoweb provides them.

Example

{
"record_type": "property_listing",
"record_id": "21548253",
"source_context": {
"source_name": "Immoweb",
"source_domain": "www.immoweb.be",
"source_url": "https://www.immoweb.be/en/search-results/apartment/for-rent/brussels?countries=BE&page=1",
"canonical_url": "https://www.immoweb.be/en/classified/apartment/for-rent/ixelles/1050/21548253",
"listing_url": "https://www.immoweb.be/en/classified/apartment/for-rent/ixelles/1050/21548253",
"fingerprint": "838bb69ca1b8f627fac4",
"seed_type": "search",
"page_index": 1,
"search_filters": {
"deal_type": "rent",
"property_type": "apartment",
"sort_by": "relevance"
},
"external_ids": {
"listing_id": "21548253"
}
},
"entity": {
"title": "Ixelles I Châtelain area",
"description": "Ideally located in the heart of the Châtelain district...",
"url": "https://www.immoweb.be/en/classified/apartment/for-rent/ixelles/1050/21548253",
"category": "APARTMENT",
"external_ids": {
"listing_id": "21548253"
}
},
"listing": {
"listing_id": "21548253",
"listing_type": "APARTMENT",
"listing_subtype": "DUPLEX",
"transaction_type": "FOR_RENT",
"transaction_subtype": "RENT_REGULAR",
"updated_at": "2026-05-20T10:00:00Z",
"publication": {
"updated_at": "2026-05-20T10:00:00Z"
},
"flags": {
"is_new_classified": true
},
"transaction_details": {
"type": "FOR_RENT",
"availability_date": "2026-08-01",
"certificates": {
"epc_score": "C",
"primary_energy_consumption_per_sqm": 149,
"carbon_emission": 29
},
"rental": {
"monthly_rental_price": 2900,
"monthly_rental_costs": 160,
"is_furnished": false
}
}
},
"pricing": {
"price": 2900,
"price_text": "€2,900 (+ €160)",
"short_display_price": "€2.9K",
"accessibility_price": "2900€ + 160€ per month",
"currency": "EUR",
"price_type": "residential_monthly_rent",
"additional_value": 160,
"details": {
"main_value": 2900,
"main_display_price": "€2,900 (+ €160)",
"label": "Requested monthly rental price",
"language": "en"
}
},
"location": {
"country": "Belgium",
"region": "Brussels",
"locality": "Ixelles",
"postal_code": "1050",
"street": "Rue du Chatelain",
"number": "34",
"latitude": 50.825382,
"longitude": 4.3620849
},
"property": {
"property_type": "APARTMENT",
"property_subtype": "DUPLEX",
"bedroom_count": 2,
"bathroom_count": 2,
"floor_area_sqm": 190,
"building": {
"condition": "AS_NEW",
"construction_year": 1910
},
"energy": {
"heating_type": "GAS",
"has_double_glazing": true,
"epc_score": "C"
},
"has_garden": true,
"garden_surface": 110,
"has_terrace": true,
"terrace_surface": 20
},
"availability": {
"available_from": "2026-08-01",
"availability_date": "2026-08-01"
},
"media": {
"main_image_url": "https://media-resize.immowebstatic.be/classifieds/example/736x736/photo.jpg",
"image_urls": [
"https://media-resize.immowebstatic.be/classifieds/example/736x736/photo.jpg"
],
"has_virtual_tour": false
},
"contact_details": {
"name": "Example Realty Brussels",
"contacts": [
{
"name": "Example Realty Brussels",
"email": "brussels-office@example.com",
"phone_number": "+3225550199"
}
]
},
"relationships": {
"agency": {
"name": "Example Realty Brussels"
},
"contacts": [
{
"name": "Example Realty Brussels",
"email": "brussels-office@example.com",
"phone_number": "+3225550199"
}
]
},
"metrics": {
"bookmark_count": 12,
"view_count": 340
},
"attributes": {
"has_sections": {
"has_general_section": true,
"has_energy_section": true
},
"visual_context": {
"has_virtual_staging": false
}
}
}

Field Reference

record_type (string, required): Stable discriminator. Immoweb listing rows use property_listing.

record_id (string, required): Stable Immoweb listing id used for upserts and deduplication.

source_context (object, required): Source, crawl, and audit context. Common fields include source_name, source_domain, source_url, canonical_url, listing_url, fingerprint, seed_id, seed_type, location_query, page_index, search_filters, and external_ids.

entity (object, required): Main public identity for the listing, including title, description, url, category, and external_ids.

listing (object, optional): Listing-level business context, including listing_id, listing_type, listing_subtype, transaction_type, transaction_subtype, listing_status, is_new_listing, publication dates, public flags, and the preserved transaction_details object.

pricing (object, optional): Price and rent information. Common fields include price, price_text, short_display_price, accessibility_price, currency, price_type, additional_value, range values, and details with the source price payload.

location (object, optional): Address and geography, including country, region, province, district, locality, postal code, street, house number, floor, coordinates, place names, and source location classifications when available.

property (object, optional): Physical property attributes, including property_type, property_subtype, room counts, floor_area_sqm, land_area_sqm, parking counts, building details, kitchen/living-room details, energy attributes, certificates, garden/terrace fields, amenities, and public alternative descriptions.

availability (object, optional): Availability fields such as available_from and the source availability_date.

media (object, optional): Listing media, including main_image_url, image_urls, rich pictures, virtual tour links, floor plans, specifications, documents, legal documents, and any remaining media details.

contact_details (object, optional): Direct contact channels and display names, including agency/contact names and the public contacts array when available.

relationships (object, optional): Linked real estate entities such as agency, contacts, and project/development details.

metrics (object, optional): Public listing metrics such as bookmark and view counts when Immoweb exposes them.

attributes (object, optional): Preservation bucket for useful source details that do not fit a stronger normalized group. It can include has_sections, visual_context, and source_specific.

Data Quality, Guarantees, And Handling

  • Structured records: results are normalized into predictable JSON objects for downstream use.
  • Best-effort extraction: fields may vary by region, session, availability, listing type, or source-side presentation changes.
  • Optional fields: null-check optional fields in downstream code, especially media, contact, certificate, and detailed property attributes.
  • Deduplication: use id as the recommended stable key, with source_context.canonical_url or source_context.fingerprint as useful fallback keys.
  • Freshness: results reflect the publicly available data at run time.
  • Repeated runs: use the recommended idempotency key when syncing data into warehouses, CRMs, search indexes, or internal applications.

Tips For Best Results

  • Start with a small limit to validate the output shape before scaling up.
  • Use one geography, property category, or market segment per run when you need cleaner segmentation.
  • Leave optional filters empty when the goal is broad discovery.
  • Add price, bedroom, area, construction-year, EPC, and availability filters gradually to understand how each field changes coverage.
  • Use sort_by: "newest" for recurring monitoring and sort_by: "relevance" for general discovery.
  • Enable enrich_data when deeper property records are more important than faster lightweight collection.
  • Use stable identifiers for deduplication when storing results over time.

How to Run on Apify

  1. Open the actor in Apify Console.
  2. Configure the available input fields for your target scope.
  3. Set the maximum number of outputs to collect with limit.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and review the first records.
  6. Download results in JSON, CSV, Excel, or another supported format.

Scheduling & Automation

Scheduling

Automated Data Collection

Schedule runs to keep Belgian property datasets current without manual collection. Recurring runs are useful for price monitoring, new-listing alerts, availability checks, and periodic reporting.

  • Navigate to Schedules in Apify Console
  • Create a new schedule, such as daily, weekly, or custom cron
  • Configure input parameters
  • Enable notifications for run completion
  • Add webhooks for automated processing

Integration Options

  • BI dashboards: monitor pricing, availability, property type mix, EPC distribution, and geographic coverage over time.
  • Data warehouses: load normalized listing records into historical tables for trend analysis and reporting.
  • CRM enrichment: sync public property, agency, and contact attributes into account or lead records.
  • Google Sheets or Airtable: review smaller market segments, validation runs, and curated lead lists with business users.
  • Webhooks: trigger ingestion, validation, notification, or alerting workflows after each completed run.
  • ETL and enrichment pipelines: merge listing data with internal portfolio, underwriting, or market intelligence datasets.

Export Formats And Downstream Use

Apify datasets can be exported or consumed by downstream systems for reporting, analysis, and operational workflows.

  • JSON: for APIs, applications, and data pipelines
  • CSV or Excel: for spreadsheet workflows and manual review
  • API access: for automated ingestion into internal systems
  • BI and warehouses: for reporting, dashboards, and historical analysis

Performance

These are estimated run times and can vary by input scope:

  • Small runs (< 1,000 outputs): ~3–5 minutes
  • Medium runs (1,000–5,000 outputs): ~5–15 minutes
  • Large runs (5,000+ outputs): ~15–30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.

Limitations

  • Availability depends on what https://www.immoweb.be publicly exposes at run time.
  • Some optional fields may be missing on sparse listings or records with limited public information.
  • Very broad searches may take longer or require higher limit values to capture enough records.
  • Target-side changes can affect field availability, naming, formatting, or visible result counts.
  • Regional, account, language, or availability differences may change which listings and attributes are visible.
  • Media, contact, certificate, and engagement fields are available only when present in the public listing data.

Troubleshooting

  • No results returned: check filters, location or category spelling, and whether Immoweb has matching public records for the selected scope.
  • Fewer results than expected: broaden filters, raise limit, or verify that the target contains enough matching public listings.
  • Some fields are empty: optional fields depend on what each listing publicly provides.
  • Run takes longer than expected: reduce scope, lower limit for validation, or split broad collection into smaller market segments.
  • Output changed: compare the current output with the field reference and include a small sample when reporting the issue.

FAQ

What data does this actor collect?

It collects public Immoweb property listing records, including listing identifiers, URLs, titles, descriptions, property type, pricing, location, property attributes, transaction details, media, contact information when available, publication metadata, flags, metrics, and source context.

Can I filter by location, category, price, or other criteria?

Yes. The actor supports location, deal_type, property_type, price range, construction year, immediate availability, living area, bedroom count, parking, 3D tour availability, EPC labels, sorting, enrichment, and result limits.

Can I filter by date?

There is no date input parameter in the current schema. For monitoring recently active listings, use sort_by: "newest" with a recurring schedule and compare results across runs.

Why did I receive fewer results than my limit?

The selected filters may match fewer public listings than the requested limit, or some listings may not expose enough information to be saved as complete records.

Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor daily, weekly, or on a custom cron schedule with the same input settings.

How do I avoid duplicates across runs?

Use id as the primary deduplication key. You can also keep source_context.canonical_url and source_context.fingerprint as fallback or audit fields.

Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support exports in JSON, CSV, Excel, and other formats available in Apify Console.

Does this actor collect private data?

The actor is intended to collect publicly available listing information from Immoweb. Users are responsible for using the data in accordance with applicable laws, regulations, and platform terms.

What should I include when reporting an issue?

Include the input used with sensitive values redacted, the run ID, expected versus actual behavior, and a small output sample when helpful.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available Belgian real estate listing information from https://www.immoweb.be for legitimate business purposes, including:

  • Real estate research and market analysis
  • Property monitoring, pricing intelligence, and inventory reporting
  • CRM enrichment, data validation, and operational analytics

This section is informational and not legal advice. Users are responsible for ensuring that their collection and use of data complies with applicable laws, regulations, and the target site's terms.

Best Practices

  • Use collected data in accordance with applicable laws, regulations, and the target site's terms
  • Respect individual privacy and personal information
  • Use data responsibly and avoid disruptive or excessive collection
  • Do not use this actor for spamming, harassment, or other harmful purposes
  • Follow relevant data protection requirements where applicable, such as GDPR and CCPA

Support

For help, use the actor page or Issues section. Include the input used with sensitive values redacted, the run ID, expected versus actual behavior, and a small output sample if it helps explain the issue.