Netherlands Rental Listings
Last updated November 12, 2026
Netherlands rental listings from Kamernet, HousingAnywhere, and 11 anti-squat agency sites in one deduplicated list, with municipal registration status, hide reasons with the matched sentence, and new since last run tracking.
Install
npx @mambalabsdev/mcp-dutch-rental-listingsEvery tool here also runs hosted, with no install at all, through Apify's MCP endpoint.
Features
- One deduplicated list from Kamernet, HousingAnywhere, and 11 anti-squat agency sites.
- Municipal registration status with the listing's own sentence as proof.
- Hide reasons with the matched sentence, never a silent drop.
- New and stale flags from first seen and last seen tracking in your own account.
- Pay per event: Listing row at $0.0011.
Input
locationstringoptionalA Dutch city (Kamernet's 212 cities, such as Utrecht or Den Haag), a province as province:noord-holland, or netherlands for the whole country. A bare name that is both a city and a province (Utrecht, Groningen) is the city.
radiusKmstringoptionalKamernet only: also search this far around the city. 0, 1, 2, 5, 10 (default), or 20; other values round up. HousingAnywhere and the agencies search the city itself.
sourcesarrayoptionalkamernet, housinganywhere, antisquat_agencies (11 Dutch anti-squat agency sites). Default: all three.
propertyTypesarrayoptionalKeep only these: room, studio, apartment, house, anti-squat, student-residence, other. Empty keeps all.
maxResultsstringoptionalListings to return as charged rows. Default 50.
maxRentstringoptionalDrop listings above this rent. A listing with no rent stays.
minSizestringoptionalDrop listings smaller than this. A listing with no size stays.
minRoomsstringoptionalDrop listings with fewer rooms. Kamernet states rooms only on the detail page, so this works there with includeDetails on.
furnishedarrayoptionalKeep only these: furnished, unfurnished, uncarpeted. A listing that does not say stays.
registrationOnlystringoptionaltrue: keep only listings whose text or listed field says municipal registration is possible (registration_status yes, listed_yes, or flag). Text needs includeDetails on.
availableBystringoptionalYYYY-MM-DD. Drop listings available only after this day. A listing with no date stays.
hasInternetstringoptionalKamernet's own filter, sent with the search.
privateBathroomstringoptionalKamernet's own filter.
privateKitchenstringoptionalKamernet's own filter.
privateToiletstringoptionalKamernet's own filter.
petsAllowedstringoptionalKamernet's own filter.
smokingAllowedstringoptionalKamernet's own filter.
numberOfPeoplestringoptionalKamernet's own filter: 1 to 5 tenants.
tenantGenderstringoptionalKamernet's own filter: male or female.
tenantAgestringoptionalKamernet's own filter: your age in years, 16 to 99.
roommatesMaxstringoptionalKamernet's own filter: none, up_to_4, or up_to_8.
roommateGendersarrayoptionalKamernet's own filter: male, female, mixed.
landlordTypesarrayoptionalKamernet's own filter: private, agent.
includeDetailsstringoptionaltrue: read each returned listing's detail page for the full text, house rules, landlord type, deposit, and the text based registration and hide rules. Charged per page read. Default false.
includeLandlordNamestringoptionaltrue: add the landlord's display name. Off by default, because on Kamernet most landlords are private people.
blockedLandlordIdsarrayoptionalLandlord account IDs (landlord_id) whose listings are returned as free hidden_listing rows instead of charged rows.
excludeGenderOnlystringoptionaltrue: a listing whose text limits it to one gender becomes a free hidden_listing row with the matched sentence. false: it is returned with the reason in hide_reasons.
excludeLanguageOnlystringoptionaltrue: a listing whose text limits it to Dutch or Polish speakers becomes a free hidden_listing row.
excludeStudentOnlystringoptionaltrue: a listing whose text limits it to students becomes a free hidden_listing row.
excludeShortStaystringoptionaltrue: a listing whose text or listed maximum stay is under 3 months becomes a free hidden_listing row.
trackChangesstringoptionaltrue (default): keep first seen and last seen for this search in a named key-value store in your own Apify account, so later runs mark new and stale listings.
draftMessagesstringoptionaltrue: write a first message to each landlord with your own model key and applicantProfile. Turns on includeDetails. Needs llmApiKey; without one the run fails with a plain error.
llmProviderstringoptionalopenai (default), anthropic, gemini, or groq. Used only with draftMessages.
llmApiKeystringoptionalYour own key for the provider above. It goes only to that provider, is never stored or logged, and is never sent to the model.
llmModelstringoptionalA model name from your provider. Empty uses gpt-4o-mini, claude-haiku-4-5-20251001, gemini-2.5-flash, or llama-3.3-70b-versatile.
applicantProfilestringoptionalFacts about you for the drafts, as JSON such as {"name": "Sam", "age": 29, "work": "software engineer", "move_in": "2026-12-01", "contact": "sam@example.com"} or plain lines. The model restates only these facts.
maxDraftsstringoptionalMost messages to draft in one run. Default 20.
max_charge_usdstringoptionalOptional. The run stops before a charge that would pass this amount. Free rows are always returned.
Output schema
{
"row_type": "string",
"listing_id": "string",
"source": "string",
"source_id": "string",
"title": "string",
"property_type": "string",
"city": "string",
"street": "string",
"neighborhood": "string",
"rent_eur": "number",
"utilities_included": "boolean",
"additional_costs": "string",
"deposit_eur": "number",
"surface_m2": "number",
"rooms": "number",
"furnished": "string",
"available_from": "string",
"available_until": "string",
"minimum_stay_months": "number",
"maximum_stay_months": "number",
"is_student_house": "boolean",
"registration_allowed": "boolean",
"registration_status": "string",
"registration_quote": "string",
"hide_reasons": "array",
"excluded_by": "array",
"student_evidence": "object",
"antisquat_signal": "string",
"suitable_gender": "string",
"suitable_age_min": "number",
"suitable_age_max": "number",
"suitable_for_persons": "number",
"roommate_count": "number",
"pets_allowed": "boolean",
"smoking_allowed": "boolean",
"internet_included": "boolean",
"private_bathroom": "boolean",
"private_kitchen": "boolean",
"landlord_type": "string",
"landlord_id": "string",
"landlord_name": "string",
"posted_date": "string",
"expired": "boolean",
"detail_read": "boolean",
"body_text": "string",
"url": "string",
"image_url": "string",
"also_listed_on": "array",
"first_seen": "string",
"last_seen": "string",
"is_new": "boolean",
"stale": "boolean",
"message_draft": "string",
"draft_error": "string",
"pages_read": "integer",
"listings_found": "integer",
"search_location": "string",
"row_status": "string",
"error_reason": "string",
"billable_events_json": "string",
"scraped_at": "string"
}Pricing
| Event | Free plan price |
|---|---|
| Listing row | $0.0011 |
| Detail page | $0.002 |
| Message draft | $0.003 |
| Actor Start | $0.012 |
Pay per event on the Apify platform. Paid Apify plans pay less per event. No subscription, no seat license.
On the Apify free plan the actor stops at $1.50 of charges a month, about 1,364 listings. Any paid Apify plan removes the cap.
Limits
- Not covered: Pararius, Huurwoningen, and Funda. Their pages refuse plain requests behind bot protection, and this actor does not get past bot protection.
- HousingAnywhere has no country page and no radius. A country search walks its 20 largest Dutch cities, and a province search walks every city Kamernet lists in that province.
- Agency rows are filtered by the city the agency states. A city search with a radius does not add nearby towns for agencies. Agency listings without a stated city appear only in a country search.
- Kamernet's registration_allowed is a hidden field that its listing page does not show; it was empty on 24 of 24 detail pages checked on 2026-11-09. registration_status yes or no needs the listing text, so it needs includeDetails on Kamernet and HousingAnywhere.
- The text rules are phrase lists in English and Dutch. They can miss a restriction written in other words, and they ignore a phrase negated in its own clause. Read the quote before you act on it.
- On the first run of a search every listing is is_new. A different location, radius, source set, type set, or Kamernet filter is a different search with its own store.
- Filters on a value the listing does not state keep the listing.
- Gapph was left out: its pages list places, but the listing cards could not be read on 2026-11-09.