Immoweb Scraper ($0.85/1K) - Belgian Property Listings avatar

Immoweb Scraper ($0.85/1K) - Belgian Property Listings

Pricing

from $0.35 / 1,000 listings

Go to Apify Store
Immoweb Scraper ($0.85/1K) - Belgian Property Listings

Immoweb Scraper ($0.85/1K) - Belgian Property Listings

Scrape real-estate listings from Immoweb (immoweb.be), Belgium's biggest property portal: houses, apartments, land and commercial property for sale and for rent. Filter by city, postcode or province, price, bedrooms, area and type. Newest first, with old price. Add-on: full details with agent phone.

Pricing

from $0.35 / 1,000 listings

Rating

0.0

(0)

Developer

Carabain Digital

Carabain Digital

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

What is Immoweb Listings Scraper?

Immoweb Listings Scraper scrapes property listings from Immoweb (immoweb.be), the biggest property portal in Belgium, with more than 50,000 houses for sale alone plus apartments, land and rentals from agents, developers and private sellers. Search by city or postcode, sale or rent, property type, price range, bedrooms and living area, or paste a search URL from the site, and get clean, flat listing data as JSON, CSV, Excel, XML or HTML: price, address, coordinates, living and plot area, bedrooms, EPC label, agent contact, photos and description. Prefilled example: the 20 newest properties for sale in Gent, ready in seconds. Costs $0.85 per 1,000 listings. Add-ons: Full details (description, construction year, bathrooms, agent phone and more) and Price history (price changes over time), $2.00 and $1.00 per 1,000 listings.

  • 🔎 Search like on the site: city, postcode or province, sale or rent, property type, price range, bedrooms, living area, or paste an Immoweb search URL
  • ⚡ Fast: Immoweb's own JSON search, 60 listings per request, newest first, no browser
  • 💶 Old price included: listings that dropped their price carry the previous price in old_price
  • 📚 Full details on demand: switch on Full details for the description, construction year, bathrooms, publication date, agent phone and all photos
  • 📈 Track prices over time: switch on Price history to compare every run with the last one
  • 🔌 Connect anywhere: API, schedules, webhooks, Google Sheets, Make, Zapier, MCP / AI agents

What data can I extract from Immoweb?

🆔 Stable listing ID and URL💶 Price (sale) or monthly rent
📍 Address, postcode, city, province🧭 Latitude and longitude
🏠 Property type and subtype📐 Living area and plot area (m²)
🛏️ Bedrooms and bathrooms⚡ EPC energy label
🏷️ Status: available, under offer, sold, rented📅 Listed and last-updated date
🏢 Agent name, phone and website📷 Photo URLs
📝 Description💶 Previous price and rental charges

The search results carry price, address, coordinates, areas, bedrooms, EPC label, agent name and a few photos. Description, construction year, bathrooms, publication date, agent phone and website and the full photo set come from the listing page and are only filled with the Full details add-on. rooms is only filled when the agent entered a room count, and title is rarely set on Immoweb.

How do I scrape Immoweb listings?

  1. Create a free Apify account and open this Actor.
  2. Enter a Location (for example Gent or 9000), pick Sale or rent and, if you like, a property type and price range. Or paste one or more Search URLs copied from immoweb.be.
  3. Set Max listings (the newest come first).
  4. Click Start, then download the listings from the Output tab as JSON, CSV, Excel, XML or HTML.

How much does it cost to scrape Immoweb?

You pay per listing that ends up in your dataset: $0.85 per 1,000 listings, no subscription. The monthly credit of Apify's Free plan ($5) covers around 5,900 listings without add-ons. Paid plans get volume discounts.

  • Add-on: Full details, $2.00 per 1,000 listings (off by default). Opens every listing's page and adds the description, construction year, bathrooms, publication date (listed_at), agent phone and website, all photos and the exact status. Charged only for listings that were actually enriched.
  • Add-on: Price history, $1.00 per 1,000 listings (off by default). Adds first_seen_at, previous_price, price_change, price_change_pct, status_changed and price_history. Charged only for listings that already had history from an earlier run, so the first run is free. See the Price history section below.
  • Failed runs and empty searches cost nothing; you can cap spending with Maximum cost per run in the run options.

See the Pricing tab for the current prices.

⬇️ Input

FieldDescription
Location (location)City, municipality, province or postcode; several separated by commas
Sale or rent (listing_type)sale or rent
Property type (property_type)any, house, apartment, land, commercial, parking
Minimum / maximum price (min_price, max_price)In euro; for rentals per month
Minimum bedrooms (min_rooms)Number of bedrooms
Minimum living area (min_living_area_m2)In m²; listings without a known area are left out
Search URLs (start_urls)Search pages copied from immoweb.be; they replace the filters above
Max listings (limit)Stop after this many listings
Full details (includeDetails)Paid add-on: description, agent phone, construction year and more
Price history (trackHistory)Paid add-on: compare with your previous runs
History store name (historyStoreName)Where the history is kept (default realestate-history)
Proxy (proxyConfiguration)Belgian residential proxy, preselected (Apify Residential, country BE). Immoweb blocks datacenter IPs
{
"location": "Gent",
"listing_type": "sale",
"limit": 20
}

Immoweb needs a Belgian residential proxy: the default is already set. With Search URLs paste a page like https://www.immoweb.be/en/search/house/for-sale/gent/9000?minPrice=200000; filters in the URL are kept and the page number is ignored. Location accepts a city (all its sub-municipalities are included), a postcode or a province, as on the site. There is no room/kot type on Immoweb.

⬆️ Output

Listings are stored in the default dataset, newest first. View them as a table in the Output tab or export JSON, CSV, Excel, XML or HTML. Fields a listing does not have are null; every item has the same keys.

A listing with the Full details add-on (rental)

{
"id": "immoweb:21954873",
"source": "immoweb",
"url": "https://www.immoweb.be/en/classified/apartment/for-rent/antwerpen/2000/21954873",
"title": "Flat",
"listing_type": "rent",
"property_type": "apartment",
"property_subtype": "apartment",
"status": "available",
"price": 900,
"price_currency": "EUR",
"price_period": "month",
"price_type": "asking",
"old_price": null,
"monthly_costs": 110,
"address": "Amerikalei 91 4, 2000 ANTWERPEN",
"street": "Amerikalei",
"house_number": "91 4",
"postcode": "2000",
"city": "ANTWERPEN",
"region": "Antwerp",
"country": "BE",
"lat": 51.2069148,
"lon": 4.3974303,
"living_area_m2": 72,
"plot_area_m2": null,
"rooms": null,
"bedrooms": 2,
"bathrooms": 1,
"energy_label": "C",
"construction_year": 1968,
"listed_at": "2026-10-30T10:04:19.760Z",
"updated_at": "2026-10-30T11:36:58.845Z",
"agent_name": "Abricasa",
"agent_phone": "+3232590404",
"agent_url": null,
"image_urls": [
"https://media-resize.immowebstatic.be/classifieds/629484bd-7e96-4a34-af1f-4f0f8a3b9835/2560x1440/72916ef644f06155e5d7a7ab5d52e693.jpg",
"https://media-resize.immowebstatic.be/classifieds/629484bd-7e96-4a34-af1f-4f0f8a3b9835/2560x1440/778461adc06f55df6352cb504b2a5853.jpg",
"..."
],
"description": "Surf naar www.abricasa.be en plan jouw verhuurafspraak in samen met onze digitale assistente Alice!\n\nFijn appartement met 2 slaapkamers op 't Zuid!\n\nVia de lift/trap bereik je het appartement op de 3e verdieping. Vooraan bevindt zich de ruime en lichtrijke ...",
"scraped_at": "2026-10-30T14:58:50Z"
}

Extra fields with the Price history add-on

{
"first_seen_at": "2026-10-23T07:00:12+00:00",
"previous_price": 575000,
"price_change": -25000,
"price_change_pct": -4.35,
"status_changed": false,
"price_history": [
{ "at": "2026-10-23T07:00:12+00:00", "price": 575000, "status": "available" },
{ "at": "2026-10-30T07:00:09+00:00", "price": 550000, "status": "available" }
]
}

What can I do with Immoweb data?

  • 📉 Price drop alerts: schedule a run with Price history and get notified when price_change is negative
  • 🏘️ Market research: asking prices per m² per postcode, new supply per week, time on market
  • 🔎 Deal finding and investment: filter by price, area and EPC label, compare rent and sale prices per neighbourhood
  • 📇 Lead generation: agents and notaries with their active listings per region
  • 🧠 AI and analytics: feed descriptions and attributes into valuation models or LLM pipelines

Tips for best results

  • Immoweb shows at most about 9,960 results per search (333 pages of 60). To collect more, split the search by postcode or by price range and run them as separate searches or several Search URLs.
  • Results come in Immoweb's "newest" order, which follows the last modification: a listing whose price just changed or that was re-activated comes first (roughly, not strictly by date), which is what you want for monitoring.
  • For a daily feed, schedule a run with a high Max listings and Price history switched on.
  • Leave Full details off for counting, price monitoring and market research; switch it on when you need descriptions or agent phone numbers.
  • New-build projects appear as one listing with price_type from (the lowest price of the project).
  • Results from one run are deduplicated by listing ID.

Price history

Switch on Price history (trackHistory) and the Actor remembers every listing between runs, so you can see price drops, status changes and how long a property has been on the market.

  • Where it lives. History is kept in a named key-value store in your own Apify account (default name realestate-history, change it with History store name). Named stores never expire, you own the data, and storage costs a fraction of a cent.
  • First run starts the series. The first time a listing is seen there is nothing to compare with, so previous_price is null and you are not charged for the add-on on that listing. From the second run on, each listing gets first_seen_at, previous_price, price_change, price_change_pct, status_changed and price_history (the last 20 price/status points, one point per change).
  • Run it on a schedule. History only grows when you run the Actor. Create a schedule (daily is typical) with the same search and the same store name.
  • One store, several Actors. Every real-estate Actor we publish uses the same default store name, so a listing keeps one history even if you scrape it with a different one of our Actors. Item IDs start with the site (immoweb:...), so sites never clash. Use a different store name per search if you want separate series.
  • Do not run two runs on the same store at the same time. Records are updated per listing and the last writer wins, so two parallel runs can overwrite each other's newest point. Run searches that share a store one after another.
  • If you delete the store, the Actor starts a new empty history without an error.
  • Cost: $1.00 per 1,000 listings that already had history (see pricing above).
  • Immoweb also marks recent price changes itself: old_price holds the previous price on listings the agent reduced. It is free and always on, but it is only the last change; Price history keeps every change you saw.

Frequently asked questions

Can I use Immoweb Listings Scraper with the Apify API?

Yes. Every run has a dataset you can read through the Apify API. Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("carabain-digital/immoweb-listings").call(run_input={
"location": "Gent",
"listing_type": "sale",
"property_type": "house",
"max_price": 450000,
"limit": 100,
})
for home in client.dataset(run["defaultDatasetId"]).iterate_items():
print(home["price"], home["address"], home["living_area_m2"], "m2")

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('carabain-digital/immoweb-listings').call({
location: 'Gent',
listing_type: 'sale',
property_type: 'house',
max_price: 450000,
limit: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'listings');

Can I use Immoweb Listings Scraper through an MCP server or with AI agents?

Yes. Add it to an AI agent through the Apify MCP server (https://mcp.apify.com?tools=carabain-digital/immoweb-listings), or let the agent find it with search-actors and run it with call-actor. A small search (limit 20) finishes in a few seconds, and the items are flat and small, so agents can read them with get-dataset-items. Example prompt: "Use Immoweb Listings Scraper to list the 20 newest apartments for rent in Antwerp under 1,500 euro and tell me which have an A or B energy label."

Can I integrate Immoweb data with other apps?

Yes: Google Sheets, Slack, Make, Zapier, n8n, Airtable or your own webhook, through Apify integrations and webhooks. Schedule a run every morning and send the new listings or price drops to your inbox or CRM.

Why do I need a proxy?

Immoweb is behind Cloudflare and blocks datacenter IP addresses. The Actor therefore defaults to Apify's residential proxy in Belgium. If a run is blocked it retries once on a fresh proxy session; if it still fails the run fails with a clear message instead of returning an empty dataset.

Why is a field empty?

Without Full details, description, construction_year, bathrooms, listed_at, agent_phone and agent_url are null: Immoweb only publishes them on the listing page. Some listings also have no area, room count or EPC label, and private sellers have no agent_name.

What does old_price mean?

When an agent lowers (or changes) the asking price, Immoweb keeps the previous price and flags the listing as a new price. old_price carries that previous price; it is null for listings without a recent price change.

Does it cover sold and rented properties?

No. Immoweb search results only list what is currently for sale or for rent. status is under_offer for listings marked "under option"; with Full details it is also set to sold or rented when the page says so.

The Actor only collects publicly visible listings, the same data anyone can see on immoweb.be. Listings can contain personal data (for example the name or phone number of a private seller or agent), and rules such as GDPR may apply to how you store and use it. Check your use case with a lawyer. More background: Is web scraping legal?

Immoweb Listings Scraper not working? Feedback

Open an issue on the Issues tab of this Actor with the run link and we will look at it. Feature ideas are welcome there too.

Other scrapers by us

ActorCovers
Zimmo Listings ScraperBelgium: zimmo.be, houses and apartments for sale and rent, with the site's own price history
Immovlan Listings ScraperBelgium: immovlan.be
Huislijn Listings ScraperNetherlands: huislijn.nl
Pararius Listings ScraperNetherlands: pararius.nl, rentals and sales
Belgium Real Estate ScraperZimmo, Immoweb and Immovlan in one run, merged and deduplicated

⭐ Does it work well for you? A review on the Store page helps others find this Actor and helps us keep it maintained.