Immoweb API & Scraper
The Immoweb API returns Belgium's main property portal as clean JSON in five actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search covers homes for sale and to rent across the whole country or narrowed to postal codes, districts, provinces or a single estate agency, with the filters immoweb itself exposes: price, bedrooms, rooms, habitable and land surface, garden, terrace and kitchen surface, property type and subtype, EPC or PEB rating, building condition, construction year, facades, parking and sort order, 30 listings a page. Every row carries the price and the price per square metre, bedrooms, rooms, surfaces, the energy score, the address down to the postal code, coordinates, every photo, when the advertiser last touched it and the agency behind it, and a new-build development comes back with its price and bedroom range rather than a single price it does not have. property_detail adds the energy certificate with primary consumption and carbon emission, cadastral income, flood-zone and planning status, heating, the full description and the agency's own feature list. market_count answers how many listings match a filter combination without returning any of them, and costs nothing. location_search resolves a Belgian place name and costs nothing too. agency_search is the estate-agency directory. 27 filters were each proven to narrow a result against a control run in the same minute, and nine more that immoweb accepts but ignores are not offered at all. Prices are EUR and the listing text comes back in English, French or Dutch. No immoweb account, no browser, one ReefAPI key and the standard { ok, data, meta, error } envelope.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/immoweb/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"property_type": "house",
"transaction": "sale"
}
}{
"ok": true,
"meta": {
"api": "immoweb",
"endpoint": "search",
"mode": "live",
"latency_ms": 1136.7,
"record_count": 30,
"bytes": 1041726,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "max_pages",
"total_results": 51050,
"reachable_results": 9969,
"promoted_count": 0,
"grid_rows": 30,
"filters_applied": {
"transaction": "sale",
"property_type": "HOUSE",
"sort": "relevance"
},
"filters_ignored": null,
"sort": "relevance",
"language": "en",
"field_note": "total_results is immoweb's own market total; reachable_results is what its pagination can actually serve (about 9 990). price_per_sqm is computed here as price/surface_m2 — immoweb does not publish it on the results list — and is null when either is missing. Two kinds of listing have no single value and therefore come back with price null: a life annuity (price_type 'life_annuity' — see price_details.life_annuity for the lump sum and the monthly amount) and a new-build development (price_type 'group_sale' — see the `project` block for the price and surface range). Their bedrooms and surface_m2",
"charged_credits": 2,
"version": "1.0.0"
},
"data": {
"items": [
{
"property_id": 21866842,
"url": "https://www.immoweb.be/en/classified/21866842",
"promoted": false,
"transaction": "sale",
"transaction_type": "FOR_SALE",
"property_type": "HOUSE",
"property_subtype": "HOUSE",
"title": "Val de la Cambre - Exceptional house with renovation project",
"price": 1975000,
"price_display": "€1,975,000",
"price_type": "sale",
"price_period": null,
"price_details": {
"amount": 1975000,
"currency": "EUR",
"period": null,
"price_type": "sale",
"price_type_raw": "residential_sale",
"is_starting_price": null,
"public_sale": null,
"display": "€1,975,000",
"short_display": "€2M",
"old_amount": null,
"hidden": false,
"min_range": null,
"max_range": null,
"is_subject_to_vat": null,
"has_starting_price": null,
"price_per_sqm_published": null
},
"price_per_sqm": 5064.1,
"bedrooms": 4,
"rooms": 12,
"surface_m2": 390,
"land_surface_m2": 363,
"epc_score": null,
"epc_image_url": null,
"address": {
"country": "Belgium",
"region": "Brussels",
"region_code": "BRUSSELS",
"province": "Brussels",
"district": "Brussels",
"locality": "Ixelles",
"postal_code": "1050",
"street": "SQUARE DU VAL DE LA CAMBRE",
"number": "22",
"box": null,
"floor": null
},
"latitude": 50.8184998,
"longitude": 4.3783428,
"images": [
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
},
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
},
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
}
],
"has_video": false,
"has_virtual_tour": false,
"has_360_tour": false,
"flags": {
"main": "new",
"secondary": [],
"percentSold": null
},
"last_modified_at": "2026-09-24T17:00:11.329Z",
"published_at": null,
"project": null,
"agency": {
"name": "BARNES BRUSSELS",
"logo_url": "https://media-resize.immowebstatic.be/customers/0012p00002TxtsqAAB/500x500/logo/4a5fadf0a0e06c4c8137d89c95b8ea79.jpg"
},
"sales_pitch": null
},
{
"property_id": 21867800,
"url": "https://www.immoweb.be/en/classified/21867800",
"promoted": false,
"transaction": "sale",
"transaction_type": "FOR_SALE",
"property_type": "HOUSE",
"property_subtype": "HOUSE",
"title": "🏡 Double maison/poss d'aménagements, 4CHS, jardin",
"price": 165000,
"price_display": "€165,000",
"price_type": "sale",
"price_period": null,
"price_details": {
"amount": 165000,
"currency": "EUR",
"period": null,
"price_type": "sale",
"price_type_raw": "residential_sale",
"is_starting_price": null,
"public_sale": null,
"display": "€165,000",
"short_display": "€165K",
"old_amount": null,
"hidden": false,
"min_range": null,
"max_range": null,
"is_subject_to_vat": null,
"has_starting_price": false,
"price_per_sqm_published": null
},
"price_per_sqm": 820.9,
"bedrooms": 3,
"rooms": null,
"surface_m2": 201,
"land_surface_m2": 246,
"epc_score": "G",
"epc_image_url": "https://media.immowebstatic.be/epc/pics/peb/peb_g.png",
"address": {
"country": "Belgium",
"region": "Wallonie",
"region_code": "WALLONIE",
"province": "Liège",
"district": "Liège",
"locality": "Grâce-Hollogne",
"postal_code": "4460",
"street": "Rue Grande",
"number": "148",
"box": null,
"floor": null
},
"latitude": 50.6381503,
"longitude": 5.4746994,
"images": [
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
},
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
},
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
}
],
"has_video": false,
"has_virtual_tour": true,
"has_360_tour": false,
"flags": {
"main": "new",
"secondary": [],
"percentSold": null
},
"last_modified_at": "2026-09-25T08:26:01.216Z",
"published_at": null,
"project": null,
"agency": {
"name": "Nigel Immo",
"logo_url": "https://media-resize.immowebstatic.be/customers/0012p00002y1Ox2AAE/500x500/logo/31e8d4cb184748a902024e51f8236d59.jpg"
},
"sales_pitch": null
},
{
"property_id": 21869006,
"url": "https://www.immoweb.be/en/classified/21869006",
"promoted": false,
"transaction": "sale",
"transaction_type": "FOR_SALE",
"property_type": "HOUSE",
"property_subtype": "HOUSE",
"title": "MAISON 3CH - CE CONFORME - PEB C - JARDIN -GRÂCE-HOLLOGNE",
"price": 234900,
"price_display": "€234,900",
"price_type": "sale",
"price_period": null,
"price_details": {
"amount": 234900,
"currency": "EUR",
"period": null,
"price_type": "sale",
"price_type_raw": "residential_sale",
"is_starting_price": true,
"public_sale": null,
"display": "€234,900",
"short_display": "€234.9K",
"old_amount": null,
"hidden": false,
"min_range": null,
"max_range": null,
"is_subject_to_vat": null,
"has_starting_price": true,
"price_per_sqm_published": null
},
"price_per_sqm": 1620,
"bedrooms": 3,
"rooms": null,
"surface_m2": 145,
"land_surface_m2": 270,
"epc_score": "C",
"epc_image_url": "https://media.immowebstatic.be/epc/pics/peb/peb_c.png",
"address": {
"country": "Belgium",
"region": "Wallonie",
"region_code": "WALLONIE",
"province": "Liège",
"district": "Liège",
"locality": "Grâce-Hollogne",
"postal_code": "4460",
"street": "Rue Vert-Vinâve",
"number": "123",
"box": null,
"floor": null
},
"latitude": 50.6376211,
"longitude": 5.497464,
"images": [
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
},
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
},
{
"url": "[trimmed-depth]",
"large_url": "[trimmed-depth]",
"medium_url": "[trimmed-depth]",
"thumbnail_url": "[trimmed-depth]",
"is_vertical": "[trimmed-depth]"
}
],
"has_video": false,
"has_virtual_tour": false,
"has_360_tour": false,
"flags": {
"main": "new",
"secondary": [],
"percentSold": null
},
"last_modified_at": "2026-09-25T14:02:40.678Z",
"published_at": null,
"project": null,
"agency": {
"name": "SKYIMMO",
"logo_url": "https://media-resize.immowebstatic.be/customers/0012p00003Gsor9AAB/500x500/logo/75f5398ed606359b70b31cdcebd975bf.jpg"
},
"sales_pitch": null
}
],
"count": 30,
"total_results": 51050,
"reachable_results": 9969,
"promoted_count": 0,
"page": 1,
"pages_fetched": 1,
"page_size": 30,
"sort": "relevance",
"language": "en",
"filters_applied": {
"transaction": "sale",
"property_type": "HOUSE",
"sort": "relevance"
},
"filters_ignored": [],
"stop_reason": "max_pages"
}
}What the Immoweb API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| location_search | Resolve a Belgian place name, postal code, district, province or estate-agency name to the exact values `search` takes. Returns ranked matches, each carrying the parameter name and the value to pass, so a caller never has to guess an immoweb token. | Real-estate investors call location_search to resolve a Belgian place name, postal code, district, province or estate-agency name to the ex…. | query, kind, language |
| search | Search Belgian property listings — for sale or to rent — anywhere in Belgium or narrowed to postal codes, districts, provinces or one estate agency, with immoweb's own filters: price, bedrooms, rooms, habitable and land surface, garden, terrace and kitchen surface, property type and subtype, EPC/PEB rating, building condition, construction year, facades, parking, amenities and sort. 30 listings per page. | Brokerage tools call search to search Belgian property listings. | transaction, property_type, property_subtypes, country, postal_codes, ... |
| property_detail | The full immoweb listing: price and price per m², bedrooms, bathrooms, shower rooms and toilets, habitable / land / garden / terrace surfaces, EPC or PEB score with primary energy consumption and carbon emission, construction year, building condition and facade count, heating and energy equipment, cadastral income, monthly charges, flood zone and urban-planning status, land characteristics, parking, thirty amenity flags, address and coordinates, every photo, the full description in the language the advertiser wrote it, and the advertising agency. | Property dashboards call property_detail to get the full immoweb listing. | property_id, language |
| market_count | How many listings match a filter combination — immoweb's own total, in a 26-byte answer. Use it to size a market, to check a filter before paging through it, or to track supply over time without downloading any listings. | Lead-generation teams call market_count to get how many listings match a filter combination. | transaction, property_type, property_subtypes, country, postal_codes, ... |
| agency_search | The immoweb estate-agency directory, ranked by how much stock each agency is advertising: name, group, description, website, VAT and IPI registration number, address and coordinates, opening hours, and live for-sale / to-rent counts. Pass the agency_id to `search` to list everything that agency has on the market. | Real-estate investors call agency_search to get the immoweb estate-agency directory, ranked by how much stock each agency is advertising. | postal_codes, page, language |
Call search from your stack
curl -X POST https://api.reefapi.com/immoweb/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"property_type":"house","transaction":"sale"}'import requests
r = requests.post(
"https://api.reefapi.com/immoweb/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"property_type": "house",
"transaction": "sale"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/immoweb/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"property_type": "house",
"transaction": "sale"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.immoweb.search with {"property_type":"house","transaction":"sale"}.Who uses this API and why
- Track supply and asking prices by commune, province or EPC band, using the free market counter to size a slice before paying to page it.
- Feed a property portal or a buyer-alert service with fresh Belgian stock, filtered on what the advertiser last changed.
- Build comparables for a valuation model from surface, energy score, construction year and coordinates.
- Monitor one estate agency's stock, or find every agency active in a postcode.
- Compare the Belgian market against neighbouring portals on the same fields, with prices in EUR throughout.
Questions developers ask before integrating
Does the Immoweb API cover both sale and rental?
Yes, and both at once if you want. One transaction parameter switches between sale, rent and both. A rental comes back with the monthly rent and the monthly charges kept as separate numbers rather than added together.
Can I filter Belgian listings by EPC or PEB rating?
Yes, on every grade from A double plus down to G, plus a value for listings with none, and several grades at once. Note that the rating appears on the listing detail everywhere in the country while the results list only shows it for Walloon listings. That is the source's own behaviour, not a gap in the parser.
Belgium has three languages. Which one do I get?
Whichever you ask for: English, French or Dutch. Prices, surfaces, ids and coordinates are identical in all three, while province names, price formatting and the certificate wording are translated. Advertisers do not always write in all three, so each listing also says which language its description is actually in.
How do I know an Immoweb filter really applied?
Every response echoes the filters that were applied and the ones that were dropped. This matters here more than usual: immoweb answers HTTP 200 and returns the whole unfiltered market for a filter value it does not recognise, which would look like a filtered result and be nothing of the kind. A request whose filter the source would have quietly dropped is refused rather than answered with unfiltered rows wearing a filtered label.
How many Immoweb listings can I page through?
Thirty per page, up to page 333, which is roughly 9,990 listings per query and the source's own limit. Every response also carries the true market total, so you can see how much a query covers and slice it by postcode, province or price band when it is bigger than that. market_count answers the size question on its own, for free, without returning a single listing.
Do I get the agency's contact details?
The agency's name, website and registration numbers always. Its phone number and e-mail address are contact data and are returned only when you opt in with include_pii. A private seller's personal contact details are never returned.
What is the Immoweb API?
Immoweb API is a ReefAPI endpoint group for belgian property for sale and to rent: price, surfaces, energy certificate and the advertising agency. It returns live JSON through POST requests under /immoweb/v1.
Is the Immoweb API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Immoweb calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Immoweb login or account?
No login to Immoweb is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Immoweb data?
The page example is captured from a live location_search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Immoweb API use?
Immoweb actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Immoweb from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call immoweb actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Immoweb API an Immoweb scraper?
It is the managed alternative to a DIY Immoweb scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same belgian property for sale and to rent: price, surfaces, energy certificate and the advertising agency back as clean JSON.
Why does my Immoweb scraper keep getting blocked?
Most Immoweb scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.