# Kamernet Scraper - Dutch Rooms, Studios and Rentals (`sian.agency/kamernet-property-scraper`) Actor

Scrape Kamernet.nl rental listings by Dutch city: rooms in shared homes, studios, apartments and student housing. Get rent, utilities, deposit, size, furnishing, availability, advertiser type, amenities, tenant preferences and photos.

- **URL**: https://apify.com/sian.agency/kamernet-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 listing searches

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

## Kamernet Scraper: Dutch Rooms, Studios & Student Housing 🛏️

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Pararius Scraper](https://img.shields.io/badge/Store-Pararius%20Scraper-1AE392)](https://apify.com/sian.agency/pararius-property-scraper?fpr=sian) [![Funda Scraper](https://img.shields.io/badge/Store-Funda%20Scraper-FF6200)](https://apify.com/sian.agency/funda-property-scraper?fpr=sian) [![Flatmates.com.au Scraper](https://img.shields.io/badge/Store-Flatmates.com.au%20Scraper-1AE392)](https://apify.com/sian.agency/flatmates-au-property-scraper?fpr=sian)

#### 🎉 Kamernet's rooms, studios and student housing in one dataset, with rent per m² and private landlords flagged

##### For rent analysts, universities, relocation teams, letting agents and proptech builders who follow the Dutch room market

***

### 🔎 What is the Kamernet Scraper - Dutch Rooms, Studios & Student Housing — and when should you use it?

The **Kamernet Scraper - Dutch Rooms, Studios & Student Housing** turns public Kamernet.nl rental listings from anywhere in the Netherlands into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Dutch rooms in shared homes, studios, apartments and student housing to rent, as rows. Each row has the monthly rent and whether utilities are included, the size and rent per square metre, furnishing, street and city, the available-from and until dates, a lead photo and the listing link. Switch on full details and each row also names the advertiser type: private landlord, housemate, letting agent, other or student house. It adds the title and description in Dutch and English, deposit and extra costs, and whether the kitchen, bathroom, toilet and living room are shared or private. The energy label, the preferred tenant and every photo come with it. These rooms rarely appear on the big Dutch portals.

**Use something else when:** the person wants whole homes from letting agents, homes for sale, or a country other than the Netherlands. Use [Pararius Scraper](https://apify.com/sian.agency/pararius-property-scraper?fpr=sian) for whole Dutch homes to rent and for sale from letting agents. Use [Funda Scraper](https://apify.com/sian.agency/funda-property-scraper?fpr=sian) for Dutch homes for sale and to rent, with sold prices and estate agents. Use [Flatmates.com.au Scraper](https://apify.com/sian.agency/flatmates-au-property-scraper?fpr=sian) for the same room-share data for Australia. This actor reads what kamernet.nl shows a visitor who is not logged in: rental listings and their own pages. Contact details and messages sit behind a paid Kamernet account and are not part of any row, and the advertiser's name, house number, postcode and map position are not collected. Rooms-wanted profiles are not covered.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/kamernet-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want rooms, studios and student housing to rent from Kamernet.nl using the Apify Actor `sian.agency/kamernet-property-scraper`.

Use it when I need: Dutch rooms in shared homes, studios, apartments and student housing to rent, as rows. Each row has the monthly rent and whether utilities are included, the size and rent per square metre, furnishing, street and city, the available-from and until dates, a lead photo and the listing link. Switch on full details and each row also names the advertiser type: private landlord, housemate, letting agent, other or student house. It adds the title and description in Dutch and English, deposit and extra costs, and whether the kitchen, bathroom, toilet and living room are shared or private. The energy label, the preferred tenant and every photo come with it. These rooms rarely appear on the big Dutch portals.

Don't use it when: the person wants whole homes from letting agents, homes for sale, or a country other than the Netherlands — use pararius-property-scraper or funda-property-scraper or flatmates-au-property-scraper instead.

How to call it: give `locations` a list of Dutch cities (`amsterdam`, `utrecht`, `den haag`, or `nederland` for the whole country) and set `category` to `room`, `studio`, `apartment`, `studentHousing`, `antiSquat` or `any`. Narrow with `minRent`, `maxRent` (euros per month), `minSize` (m²), `furnishing`, `advertiser` (`private`, `housemate`, `agent`, `other`) and `radiusKm` (`1`, `2` or `5`); anything a filter excludes is never saved and never billed. `includeDetails` opens each listing for its description, deposit, advertiser type, amenities and all photos, for an extra charge per listing. To expand listings you already have, set `operation` to `detail` and pass their kamernet.nl addresses in `listingUrls`; to reuse a search you already made on the site, paste its address into `searchUrls`.

Start with this input:
{
  "operation": "search",
  "locations": [
    "utrecht"
  ],
  "category": "room",
  "maxRent": 900,
  "includeDetails": true,
  "maxResults": 100
}

Ask me which Dutch cities to cover, which type of place (rooms, studios, apartments or student housing), any rent ceiling, and whether the description, deposit, advertiser type and full photo set are worth the extra per-listing charge, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *List every room in Utrecht under €800 a month with utilities included, and give me the median rent per square metre.*
- *Find furnished studios in Rotterdam from private landlords that are available before December.*
- *Collect today's new rooms in Amsterdam, Leiden and Delft for a student housing newsletter.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/kamernet-property-scraper.md](https://apify.com/sian.agency/kamernet-property-scraper.md).

### 📋 Overview

**Want Kamernet data without copying ads by hand?** This Kamernet scraper reads the rental ads on kamernet.nl city by city and returns one row per listing.

**What you get:**

- 🏘️ **Listings the big portals don't carry**: we matched photos across Amsterdam, Utrecht and Rotterdam, and 0 of 280 Kamernet rooms and studios showed up on Pararius or Funda. Pararius listed 5 rooms in Amsterdam against Kamernet's 179.
- 👤 **Private rooms flagged**: full records say who placed the ad, and the Advertiser filter keeps private landlords and housemates. They placed 69% of the listings we sampled.
- 💶 **Rent you can compare**: monthly rent, a utilities-included flag and rent per m² on every row that has a size, plus deposit and extra costs with full details.
- 🎯 **Pay only for matches**: rent, size, furnishing and advertiser filters are applied before a listing is saved. Listings that fail them cost nothing.
- 💰 **$1.50 per 1,000 listings**: full details are $1.50 per 1,000 on top, and every free run includes 25 listings.
- ✨ **NEW**: tick Add full details to get the description, deposit, amenities, energy label, tenant preferences and every photo in the same run.

***

### ✨ Features

- 🔍 **Listing Search**: name a Dutch city (amsterdam, utrecht, Den Haag) or nederland for the whole country, and get every listing there.
- 📄 **Listing Details**: paste Kamernet listing addresses and get the full record for each one.
- 🏠 **Type of place**: rooms in a shared home, studios, apartments, student housing, anti-squat (anti-kraak) or any type.
- 💶 **Rent and size filters**: minimum and maximum rent in euros per month, and a minimum size in m².
- 🛋️ **Furnishing filter**: unfurnished (kaal), upholstered (gestoffeerd) or furnished (gemeubileerd).
- 👤 **Advertiser filter**: private landlords, housemates, letting agents or other providers.
- 📏 **Search radius**: 1, 2 or 5 km around the city. At 5 km an Amsterdam search also covers Diemen, Amstelveen and Zaandam.
- 🔗 **Paste search pages**: use a Kamernet search address such as https://kamernet.nl/huren/kamer-utrecht instead of typing a city.
- 🔁 **No duplicates**: a listing found under two cities is saved and billed once.
- 📦 **Clean exports**: JSON, CSV or Excel from the Apify dataset, plus a run report with the numbers and what they cost.

***

### 🎬 Quick Start

Type the Dutch cities you want and pick the type of place. Add filters if you need them and set how many listings to collect. Press Start, and the listings land in a dataset you can export or read through the API.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~kamernet-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "search", "locations": ["amsterdam"], "category": "room", "maxResults": 100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your cities

Type one Dutch city or town per line: amsterdam, utrecht, Den Haag, Rotterdam. Use nederland for the whole country.

#### Step 2: Set your filters

Pick the type of place and Max listings, then add any rent, size, furnishing or advertiser filters. Tick Add full details if you want the deposit, amenities and photos.

#### Step 3: Run and export

Press Start, then download the listings as JSON, CSV or Excel, or pull them into your own tools through the API.

**That's it! In a minute or two, you'll have:**

- A table of Kamernet listings with monthly rent, utilities, size, rent per m² and furnishing
- Availability dates, so you can see what is free when
- A file you can open in Excel or Google Sheets, or feed to a dashboard

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` (Listing Search, default) or `detail` (Listing Details for listings you already have). |
| `locations` | array | No | Dutch cities or towns, e.g. amsterdam, utrecht, Den Haag, or nederland for the whole country. Default: amsterdam. |
| `category` | string | No | `room` (default), `studio`, `apartment`, `studentHousing`, `antiSquat` or `any`. |
| `maxResults` | integer | No | Stop after this many listings across all cities (1 to 5,000, default 100). Listing Details ignores it. |
| `includeDetails` | boolean | No | Open each listing's own page for description, deposit, advertiser type, amenities, preferences and photos. Billed per listing. |
| `radiusKm` | string | No | `1`, `2` or `5` km around the city (default `5`). |
| `minRent` | integer | No | Lowest rent in € per month. |
| `maxRent` | integer | No | Highest rent in € per month. |
| `minSize` | integer | No | Smallest surface area in m² (up to 500). |
| `furnishing` | string | No | `any`, `unfurnished`, `upholstered` or `furnished`. |
| `advertiser` | string | No | `any`, `private`, `housemate`, `agent` or `other`. Student-house ads have no advertiser type and are left out when you pick one. |
| `searchUrls` | array | No | Kamernet search pages instead of city names, e.g. https://kamernet.nl/huren/kamer-utrecht. |
| `listingUrls` | array | For Listing Details | Full Kamernet listing addresses, e.g. https://kamernet.nl/huren/kamer-amsterdam/teldershof/kamer-2409833. |

**Example: rooms in Utrecht under €800 a month from private landlords**

```json
{
  "operation": "search",
  "locations": ["utrecht"],
  "category": "room",
  "advertiser": "private",
  "maxRent": 800,
  "maxResults": 200
}
```

**Example: full details for listings you already have**

```json
{
  "operation": "detail",
  "listingUrls": [
    { "url": "https://kamernet.nl/huren/kamer-amsterdam/teldershof/kamer-2409833" },
    { "url": "https://kamernet.nl/en/for-rent/room-soesterberg/postdwarsweg/room-2409832" }
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **35 fields**. A search row carries:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | integer | Kamernet listing number |
| `listingUrl` | string | Link to the listing on kamernet.nl |
| `thumbnail` | string | Lead photo |
| `propertyType` | string | Room, Studio, Apartment or Anti-squat |
| `rentPerMonth` | number | Monthly rent in euros |
| `utilitiesIncluded` | boolean | Whether the rent includes utilities |
| `surfaceAreaM2` | number | Size in m², as the advertiser entered it |
| `rentPerM2` | number | Monthly rent divided by size |
| `furnishing` | string | Unfurnished, Upholstered or Furnished |
| `street` / `city` | string | Street name and city (no house number) |
| `availableFrom` / `availableUntil` | string | Move-in date and end date, if there is one |
| `isIndefinite` | boolean | True when the listing has no end date |
| `isNew` / `isPromoted` | boolean | Kamernet's new-ad and promoted-ad flags |
| `isStudentHouse` | boolean | Ad placed by a student house |
| `searchLocation` | string | The city you searched that returned this listing |

**Add full details adds:**

| Field | Type | Description |
|-------|------|-------------|
| `propertyTitle` / `titleEnglish` | string | The listing title, and its English version when there is one |
| `fullDescription` / `descriptionEnglish` | string | The complete ad text, and its English version |
| `advertiserType` | string | Private landlord, Housemate, Letting agent, Other or Student house |
| `deposit` / `extraCosts` | number | Deposit and extra costs in euros |
| `amenities` | object | Living room, kitchen, bathroom and toilet (shared or private), internet |
| `energyLabel` | string | Energy label, A to E |
| `petsAllowed` | boolean | Whether pets are allowed |
| `tenantPreferences` | object | Preferred gender, age range, occupation and languages |
| `preferredStay` | string | How long the advertiser would like you to stay |
| `photos` / `photoCount` | array / integer | Every photo, and how many there are |
| `hasVideo` | boolean | Whether the listing has a video |
| `publishedAt` | string | When the ad was published |

Rows that could not be read say what to change, and they are never charged.

**Example (search row with Add full details, Utrecht):**

```json
{
  "thumbnail": "https://resources.kamernet.nl/image/32492b31-a6a1-41a8-93d9-22917d8c444b",
  "listingId": 2409832,
  "listingUrl": "https://kamernet.nl/huren/kamer-soesterberg/postdwarsweg/kamer-2409832",
  "propertyType": "Room",
  "rentPerMonth": 900,
  "utilitiesIncluded": true,
  "currency": "EUR",
  "surfaceAreaM2": 13,
  "rentPerM2": 69.23,
  "furnishing": "Furnished",
  "street": "Postdwarsweg",
  "city": "Soesterberg",
  "availableFrom": "2026-12-08",
  "availableUntil": "2027-03-08",
  "isIndefinite": false,
  "isNew": true,
  "isPromoted": false,
  "isStudentHouse": false,
  "searchLocation": "utrecht",
  "propertyTitle": "Room for Rent in Soesterberg, Utrecht",
  "titleEnglish": "Room for Rent in Soesterberg, Utrecht",
  "fullDescription": "Available from 8th December 2026\n\nThe Room\n\nA bright and spacious 13 m² room located on the first floor of a modern home...",
  "descriptionEnglish": "Available from 8th December 2026\n\nThe Room\n\nA bright and spacious 13 m² room located on the first floor of a modern home...",
  "advertiserType": "Private landlord",
  "deposit": 1800,
  "amenities": {
    "livingRoom": "shared",
    "kitchen": "shared",
    "bathroom": "shared",
    "toilet": "shared",
    "internet": "available"
  },
  "energyLabel": "A",
  "petsAllowed": false,
  "tenantPreferences": {
    "gender": "No preference",
    "minAge": 20,
    "maxAge": 32,
    "occupation": ["Student", "Working student", "Working"],
    "languages": ["English"]
  },
  "preferredStay": "3 months",
  "photos": [
    "https://resources.kamernet.nl/image/32492b31-a6a1-41a8-93d9-22917d8c444b",
    "https://resources.kamernet.nl/image/e1a0496f-7502-4e18-88cc-6d98dbf1c45d",
    "https://resources.kamernet.nl/image/c0fc8154-8bad-4000-b0c5-a798252ccfa4"
  ],
  "photoCount": 10,
  "hasVideo": false,
  "publishedAt": "2026-10-03T09:26:57.303"
}
```

The Utrecht search found this room in Soesterberg because the default 5 km radius takes in nearby towns. Set `radiusKm` to `1` to keep to the city itself.

***

### 💼 Use Cases & Examples

#### 1. Room rent benchmarking

**Rent analysts, journalists and housing researchers measuring what a room costs in each Dutch city.**

**Input:** a city such as amsterdam or utrecht, `category: "room"`, `maxResults` set high enough to cover the city
**Output:** monthly rent, utilities included, size and rent per m² for every room ad
**Use:** track the median room rent and rent per m² week by week. Rooms barely appear on the whole-home portals, so this is the room market's own price signal.

#### 2. Student housing research

**Universities, student unions and international offices helping new students find a place.**

**Input:** the cities around a campus, `category: "studentHousing"` or `"room"`, `maxRent`
**Output:** rooms and student housing that fit the budget, with move-in dates and tenant preferences
**Use:** hand new students a ready list of real rooms instead of a link to a search page.

#### 3. Private landlord market watch

**Letting agents and property managers studying the rooms let without an agent.**

**Input:** your cities, `advertiser: "private"` or `"housemate"`, `includeDetails: true`
**Output:** what private landlords and housemates ask, where, and how quickly new ads appear
**Use:** size the private room market city by city and see where agents are missing.

#### 4. Short-stay and expat supply

**Relocation firms and employers housing interns, expats and project staff.**

**Input:** the city near the office, `furnishing: "furnished"`, `category: "room"` or `"studio"`
**Output:** furnished places with an end date, rent, deposit and preferred length of stay
**Use:** build a shortlist of furnished rooms and studios that match the length of each assignment.

#### 5. New-listing monitoring

**Proptech teams and room-finding apps that need fresh Kamernet listings every day.**

**Input:** your cities on a daily schedule
**Output:** each day's rooms and studios with Kamernet's new-ad flag, plus the publish date when full details are on
**Use:** compare `listingId` against yesterday's run and alert users before the rooms are taken. Kamernet adds about 200 ads a day across the country.

#### 6. Housing policy and affordability studies

**Councils, think tanks and academics studying rents for students and young workers.**

**Input:** `locations: ["nederland"]`, `category: "any"`
**Output:** the whole country's roughly 1,200 live listings with rent, size, type and city
**Use:** compare rent per m² for rooms, studios and apartments across Dutch cities from one dataset.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/kamernet-property-scraper').call({
  operation: 'search',
  locations: ['amsterdam', 'utrecht'],
  category: 'room',
  maxRent: 900,
  maxResults: 200
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/kamernet-property-scraper').call(
    run_input={
        'operation': 'search',
        'locations': ['rotterdam'],
        'category': 'studio',
        'includeDetails': True,
        'maxResults': 100,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['rentPerMonth'], item['city'], item['listingUrl'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~kamernet-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "search", "locations": ["den haag"], "category": "room", "furnishing": "furnished", "maxResults": 100}'
```

#### Automation Workflows (n8n / Zapier / Make)

1. **Trigger**: a daily schedule, one run per city
2. **HTTP Request**: call the actor's API with your cities and filters
3. **Process**: keep the listings whose `listingId` you have not seen before
4. **Action**: save them to Google Sheets or Airtable, or post them to Slack or email

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run, with every filter and Add full details
- No credit card required
- Enough to check the data for your city before you scale up

#### PAID Tier (Production Ready)

- **Up to 5,000 listings** per run, or the whole of the Netherlands in one search
- **Listing Search**: $1.50 per 1,000 listings, down to $1.17 on higher Apify plans
- **Listing Details**: $1.50 per 1,000 listings, billed only when the full record is added
- A $0.005 start fee per run
- Only listings that are returned are charged. Error rows and filtered-out listings cost nothing.

A search page of 17 listings takes about a second, so a city of a few hundred rooms finishes in about a minute. Add full details opens each listing's own page and takes longer.

💰 **A complete record for $3.00 per 1,000**: a search row plus its full details. If you only need rent, size and availability, a search-only run costs half that.

🔗 [View current pricing](https://apify.com/sian.agency/kamernet-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need a Kamernet account?**
A: No. Name a city and press Start. The actor collects only what Kamernet shows a visitor who is not logged in.

**Q: Is this the same data as Pararius or Funda?**
A: Almost none of it. We compared Kamernet with Pararius and Funda in Amsterdam, Utrecht and Rotterdam by matching listing photos. Pararius listed 5 rooms in Amsterdam against Kamernet's 179, and 3 in Utrecht against 57. Not one of 280 Kamernet rooms and studios matched a photo on either site, and 1 of 98 Amsterdam apartments matched Funda.

**Q: Does it return the landlord's phone number or email?**
A: No. Kamernet keeps contact details behind a paid account, and they are not part of any row. Advertiser names are not collected either. With Add full details, each row says what kind of advertiser placed the ad: private landlord, housemate, letting agent, other or student house.

**Q: Why is there no house number or postcode?**
A: Kamernet shows the street and city to visitors, not the house number, postcode or map position. The actor returns what a visitor sees.

**Q: What does Add full details cost?**
A: One Listing Details event per listing, on top of the search row. It opens each listing's own page and adds the title, full description, deposit and extra costs, advertiser type, amenities, energy label, tenant preferences and every photo.

**Q: How do I search the whole country?**
A: Use nederland as the city. Kamernet then lists every live ad in the Netherlands, about 1,200 at a time, around 800 of them rooms.

**Q: Why is the room size sometimes large?**
A: Kamernet shows the size the advertiser entered, and for a room in a shared home some advertisers enter the size of the whole home. The actor returns the figure as Kamernet shows it.

**Q: Am I charged for listings my filters reject?**
A: No. Each listing is checked against your filters before it is saved, and only saved listings are billed.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported straight from the Apify dataset, or through the API.

**Q: Is this legal?**
A: The actor reads publicly visible ads only. See the legal section below.

***

### 🐛 Troubleshooting

**A row says the city is not one Kamernet knows**

- Check the spelling, or use the city's name as kamernet.nl writes it (amsterdam, den-haag).
- Use nederland to search the whole country.
- These rows are not charged.

**A Listing Details row says Not found**

- The ad has ended or been taken down. Rooms often go within days, so run a new search for live ads.
- Not-found rows are not charged.

**A listing address was refused**

- Listing URLs needs the full address from your browser, such as https://kamernet.nl/huren/kamer-amsterdam/teldershof/kamer-2409833. A listing number on its own is not accepted.

**Fewer listings than Max listings**

- The city may have fewer ads than you asked for, or your filters may be strict. Loosen the filter, widen the radius or add nearby cities.
- Student-house ads are left out when you pick an advertiser type, because they have none.
- Free plan runs stop at 25 listings.

**Kamernet asks you to retry**

- Kamernet sometimes limits requests for a few minutes. The actor retries on its own; if a row still says to retry, run it again a little later.

***

### ⚠️ Trademark Disclaimer

Kamernet is a trademark of Kamernet B.V. This actor is not affiliated with, endorsed by, or sponsored by Kamernet.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue on the [actor's Issues tab](https://apify.com/sian.agency/kamernet-property-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/kamernet-property-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Search returns Kamernet listings for the Dutch cities you name. Listing Details opens Kamernet listing addresses you already have and returns the full record. Tick Add full details on a search to get both in one run.

## `locations` (type: `array`):

Dutch cities or towns, one per line: amsterdam, utrecht, Den Haag, Rotterdam. Use nederland for the whole country. Each one runs its own search. A name Kamernet doesn't know gets an error row and isn't charged.

## `category` (type: `string`):

Which kind of place to search. Rooms are most of Kamernet. Student housing covers rooms and apartments offered to students.

## `maxResults` (type: `integer`):

Stop after this many listings across all cities. The run stops exactly at this number. Free accounts stop at 25. Listing Details ignores it and returns every listing you pasted.

## `includeDetails` (type: `boolean`):

Opens each listing's own page and adds the title, full description, deposit and extra costs, advertiser type, shared or private kitchen, bathroom and toilet, energy label, tenant preferences and every photo. Each listing also bills one Listing Details event.

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

How far around the city Kamernet searches. 5 km includes nearby towns (for Amsterdam: Diemen, Amstelveen, Zaandam); 1 km keeps to the city itself.

## `minRent` (type: `integer`):

Lowest monthly rent to include. Leave it empty for no floor.

## `maxRent` (type: `integer`):

Highest monthly rent to include. Leave it empty for no ceiling.

## `minSize` (type: `integer`):

Smallest surface area to include. For a room Kamernet lists the size the advertiser entered, which is sometimes the whole home.

## `furnishing` (type: `string`):

How the place is delivered. Upholstered (gestoffeerd) means floors and curtains but no furniture.

## `advertiser` (type: `string`):

Who placed the ad. Private landlords and housemates are the ads that rarely appear on the big Dutch portals. Student-house ads have no advertiser type and are left out when you pick one.

## `searchUrls` (type: `array`):

Kamernet search pages instead of city names, e.g. https://kamernet.nl/huren/kamer-utrecht or https://kamernet.nl/en/for-rent/room-rotterdam. The type of place in the address is used; the rent, advertiser and furnishing fields above still apply.

## `listingUrls` (type: `array`):

Used by Listing Details: Kamernet listing addresses, one per line, such as https://kamernet.nl/huren/kamer-amsterdam/teldershof/kamer-2409833 or the English https://kamernet.nl/en/for-rent/room-amsterdam/teldershof/room-2409833.

## Actor input object example

```json
{
  "operation": "search",
  "locations": [
    "amsterdam"
  ],
  "category": "room",
  "maxResults": 100,
  "includeDetails": false,
  "radiusKm": "5",
  "furnishing": "any",
  "advertiser": "any"
}
```

# Actor output Schema

## `kamernetListings` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "locations": [
        "amsterdam"
    ],
    "category": "room",
    "maxResults": 100,
    "includeDetails": false,
    "radiusKm": "5",
    "furnishing": "any",
    "advertiser": "any"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/kamernet-property-scraper").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 = {
    "operation": "search",
    "locations": ["amsterdam"],
    "category": "room",
    "maxResults": 100,
    "includeDetails": False,
    "radiusKm": "5",
    "furnishing": "any",
    "advertiser": "any",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/kamernet-property-scraper").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 '{
  "operation": "search",
  "locations": [
    "amsterdam"
  ],
  "category": "room",
  "maxResults": 100,
  "includeDetails": false,
  "radiusKm": "5",
  "furnishing": "any",
  "advertiser": "any"
}' |
apify call sian.agency/kamernet-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/kamernet-property-scraper"
        }
    }
}
```

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/u8WsBkGa5kJZv9Msj/builds/vpAwgXCib2CloBRvz/openapi.json
