# Netherlands Rental Listings (`mambalabs/dutch-rental-listings`) Actor

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.

- **URL**: https://apify.com/mambalabs/dutch-rental-listings.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.93 / 1,000 listing rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Netherlands Rental Listings

Give a Dutch city, a province, or the whole Netherlands. The actor searches Kamernet, HousingAnywhere, and 11 Dutch anti-squat (antikraak) agency sites, merges them into one list without repeats, and returns one row per listing: rent, size, type, availability, municipal registration status with the listing's own sentence as proof, hide reasons with the matched sentence, and first seen and last seen for your search. You pay per listing returned, plus per detail page read and per message drafted when you turn those on. Mamba Labs pays the platform costs of the run.

It does not cover Pararius, Huurwoningen, Funda, or Gapph.

### Features

- One list from Kamernet, HousingAnywhere, and 11 anti-squat agencies, with repeats removed by listing id and, across sources, by the same street, rent, and size.
- Search a city with a radius (Kamernet), a province (every city Kamernet lists in it), or the whole country.
- Kamernet's own 12 search filters (internet, private bathroom, kitchen, or toilet, pets, smoking, number of people, tenant gender and age, maximum roommates, roommate gender, landlord type), plus filters on rent, size, rooms, furnishing, registration, and move in date.
- Registration status for municipal registration (inschrijving): `yes` or `no` only when the listing text says so, with the sentence in `registration_quote`.
- Hide rules reported, never applied in silence: every match comes back in `hide_reasons` with its sentence. Turn on an exclude switch and the listing comes back as a free `hidden_listing` row instead of a charged row.
- New since last run: with `trackChanges` on, a named key-value store in your own Apify account keeps first seen and last seen for this search, so later runs mark `is_new` and `stale` (first seen 10 or more days ago).
- Optional detail pages: full text, house rules, deposit, landlord type, and the text based rules.
- Optional landlord message drafts written by your own OpenAI, Anthropic, Gemini, or Groq key from the applicant facts you give.

### How the data is read

Every page is a public page that a logged out visitor can open. Requests go over plain HTTP through the Apify proxy default pool (datacenter addresses), with the user agent `MambaLabs-DutchRentalListings/0.1`. There is no browser, no residential address, no login, no captcha handling, and no call to another developer's actor.

- Kamernet: the search pages' embedded page data, 17 listings a page.
- HousingAnywhere: the search pages' embedded page data, 23 listings a page, on the paths its robots.txt allows.
- Anti-squat agencies: each agency's own listings page: Alvast, De Kabath Vastgoedbeheer, De Vastgoedbeschermer, Livable, Maximus Vastgoedbeheer, Monoma, OAK Management, Oranje Steengoed Beheer, Totalus Beheer, 24/7 Vastgoedbeheer, and VPS.

The actor reads robots.txt on every host first and obeys it. A robots.txt that cannot be read blocks that host for the run. It waits 3 seconds between requests to one host, and on a rate limit answer (HTTP 429) it waits 6 seconds, tries twice more, and then leaves that page out.

Kamernet's and HousingAnywhere's terms of use restrict automated collection. You are responsible for how you use the data.

The model key for drafts is yours. It goes only to the provider you pick, and the actor stores no key of any kind.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `location` | string |  | 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. |
| `radiusKm` | string | `10` | 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. |
| `sources` | array | `kamernet,housinganywhere,antisquat_agencies` | kamernet, housinganywhere, antisquat_agencies (11 Dutch anti-squat agency sites). Default: all three. |
| `propertyTypes` | array |  | Keep only these: room, studio, apartment, house, anti-squat, student-residence, other. Empty keeps all. |
| `maxResults` | string | `50` | Listings to return as charged rows. Default 50. |
| `maxRent` | string |  | Drop listings above this rent. A listing with no rent stays. |
| `minSize` | string |  | Drop listings smaller than this. A listing with no size stays. |
| `minRooms` | string |  | Drop listings with fewer rooms. Kamernet states rooms only on the detail page, so this works there with includeDetails on. |
| `furnished` | array |  | Keep only these: furnished, unfurnished, uncarpeted. A listing that does not say stays. |
| `registrationOnly` | string | `false` | 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. |
| `availableBy` | string |  | YYYY-MM-DD. Drop listings available only after this day. A listing with no date stays. |
| `hasInternet` | string | `false` | Kamernet's own filter, sent with the search. |
| `privateBathroom` | string | `false` | Kamernet's own filter. |
| `privateKitchen` | string | `false` | Kamernet's own filter. |
| `privateToilet` | string | `false` | Kamernet's own filter. |
| `petsAllowed` | string | `false` | Kamernet's own filter. |
| `smokingAllowed` | string | `false` | Kamernet's own filter. |
| `numberOfPeople` | string |  | Kamernet's own filter: 1 to 5 tenants. |
| `tenantGender` | string |  | Kamernet's own filter: male or female. |
| `tenantAge` | string |  | Kamernet's own filter: your age in years, 16 to 99. |
| `roommatesMax` | string |  | Kamernet's own filter: none, up_to_4, or up_to_8. |
| `roommateGenders` | array |  | Kamernet's own filter: male, female, mixed. |
| `landlordTypes` | array |  | Kamernet's own filter: private, agent. |
| `includeDetails` | string | `false` | 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. |
| `includeLandlordName` | string | `false` | true: add the landlord's display name. Off by default, because on Kamernet most landlords are private people. |
| `blockedLandlordIds` | array |  | Landlord account IDs (landlord_id) whose listings are returned as free hidden_listing rows instead of charged rows. |
| `excludeGenderOnly` | string | `false` | 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. |
| `excludeLanguageOnly` | string | `false` | true: a listing whose text limits it to Dutch or Polish speakers becomes a free hidden_listing row. |
| `excludeStudentOnly` | string | `false` | true: a listing whose text limits it to students becomes a free hidden_listing row. |
| `excludeShortStay` | string | `false` | true: a listing whose text or listed maximum stay is under 3 months becomes a free hidden_listing row. |
| `trackChanges` | string | `true` | 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. |
| `draftMessages` | string | `false` | 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. |
| `llmProvider` | string | `openai` | openai (default), anthropic, gemini, or groq. Used only with draftMessages. |
| `llmApiKey` | string |  | 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. |
| `llmModel` | string |  | 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. |
| `applicantProfile` | string |  | 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. |
| `maxDrafts` | string | `20` | Most messages to draft in one run. Default 20. |
| `max_charge_usd` | string |  | Optional. The run stops before a charge that would pass this amount. Free rows are always returned. |

### Output

| Field | Type | What it holds |
|---|---|---|
| `row_type` | string | One of: listing, hidden_listing, source_status, run_summary. run_summary is the one free row written when the input is refused. |
| `listing_id` | string | Source and the source's own id, for example kamernet:2417298. Stable across runs. |
| `source` | string | kamernet, housinganywhere, or the anti-squat agency's slug, such as alvast. |
| `source_id` | string | The id the source uses; for an agency, the listing page address. |
| `title` | string | The listing title, when the source gives one. |
| `property_type` | string | room, studio, apartment, house, anti-squat, student-residence, or other. |
| `city` | string | City as the source states it. |
| `street` | string | Street name as the source states it. |
| `neighborhood` | string | Neighborhood, HousingAnywhere only. |
| `rent_eur` | number | Monthly rent the source lists. Kamernet lists the total including service costs. |
| `utilities_included` | boolean | true or false when the source states it, null when it does not. |
| `additional_costs` | string | Costs on top of rent, from the detail page: service costs, internet, agency fee, or the bills HousingAnywhere includes. |
| `deposit_eur` | number | Deposit from the Kamernet detail page. |
| `surface_m2` | number | Floor area in square meters. |
| `rooms` | number | Number of rooms. Kamernet gives it on the detail page only. |
| `furnished` | string | Furnished, Unfurnished, or Uncarpeted. |
| `available_from` | string | First day available, YYYY-MM-DD. |
| `available_until` | string | Last day of a fixed term, YYYY-MM-DD. |
| `minimum_stay_months` | number | HousingAnywhere's minimum stay. |
| `maximum_stay_months` | number | HousingAnywhere's maximum stay. |
| `is_student_house` | boolean | The source's own student house flag (Kamernet) or co-living flag (HousingAnywhere). |
| `registration_allowed` | boolean | The source's own registration field. On Kamernet this is a hidden flag that the listing page does not show, and it was empty on 24 of 24 detail pages checked on 2026-11-09. On HousingAnywhere it is shown on the listing. |
| `registration_status` | string | Municipal registration (inschrijving): yes or no from the listing text, listed_yes or listed_no from HousingAnywhere's field, flag or unconfirmed from Kamernet's hidden flag with no text, or null when nothing says. |
| `registration_quote` | string | The listing's own sentence behind a yes or no. |
| `hide_reasons` | array | Every hide rule the listing matched, each as {reason, quote} with the matched sentence: blocked landlord, maximum applications reached, international student room, gender only, language only, business use only, no internationals, 2 or more tenants required, short stay, students only, no registration. |
| `excluded_by` | array | On a hidden_listing row, the exclude switches that removed it from the charged rows. |
| `student_evidence` | object | {kind, label, quote}: kind restrict means the text limits the place to students; kind house means it is a student house without a restriction. |
| `antisquat_signal` | string | typed when the source types the listing anti-squat, text when only its text says so. |
| `suitable_gender` | string | male, female, or any, from the detail page. |
| `suitable_age_min` | number | From the detail page. |
| `suitable_age_max` | number | From the detail page. |
| `suitable_for_persons` | number | Number of tenants the landlord accepts, from the detail page. |
| `roommate_count` | number | Number of roommates, Kamernet detail page. |
| `pets_allowed` | boolean | From the detail page. |
| `smoking_allowed` | boolean | From the detail page. |
| `internet_included` | boolean | From the detail page. |
| `private_bathroom` | boolean | Kamernet detail page. |
| `private_kitchen` | boolean | Kamernet detail page. |
| `landlord_type` | string | Private owner, Roommate, Real estate agent, Rental company, or Other. |
| `landlord_id` | string | The source's account id for the landlord, for your blockedLandlordIds list. |
| `landlord_name` | string | Only when includeLandlordName is true. Off by default: on Kamernet most landlords are private people. |
| `posted_date` | string | When Kamernet published the advert, YYYY-MM-DD. |
| `expired` | boolean | true when the detail page says the listing is gone. |
| `detail_read` | boolean | true when the listing's detail page was read and charged. null when includeDetails is off. |
| `body_text` | string | The listing description, up to 5,000 characters. On a search only run an agency row carries its index card text and portal rows carry none. |
| `url` | string | The listing page. |
| `image_url` | string | First photo. |
| `also_listed_on` | array | Listing IDs on other sources with the same street, rent, and size. Those copies are not returned as rows. |
| `first_seen` | string | When a run of this same search first returned the listing, UTC. Needs trackChanges. |
| `last_seen` | string | This run, UTC. |
| `is_new` | boolean | true when no earlier run of this same search returned the listing. Every listing is new on the first run. |
| `stale` | boolean | true when the listing was first seen 10 or more days ago. |
| `message_draft` | string | A first message to the landlord written by your own model from your applicantProfile. Read it before you send it. |
| `draft_error` | string | Why no draft was written for this listing, when drafting was on. |
| `pages_read` | integer | On a source_status row, pages this source answered. |
| `listings_found` | integer | On a source_status row, listings this source returned before your filters. |
| `search_location` | string | The location the run searched. |
| `row_status` | string | ok, or why this row carries no data: no_results, no_change, partial, blocked, or error. |
| `error_reason` | string | Why the row is not ok. A refused input reads input_invalid: followed by what to fix. |
| `billable_events_json` | string | What this row was billed as, for example {"listing-row":1}. {} means free. |
| `scraped_at` | string | When the row was written, UTC. |

Each run also writes one free `source_status` row per source, with pages read, listings found, and any error, and a `RUN_SUMMARY` record in the run's key-value store.

### Pricing

Pay per event. Hidden listings, source status rows, failed drafts, and a refused input are free.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| `listing-row`, one listing | $0.0011 | $0.001045 | $0.00099 | $0.000935 |
| `detail-page`, one detail page read, with includeDetails on | $0.002 | $0.0019 | $0.0018 | $0.0017 |
| `message-draft`, one message drafted on your own key, with draftMessages on | $0.003 | $0.00285 | $0.0027 | $0.00255 |
| `apify-actor-start`, once per run (one per GB of memory; the default 256 MB is one) | $0.012 | $0.012 | $0.012 | $0.012 |

Per 1,000 rows of `listing-row`: $1.10 on the free plan, $0.94 on Gold.

Free plan cap: 1.50 USD of evaluation a month, about 1364 rows. Any paid Apify plan removes the cap, and it resets on the 1st. The run stops before a charge that passes your maximum charge per run in Apify or your `max_charge_usd` input.

Mamba Labs pays the platform costs of your run, Apify proxy traffic included.

Your model provider bills drafts on your own key separately.

### Usage examples

Rooms in Utrecht under 800 EUR, Kamernet and HousingAnywhere only:

```json
{ "location": "Utrecht", "sources": ["kamernet", "housinganywhere"], "propertyTypes": ["room"], "maxRent": "800", "maxResults": "50" }
```

New anti-squat places in Noord-Holland since your last run of the same search:

```json
{ "location": "province:noord-holland", "sources": ["antisquat_agencies", "kamernet"], "propertyTypes": ["anti-squat"], "trackChanges": "true" }
```

Studios in Amsterdam with detail pages, registration possible, and drafts on your own key:

```json
{ "location": "Amsterdam", "propertyTypes": ["studio"], "includeDetails": "true", "registrationOnly": "true", "draftMessages": "true", "llmProvider": "openai", "llmApiKey": "YOUR_KEY", "applicantProfile": "{\"name\": \"Sam\", \"work\": \"software engineer\"}" }
```

**Clay.** Number and on or off inputs are text fields, which is what Clay sends. A list input takes a JSON list, so put the column inside a one item list.

**MCP.** The Mamba Labs MCP server `@mambalabsdev/mcp-dutch-rental-listings` exposes this actor to Claude and other MCP clients.

### Error handling

| Case | What you get |
|---|---|
| Missing or unreadable input | One free row, `row_type` `run_summary`, `error_reason` starting `input_invalid:` with what to fix. The run ends successfully and charges nothing but the run start |
| `draftMessages` on with no `llmApiKey` | The same free `input_invalid:` row, and the run ends as failed with that message |
| A source or agency site fails, blocks, or rate limits | Its `source_status` row says so, free. The other sources still return rows |
| A detail page cannot be read | The listing row comes back with `row_status` `partial` and the reason, charged as a listing only |
| A draft fails at your provider | The listing row comes back with `draft_error`; the draft is not charged |
| The run is close to its timeout | The actor stops starting new work 90 seconds before the timeout and delivers what it has |

### Limitations

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

### Mamba Labs actor suite

| Actor | Actor ID |
|---|---|
| [Account Hiring Watch](https://apify.com/mambalabs/account-hiring-watch?fpr=mamba) | `gRAZA5WBi1r6L0gy7` |
| [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor?fpr=mamba) | `anxbRv0lKrpQ1pnua` |
| [Agent to Brokerage Resolver](https://apify.com/mambalabs/agent-brokerage-resolver?fpr=mamba) | `ePRRGLxOGyaVHO4dI` |
| [AI Answer Visibility Tracker](https://apify.com/mambalabs/ai-answer-visibility-tracker?fpr=mamba) | `RJZvzKniYK4nswcMg` |
| [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector?fpr=mamba) | `EwkHhmqiuJgRoVEbE` |
| [Amazon Product, Price, and Stock Tracker](https://apify.com/mambalabs/amazon-product-price-stock-tracker?fpr=mamba) | `MtJPZoyjJ3IeqTFyo` |
| [API Deprecation and Breaking Change Monitor](https://apify.com/mambalabs/api-change-monitor?fpr=mamba) | `pHsbS3xXUK8Jqutz5` |
| [App Store and Google Play Review Monitor](https://apify.com/mambalabs/app-store-google-play-review-monitor?fpr=mamba) | `MaCMEhGrbchxQZ92G` |
| [B2B Reddit Conversation Monitor](https://apify.com/mambalabs/b2b-reddit-conversation-monitor?fpr=mamba) | `SoDryzzsjmY3SsiyG` |
| [Bluesky Brand Presence Mapper](https://apify.com/mambalabs/bluesky-brand-presence-mapper?fpr=mamba) | `eLpxzP4IuXznlFVND` |
| [Brand Sponsor Finder](https://apify.com/mambalabs/brand-sponsor-finder?fpr=mamba) | `PPgK6xrgOmvL7Nrys` |
| [Bulk WHOIS and RDAP Domain Age Lookup](https://apify.com/mambalabs/whois-domain-lookup?fpr=mamba) | `MTrkG5FLU6SjqLdJY` |
| [Career Change Signal Engine](https://apify.com/mambalabs/career-change-signal-engine?fpr=mamba) | `vX2Yga1a6wGaXaP14` |
| [Company Careers Page Jobs, 17 ATS Boards](https://apify.com/mambalabs/ats-jobs-feed?fpr=mamba) | `izP0rfIgf5YaRZfIh` |
| [Company Change Event Feed](https://apify.com/mambalabs/company-change-event-feed?fpr=mamba) | `oX44rS0fkEJ3rXLWe` |
| [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder?fpr=mamba) | `jch0HdaZnpbMqlcGS` |
| [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher?fpr=mamba) | `YlUtLWjfPpqykmB8g` |
| [Company Funding Record](https://apify.com/mambalabs/funding-investor-record?fpr=mamba) | `OFS4Mt1gyYNtGfUbE` |
| [Company Headcount Estimator](https://apify.com/mambalabs/company-headcount-estimator?fpr=mamba) | `aHC4GROnNt6kfZe5r` |
| [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver?fpr=mamba) | `lr8fTRAmZCBZmuwwh` |
| [Company Role Email, Phone and Address Finder](https://apify.com/mambalabs/company-contact-details-extractor?fpr=mamba) | `4mMncKaJykiq94grz` |
| [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper?fpr=mamba) | `4k6CCemkgBDz18m2h` |
| [Competitor Price, Stock, and Changelog Monitor](https://apify.com/mambalabs/competitor-price-stock-changelog-monitor?fpr=mamba) | `yxdgCbUQ4PYQWwRNU` |
| [Contact Classifier](https://apify.com/mambalabs/contact-classifier?fpr=mamba) | `0lGSeYJmniXhGANnO` |
| [Contractor License Search, CA, TX, WA, OR, LA](https://apify.com/mambalabs/contractor-license-lookup?fpr=mamba) | `WBYK3CPI2kdeq4bP1` |
| [CRM Contact Job Change Checker](https://apify.com/mambalabs/job-change-tracker?fpr=mamba) | `L8UbEmMJC1XYPSZOb` |
| [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker?fpr=mamba) | `0tVgxI7A6o9jMlxmc` |
| [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver?fpr=mamba) | `3HtnSaqPHOg1Qg5gx` |
| [Ecommerce Platform Profiler](https://apify.com/mambalabs/ecommerce-platform-profiler?fpr=mamba) | `5G2NeYjBbQTjaTn9L` |
| [Ecommerce Store Discovery](https://apify.com/mambalabs/ecommerce-store-discovery?fpr=mamba) | `PeHu4sLyFvQHXUUrX` |
| [Email List Verifier, Bring Your Own Key](https://apify.com/mambalabs/email-verifier?fpr=mamba) | `CzVJ4NlaCKk80xpgE` |
| [Event Presence Index](https://apify.com/mambalabs/event-presence-index?fpr=mamba) | `WLhMy8fMDgsxdYxv5` |
| [Expert Witness Finder, US and Australia](https://apify.com/mambalabs/expert-witness-directory?fpr=mamba) | `LIpwlgfE3LaQBaXd4` |
| [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner?fpr=mamba) | `FS13X6dhQVgX3XOM6` |
| [GDPR Cookie Banner and Consent Checker](https://apify.com/mambalabs/cookie-consent-audit?fpr=mamba) | `TrKyOS0KBoGC35nbr` |
| [GitHub Followers and Following Export](https://apify.com/mambalabs/github-followers-following-export?fpr=mamba) | `SGNxDmFb9v3tRDaFI` |
| [GitHub Organization Signal Scanner](https://apify.com/mambalabs/github-organization-signal-scanner?fpr=mamba) | `ahF8RRpv5mzPao5CN` |
| [Google Ads Transparency Center Scraper by Domain](https://apify.com/mambalabs/google-ads-transparency-monitor?fpr=mamba) | `1eOwxhBVxzvOXAm4s` |
| [Google Trends Scraper](https://apify.com/mambalabs/google-trends-scraper?fpr=mamba) | `OeDzaACKmBYJXzHZk` |
| [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper?fpr=mamba) | `D7O1SA2EqwHGsGr1P` |
| [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay?fpr=mamba) | `xKdRfnfFNkdMpFuNs` |
| [Healthcare Provider NPI Enricher](https://apify.com/mambalabs/healthcare-provider-npi-enricher?fpr=mamba) | `MrgbHzcpDq3mOv9Df` |
| [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay?fpr=mamba) | `W161DT8W4kW55dMFh` |
| [Influencer Change Monitor](https://apify.com/mambalabs/creator-change-monitor?fpr=mamba) | `d2VVgahNL6UmcLkhg` |
| [Influencer Lead List Builder](https://apify.com/mambalabs/creator-lead-list-all-in-one?fpr=mamba) | `KnmByszcv135yM30G` |
| [Influencer Profile Scraper](https://apify.com/mambalabs/creator-profile-reader?fpr=mamba) | `EqEnklDVMIcB1V499` |
| [Influencer Search Across TikTok, Instagram and YouTube](https://apify.com/mambalabs/creator-finder?fpr=mamba) | `tpkedmloIIWtXx6sg` |
| [Influencer Talent Agency Lookup](https://apify.com/mambalabs/talent-agency-lookup?fpr=mamba) | `zCuX4Mgyg6JvXgGzd` |
| [Instagram Facebook Brand Presence Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper?fpr=mamba) | `HXh65I0JBjPsunbY8` |
| [Integration and Marketplace Presence Mapper](https://apify.com/mambalabs/integration-marketplace-presence-mapper?fpr=mamba) | `V0guNuvM85Q61f2gj` |
| [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner?fpr=mamba) | `4DvqpvhMR74NLcDDY` |
| [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery?fpr=mamba) | `QCfICD9kOPiOdj5iI` |
| [Journalist and Media List Builder](https://apify.com/mambalabs/journalist-media-list-builder?fpr=mamba) | `mAfizsZC8qRoR0ecS` |
| [Launch Directory List Builder](https://apify.com/mambalabs/launch-directory-list-builder?fpr=mamba) | `cRq3bmvEZxZtioQ7U` |
| [Lead File Import Checker](https://apify.com/mambalabs/lead-file-import-checker?fpr=mamba) | `RwlGVXTf46LqZdUgt` |
| [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver?fpr=mamba) | `KHFyPCDIx7CyqULYm` |
| [Link in Bio Scraper and Newsletter Detector](https://apify.com/mambalabs/link-in-bio-newsletter-checker?fpr=mamba) | `OorucdheTIgu7RFzK` |
| [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper?fpr=mamba) | `zOPm6A9JEhUGcIdFW` |
| [LinkedIn Jobs Feed](https://apify.com/mambalabs/linkedin-jobs-feed?fpr=mamba) | `SH6N0d8cz46BhCC8B` |
| [LinkedIn Post Tracker](https://apify.com/mambalabs/linkedin-post-engager-capture?fpr=mamba) | `oiGLNPuaf5BRaz9K5` |
| [Local Business Lead Builder](https://apify.com/mambalabs/local-business-lead-builder?fpr=mamba) | `qMN97aoHhsAS5bznV` |
| [Local Rank and Map Pack Tracker](https://apify.com/mambalabs/local-rank-map-pack-tracker?fpr=mamba) | `gv0kyHGDIg8XscclB` |
| [Lookalike Companies from Seed Domains](https://apify.com/mambalabs/lookalike-company-finder?fpr=mamba) | `e2O426WBAbLLQL4Z2` |
| [Manufacturer and Supplier Finder](https://apify.com/mambalabs/manufacturer-supplier-finder?fpr=mamba) | `Qcsdmd0lUfPzVkonh` |
| [MCP Server Change and Health Monitor](https://apify.com/mambalabs/mcp-server-change-health-monitor?fpr=mamba) | `IeqjWF9U0BdDQFY08` |
| [Media URL Transcriber](https://apify.com/mambalabs/media-url-transcriber?fpr=mamba) | `Syfr7Ya3EsHgWfrB6` |
| [Meta Ad Library Ads by Company, Graph API](https://apify.com/mambalabs/meta-ad-library-monitor?fpr=mamba) | `J1GWlSXfSGU3u8Wng` |
| [Mobile Phone Waterfall](https://apify.com/mambalabs/mobile-phone-waterfall-orchestrator?fpr=mamba) | `6OOgPktf7RIa5XCOP` |
| [New Hire Finder](https://apify.com/mambalabs/new-hire-finder?fpr=mamba) | `cKuc38p4nYHNF3IW8` |
| [Newly Registered Companies, UK, Norway, Finland, France](https://apify.com/mambalabs/new-company-registrations-feed?fpr=mamba) | `g2WfZhWvCtc57g2Jo` |
| [News and Media Mention Monitor](https://apify.com/mambalabs/news-media-mention-monitor?fpr=mamba) | `gol1PPUKrsIk4QLBd` |
| [Newsletter Sponsor Tracker](https://apify.com/mambalabs/newsletter-sponsor-tracker?fpr=mamba) | `qSwpqxD1TiPZpLQHv` |
| [Open Tender and RFP Finder](https://apify.com/mambalabs/open-tender-rfp-finder?fpr=mamba) | `kPTGz6t6TFoUUyfaO` |
| [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint?fpr=mamba) | `v43UJC8r7qW7cBSTG` |
| [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor?fpr=mamba) | `TpurgcOZbVnknlaiC` |
| [Partner and Member Directory Extractor](https://apify.com/mambalabs/partner-member-directory-extractor?fpr=mamba) | `ZX0XJPPUvnFJxeC1a` |
| [People Finder & Email Verifier](https://apify.com/mambalabs/people-finder?fpr=mamba) | `LEgloG7tWgQl4o6TD` |
| [Person LinkedIn URL Resolver](https://apify.com/mambalabs/person-linkedin-url-resolver?fpr=mamba) | `ssuyPV8LnEsL8qbnb` |
| [Person Social Footprint Mapper](https://apify.com/mambalabs/person-social-footprint-mapper?fpr=mamba) | `jfQXa2zW9FHCJot9K` |
| [Personal Email to Company Resolver](https://apify.com/mambalabs/personal-email-to-company-resolver?fpr=mamba) | `AefT5Ye6YNPFQwJBf` |
| [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper?fpr=mamba) | `d1HvjZfKhgvWsoEwn` |
| [Podcast Guest and Host Finder](https://apify.com/mambalabs/podcast-guest-host-finder?fpr=mamba) | `o2MGSvgbSLeeXOsIo` |
| [Product Hunt Daily Launches with Maker Domains](https://apify.com/mambalabs/product-hunt-launches-feed?fpr=mamba) | `O4VX63drWK9Y9x641` |
| [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine?fpr=mamba) | `q9rT6v64nUJdPexOQ` |
| [Public Feature Board and Roadmap Monitor](https://apify.com/mambalabs/public-feature-board-roadmap-monitor?fpr=mamba) | `rcHF5gj5r2Vqnry35` |
| [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency?fpr=mamba) | `TbLwaUUATdYb6wp4N` |
| [Recent Funding Rounds Feed](https://apify.com/mambalabs/recent-funding-rounds-feed?fpr=mamba) | `KueVp9MOz7iOoAgDp` |
| [Reddit Brand Presence Mapper](https://apify.com/mambalabs/reddit-brand-presence-mapper?fpr=mamba) | `pKQZmDaT70SEb54bZ` |
| [Reddit Search and Thread Scraper](https://apify.com/mambalabs/reddit-search-thread-scraper?fpr=mamba) | `4Gsth5cP2Xt9V2xDN` |
| [Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder?fpr=mamba) | `uINxR7a1IW8qUTRUX` |
| [Research Topic Institutions and Authors](https://apify.com/mambalabs/research-topic-institutions-authors?fpr=mamba) | `OH8ANqt7bCKbo72Gk` |
| [Sequencer Event Poller](https://apify.com/mambalabs/sequencer-event-poller?fpr=mamba) | `S6s8Rjd61tGdrMRk4` |
| [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push?fpr=mamba) | `0Jv27VeWM5tSZQs9x` |
| [Shopify App Store and Chrome Web Store Listings](https://apify.com/mambalabs/shopify-app-store-chrome-web-store-listings?fpr=mamba) | `gaY0BzkLyN77mD3wI` |
| [Site Crawler for Links and Tables](https://apify.com/mambalabs/site-crawler-links-tables?fpr=mamba) | `lLLJ6JxZ4XqN8ULz0` |
| [Substack Newsletter and Posts Scraper](https://apify.com/mambalabs/substack-scraper?fpr=mamba) | `UEFsdwiPLmPNVy9xd` |
| [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor?fpr=mamba) | `j8a9zX0k4mNbvDbWK` |
| [Tech Stack Signal Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper?fpr=mamba) | `qyd7nNyqFPelQViBx` |
| [Threads Posts by Keyword, Exact Match](https://apify.com/mambalabs/threads-keyword-search?fpr=mamba) | `2OT8K8RiEEWtaj2MW` |
| [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper?fpr=mamba) | `fco8FvoJcSafbeyd1` |
| [Trustpilot Reputation Enricher](https://apify.com/mambalabs/review-platform-reputation-enricher?fpr=mamba) | `3lIqfCt61j4hqE1xz` |
| [US and UK Contract Award Winners by Company](https://apify.com/mambalabs/public-award-monitor?fpr=mamba) | `zhEtllASykOcx9hJ8` |
| [US Import Records Buyer Finder](https://apify.com/mambalabs/us-import-records-buyer-finder?fpr=mamba) | `VIMafpKF5ggOw0COU` |
| [VC and Accelerator Portfolio List Builder](https://apify.com/mambalabs/vc-accelerator-portfolio-list-builder?fpr=mamba) | `chH8hrfuoqqolW06m` |
| [Website Accessibility Checker, WCAG 2.2 AA](https://apify.com/mambalabs/wcag-accessibility-audit?fpr=mamba) | `P3jBj3FRghKEhX52z` |
| [Website Phrase and Business Model Classifier](https://apify.com/mambalabs/website-phrase-business-model-classifier?fpr=mamba) | `CBuZ9k7sRwBeiKiCS` |
| [Website Traffic Rank Estimator](https://apify.com/mambalabs/website-traffic-rank-estimator?fpr=mamba) | `GnOFUzlNVIoXgeJjH` |
| [Work Email Waterfall](https://apify.com/mambalabs/email-waterfall-orchestrator?fpr=mamba) | `OT6xqTFThC0Rjf7Zj` |
| [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector?fpr=mamba) | `Li6pPDhqbdzFz3h7G` |
| [X Brand Presence Mapper](https://apify.com/mambalabs/x-brand-presence-mapper?fpr=mamba) | `oLOgadhHUkNAyDA3w` |
| [YouTube Channel from Company Domain](https://apify.com/mambalabs/youtube-channel-transcript-extractor?fpr=mamba) | `6hSpD3kd2s2IQ4VSs` |
| [Zillow Listing Details](https://apify.com/mambalabs/zillow-listing-details?fpr=mamba) | `yG4zM0Enfsw2NefJ1` |

Built by [Mamba Labs](https://apify.com/mambalabs).

# Actor input Schema

## `location` (type: `string`):

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.

## `radiusKm` (type: `string`):

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.

## `sources` (type: `array`):

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

## `propertyTypes` (type: `array`):

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

## `maxResults` (type: `string`):

Listings to return as charged rows. Default 50.

## `maxRent` (type: `string`):

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

## `minSize` (type: `string`):

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

## `minRooms` (type: `string`):

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

## `furnished` (type: `array`):

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

## `registrationOnly` (type: `string`):

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.

## `availableBy` (type: `string`):

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

## `hasInternet` (type: `string`):

Kamernet's own filter, sent with the search.

## `privateBathroom` (type: `string`):

Kamernet's own filter.

## `privateKitchen` (type: `string`):

Kamernet's own filter.

## `privateToilet` (type: `string`):

Kamernet's own filter.

## `petsAllowed` (type: `string`):

Kamernet's own filter.

## `smokingAllowed` (type: `string`):

Kamernet's own filter.

## `numberOfPeople` (type: `string`):

Kamernet's own filter: 1 to 5 tenants.

## `tenantGender` (type: `string`):

Kamernet's own filter: male or female.

## `tenantAge` (type: `string`):

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

## `roommatesMax` (type: `string`):

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

## `roommateGenders` (type: `array`):

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

## `landlordTypes` (type: `array`):

Kamernet's own filter: private, agent.

## `includeDetails` (type: `string`):

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.

## `includeLandlordName` (type: `string`):

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

## `blockedLandlordIds` (type: `array`):

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

## `excludeGenderOnly` (type: `string`):

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.

## `excludeLanguageOnly` (type: `string`):

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

## `excludeStudentOnly` (type: `string`):

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

## `excludeShortStay` (type: `string`):

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

## `trackChanges` (type: `string`):

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.

## `draftMessages` (type: `string`):

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.

## `llmProvider` (type: `string`):

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

## `llmApiKey` (type: `string`):

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.

## `llmModel` (type: `string`):

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.

## `applicantProfile` (type: `string`):

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.

## `maxDrafts` (type: `string`):

Most messages to draft in one run. Default 20.

## `max_charge_usd` (type: `string`):

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

## `source_tag` (type: `string`):

Internal attribution tag. Leave empty.

## Actor input object example

```json
{
  "location": "Utrecht",
  "radiusKm": "10",
  "sources": [
    "kamernet",
    "housinganywhere"
  ],
  "maxResults": "20",
  "registrationOnly": "false",
  "hasInternet": "false",
  "privateBathroom": "false",
  "privateKitchen": "false",
  "privateToilet": "false",
  "petsAllowed": "false",
  "smokingAllowed": "false",
  "includeDetails": "false",
  "includeLandlordName": "false",
  "excludeGenderOnly": "false",
  "excludeLanguageOnly": "false",
  "excludeStudentOnly": "false",
  "excludeShortStay": "false",
  "trackChanges": "true",
  "draftMessages": "false",
  "llmProvider": "openai",
  "maxDrafts": "20"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `run_summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Utrecht",
    "sources": [
        "kamernet",
        "housinganywhere"
    ],
    "maxResults": "20"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/dutch-rental-listings").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": "Utrecht",
    "sources": [
        "kamernet",
        "housinganywhere",
    ],
    "maxResults": "20",
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/dutch-rental-listings").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Utrecht",
  "sources": [
    "kamernet",
    "housinganywhere"
  ],
  "maxResults": "20"
}' |
apify call mambalabs/dutch-rental-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mambalabs/dutch-rental-listings"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sGKGsbwoX18lFb6dR/builds/bKoHXKV23Nb3pl69C/openapi.json
