Netherlands Rental Listings

live$0.0011/listingData Extraction

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.

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

locationstringoptional

A 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.

radiusKmstringoptional

Kamernet 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.

sourcesarrayoptional

kamernet, housinganywhere, antisquat_agencies (11 Dutch anti-squat agency sites). Default: all three.

propertyTypesarrayoptional

Keep only these: room, studio, apartment, house, anti-squat, student-residence, other. Empty keeps all.

maxResultsstringoptional

Listings to return as charged rows. Default 50.

maxRentstringoptional

Drop listings above this rent. A listing with no rent stays.

minSizestringoptional

Drop listings smaller than this. A listing with no size stays.

minRoomsstringoptional

Drop listings with fewer rooms. Kamernet states rooms only on the detail page, so this works there with includeDetails on.

furnishedarrayoptional

Keep only these: furnished, unfurnished, uncarpeted. A listing that does not say stays.

registrationOnlystringoptional

true: keep only listings whose text or listed field says municipal registration is possible (registration_status yes, listed_yes, or flag). Text needs includeDetails on.

availableBystringoptional

YYYY-MM-DD. Drop listings available only after this day. A listing with no date stays.

hasInternetstringoptional

Kamernet's own filter, sent with the search.

privateBathroomstringoptional

Kamernet's own filter.

privateKitchenstringoptional

Kamernet's own filter.

privateToiletstringoptional

Kamernet's own filter.

petsAllowedstringoptional

Kamernet's own filter.

smokingAllowedstringoptional

Kamernet's own filter.

numberOfPeoplestringoptional

Kamernet's own filter: 1 to 5 tenants.

tenantGenderstringoptional

Kamernet's own filter: male or female.

tenantAgestringoptional

Kamernet's own filter: your age in years, 16 to 99.

roommatesMaxstringoptional

Kamernet's own filter: none, up_to_4, or up_to_8.

roommateGendersarrayoptional

Kamernet's own filter: male, female, mixed.

landlordTypesarrayoptional

Kamernet's own filter: private, agent.

includeDetailsstringoptional

true: 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.

includeLandlordNamestringoptional

true: add the landlord's display name. Off by default, because on Kamernet most landlords are private people.

blockedLandlordIdsarrayoptional

Landlord account IDs (landlord_id) whose listings are returned as free hidden_listing rows instead of charged rows.

excludeGenderOnlystringoptional

true: 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.

excludeLanguageOnlystringoptional

true: a listing whose text limits it to Dutch or Polish speakers becomes a free hidden_listing row.

excludeStudentOnlystringoptional

true: a listing whose text limits it to students becomes a free hidden_listing row.

excludeShortStaystringoptional

true: a listing whose text or listed maximum stay is under 3 months becomes a free hidden_listing row.

trackChangesstringoptional

true (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.

draftMessagesstringoptional

true: 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.

llmProviderstringoptional

openai (default), anthropic, gemini, or groq. Used only with draftMessages.

llmApiKeystringoptional

Your own key for the provider above. It goes only to that provider, is never stored or logged, and is never sent to the model.

llmModelstringoptional

A 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.

applicantProfilestringoptional

Facts 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.

maxDraftsstringoptional

Most messages to draft in one run. Default 20.

max_charge_usdstringoptional

Optional. The run stops before a charge that would pass this amount. Free rows are always returned.

Output schema

json
{
  "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

$0.0011per listing
EventFree 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.

Available on