
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape Immoweb.be, Belgium's largest real estate portal: houses, apartments, land and commercial property for sale or rent. Paste search URLs or use filters and get price, bedrooms, surface, EPC, address, GPS, photos and agency contacts, plus the full listing record.
Scrape Immoweb.be, Belgium's largest real estate portal. Paste any search URL (or pick filters) and get clean rows for houses, apartments, land, garages and commercial property, for sale or rent: price, bedrooms, living and land area, EPC score, full address, GPS, photos and the agency with phone and email. Every row also carries the complete Immoweb listing record. No login, no browser.
/search/ URL in English, French or Dutch with your filters and every filter is kept. Or use the built-in filters (postal codes, provinces, price, bedrooms, surface, EPC) without visiting the site.priceEur, bedrooms, postalCode, epcScore…) up front, the full nested record after them.https://www.immoweb.be/en/search/house/for-sale/brussels/district?countries=BE. Paste one or more URLs into Immoweb URLs. Listing URLs (/en/classified/...) work too. (Or leave it empty and use the Filters section.)| Field | Description |
|---|---|
startUrls | Immoweb search or listing URLs (EN/FR/NL). |
maxItems | Maximum listings in total (default 20, 0 = no limit). |
transactionType, propertyType | Filters mode: for-sale / for-rent, and house, apartment, land, garage, office, business, industry… |
postalCodes, provinces | Where to search (filters mode). |
minPrice … maxSurface, epcScores, sortBy | Price, bedrooms, living and land area, EPC and sort order. |
includeDetails | Open every listing page for the full record (default on). |
proxyConfiguration | Datacenter proxy by default. |
{
"startUrls": ["https://www.immoweb.be/en/search/house/for-sale/brussels/district?countries=BE&orderBy=newest"],
"maxItems": 20,
"includeDetails": true
}
Filters example:
{
"transactionType": "for-rent",
"propertyType": "apartment",
"postalCodes": ["1050", "9000"],
"minPrice": 800,
"maxPrice": 1500,
"minBedrooms": 2,
"maxItems": 100
}
| Field | Description |
|---|---|
id, url | Immoweb listing id and page |
title, propertyType, propertySubtype, transactionType | What is offered |
priceEur, priceText, monthlyCosts | Price (monthly rent for rentals) |
bedrooms, bathrooms, livingAreaSqm, landAreaSqm | Size |
epcScore, primaryEnergyKwhPerSqm | Energy performance |
street, houseNumber, postalCode, locality, district, province, region, latitude, longitude | Location |
agencyName, agencyPhone, agencyEmail, agencyWebsite | Advertiser |
mainImage, imageCount, description, createdAt, updatedAt | Media, text, dates |
customers, property, transaction, price, media, flags, publication, statistics, … | The complete Immoweb listing record, nested as on the site |
detailFetched, original_request_url | Whether the listing page was read; the input it came from |
Example (fictional data, trimmed):
{
"id": 21900001,
"url": "https://www.immoweb.be/en/classified/house/for-sale/uccle/1180/21900001",
"title": "Bright family house with garden",
"propertyType": "HOUSE",
"propertySubtype": "HOUSE",
"transactionType": "FOR_SALE",
"priceEur": 695000,
"priceText": "€695,000",
"bedrooms": 4,
"bathrooms": 2,
"livingAreaSqm": 210,
"landAreaSqm": 420,
"epcScore": "C",
"street": "Avenue de l'Exemple",
"houseNumber": "12",
"postalCode": "1180",
"locality": "Uccle",
"province": "Brussels",
"latitude": 50.80,
"longitude": 4.36,
"agencyName": "Example Immo",
"agencyPhone": "+3220000000",
"agencyEmail": "info@example-immo.be",
"mainImage": "https://media-resize.immowebstatic.be/classifieds/.../736x736/photo.jpg",
"imageCount": 24,
"createdAt": "2026-10-01T09:00:00.000Z",
"detailFetched": true,
"property": { "type": "HOUSE", "bedroomCount": 4, "netHabitableSurface": 210, "land": { "surface": 420 }, "...": "..." },
"transaction": { "type": "FOR_SALE", "certificates": { "epcScore": "C" }, "sale": { "price": 695000 } },
"original_request_url": "https://www.immoweb.be/en/search/house/for-sale/brussels/district?countries=BE"
}
You pay per listing saved: $1 per 1,000 listings for search-card data, plus $2 per 1,000 for listings opened with full details. So 1,000 detailed listings cost about $3 in event fees. Platform usage (compute and proxy traffic) is billed separately and is small for this actor.
Is it legal? The scraper only reads public listing pages that anyone can open without an account. Respect Immoweb's terms and privacy law (GDPR) when you store or use agency contact data.
Do I need a login or a proxy? No login. The default datacenter proxy works; switch to residential only if you see many refused requests.
How many results can I get? Immoweb serves up to 333 pages (about 9,990 listings) per search. Ask for more and the scraper splits the search into price bands; listings without a public price can only be reached inside the first 9,990.
Why is a field empty? Advertisers fill different fields. Agency phone/email, description and dates need Include full listing details.
Can I schedule it or use the API? Yes. Schedule daily runs (sorted by newest) and read results through the API or integrations.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalImmoweb URLs
Immoweb.be search URLs (/en/search/..., also French and Dutch links) or listing URLs (/en/classified/...). Run any search on immoweb.be with your filters and paste the address bar URL; every on-site filter is kept and all pages are read. Leave empty to use the filters below instead.
maxItemsintegerOptionaldefault 20Maximum listings
Stop after this many listings in total across all URLs. 0 means no limit.
Used only when no Immoweb URLs are given above.
transactionTypeenumOptionaldefault "for-sale"Transaction
Buy or rent.
propertyTypeenumOptionaldefault "house"Property type
Kind of property.
postalCodesarrayOptionalPostal codes
Belgian 4-digit postal codes, e.g. 1050 or 9000. Leave empty for all of Belgium.
provincesarrayOptionalProvinces
One or more provinces. Leave empty for all of Belgium.
minPriceintegerOptionalMin price (€)
Minimum price; monthly rent for rentals.
maxPriceintegerOptionalMax price (€)
Maximum price; monthly rent for rentals.
minBedroomsintegerOptionalMin bedrooms
Minimum number of bedrooms.
maxBedroomsintegerOptionalMax bedrooms
Maximum number of bedrooms.
minSurfaceintegerOptionalMin living area (m²)
Minimum habitable surface.
maxSurfaceintegerOptionalMax living area (m²)
Maximum habitable surface.
minLandSurfaceintegerOptionalMin land area (m²)
Minimum plot surface.
epcScoresarrayOptionalEPC scores
Energy performance certificate scores to include.
newlyBuiltOnlybooleanOptionaldefault falseNewly built only
Only newly built properties.
sortByenumOptionaldefault "newest"Sort by
Order of the results.
includeDetailsbooleanOptionaldefault trueInclude full listing details
Open every listing page for the full record: description, agency phone and email, EPC details, rooms, surfaces, building, energy, all photos and more. Turn off for faster, cheaper search-card data only (price, type, bedrooms, surface, address, GPS, photos, agency name).
maxConcurrencyintegerOptionaldefault 10Max concurrency
Parallel requests to Immoweb.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxy works for Immoweb. Switch to residential if you see many refused requests.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| mainImage | string | null | Main photo |
| title | string | null | Listing title |
| priceEur | number | null | Price in EUR (monthly rent for rentals) |
| propertySubtype | string | null | Property subtype, e.g. HOUSE, VILLA, APARTMENT |
| transactionType | string | null | FOR_SALE or FOR_RENT |
| bedrooms | integer | null | Bedroom count |
| livingAreaSqm | number | null | Habitable surface in m² |
| landAreaSqm | number | null | Plot surface in m² |
| epcScore | string | null | Energy performance score |
| street | string | null | Street |
| postalCode | string | null | Postal code |
| locality | string | null | Municipality |
| province | string | null | Province |
| agencyName | string | null | Advertiser (agency) name |
| agencyPhone | string | null | Advertiser phone (with details) |
| createdAt | string | null | Publication date (with details) |
| url | string | null | Listing page |
| id | integer | null | Immoweb listing id |
| latitude | number | null | GPS latitude |
| longitude | number | null | GPS longitude |
| agencyEmail | string | null | Advertiser email |
| agencyWebsite | string | null | Advertiser website |
| description | string | null | Full description (with details) |
| detailFetched | boolean | null | Full listing page was read |
| imageCount | integer | null | Number of photos |
| priceText | string | null | Displayed price |
| updatedAt | string | null | Last modified |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing details | Full listing page read for a saved listing (description, agency contacts, all fields). Only when Include full listing details is on. | $0.002 |
| Listing | One Immoweb listing saved to the dataset. | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('roamandroof/immoweb-scraper').call({
"startUrls": [
"https://www.immoweb.be/en/search/house/for-sale/brussels/district?countries=BE&orderBy=newest"
],
"maxItems": 20,
"postalCodes": [],
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run roamandroof/immoweb-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=roamandroof/immoweb-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Rentals with 2+ bedrooms in chosen postal codes.
Listings from a Dutch Immoweb search link with details.
Quick list of listings from a search link.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.