# Huislijn Listings Scraper ($0.50/1K) (`carabain-digital/huislijn-listings`) Actor

Scrape property listings from Huislijn.nl, the Dutch property portal fed by about 2,500 estate agents: price, address, coordinates, living and plot area, rooms, year built, status for sale and rent, newest first. Optional full details (description, agent) and price history.

- **URL**: https://apify.com/carabain-digital/huislijn-listings.md
- **Developed by:** [Carabain Digital](https://apify.com/carabain-digital) (community)
- **Categories:** Real estate, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 listings

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

#### What is Huislijn Listings Scraper?

**Huislijn Listings Scraper** scrapes **property listings from Huislijn ([huislijn.nl](https://www.huislijn.nl))**, the Dutch property portal that aggregates the listings of about 2,500 estate agents, with around 19,000 homes for sale and thousands for rent. Search for sale or rent by **location, price, property type, rooms and living area**, or paste a search URL from the site, and get clean, flat listing data as JSON, CSV, Excel, XML or HTML. Prefilled example: 20 listings, ready in a few seconds. Costs **$0.50 per 1,000 listings**. Add-ons: full details for $1.00 per 1,000 and price history for $1.00 per 1,000.

- 🔎 **Search like on the site**: city or province, buy or rent, price, property type, rooms, living area
- 🆕 **Newest first**: results are sorted by the site's own newest-first order
- ⚡ **Fast and cheap**: no browser, no proxy needed
- 🧭 **Rich search data**: address, coordinates, living and plot area, rooms, bedrooms, year built and status come with every listing, without extra requests
- 📚 **Full details on demand**: description, estate agent with phone number and energy label
- 📈 **Price history on demand**: switch on **Price history** and schedule the Actor to see price cuts and status changes between runs
- 🧩 **One real-estate schema for several sites**: same field names as our other Belgian and Dutch property scrapers
- 🔌 **Connect anywhere**: API, schedules, webhooks, Google Sheets, Make, Zapier, MCP / AI agents

#### What data can I extract from Huislijn?

<table>
<tr><td>🆔 Stable listing ID and URL</td><td>💶 Price (or monthly rent), price type</td></tr>
<tr><td>🏠 Property type and listing type</td><td>🔖 Status: available, under offer, sold, rented</td></tr>
<tr><td>📍 Address, postcode, city, region</td><td>🧭 Latitude and longitude</td></tr>
<tr><td>📐 Living and plot area</td><td>🛏️ Rooms, bedrooms, bathrooms</td></tr>
<tr><td>⚡ Energy label</td><td>🏗️ Year built</td></tr>
<tr><td>🖼️ Photos</td><td>🧑‍💼 Agent name, phone and page</td></tr>
<tr><td>📅 Listing date</td><td>📝 Description</td></tr>
</table>

Search results already carry price, address, coordinates, living and plot area, rooms, bedrooms, year built, status and a photo. The description, the estate agent (name, phone, page) and, where the search result lacks it, the energy label come from the detail page and are only filled with the **Full details** add-on. Huislijn does not show a listing date, so `listed_at` is always null. Fields the site does not have stay `null`; every item has the same keys.

#### How do I scrape Huislijn listings?

1. [Create a free Apify account](https://console.apify.com/sign-up) and open this Actor.
2. Enter a **Location** (for example `Utrecht`), choose **Buy or rent**, and optionally a price range, property type and minimum rooms or living area. Or paste one or more **Search URLs** copied from huislijn.nl.
3. Set **Max listings**.
4. Optionally switch on **Full details** (description, agent and more) or **Price history**.
5. Click **Start**, then download the listings from the **Output** tab as JSON, CSV, Excel, XML or HTML.

#### How much does it cost to scrape Huislijn?

You pay per listing that ends up in your dataset: **$0.50 per 1,000 listings**, no subscription. The monthly credit of Apify's Free plan ($5) covers around 10,000 listings without add-ons. Paid plans get volume discounts.

- **Add-on: Full details, $1.00 per 1,000 listings** (off by default). Adds the full description, the estate agent with phone number and agent page, and the energy label when the search result has none. Rentals fed by other portals have a shortened description and no agent. Charged only for listings that were actually enriched.
- **Add-on: Price history, $1.00 per 1,000 listings** (off by default). Adds previous price, price change and a price series to listings you have scraped before. Charged only for listings that already had history; the first sighting is free.
- Failed runs and empty searches cost nothing; you can cap spending with **Maximum cost per run** in the run options.

See the **Pricing** tab for the current prices.

#### ⬇️ Input

| Field | Description |
|---|---|
| **Location** (`location`) | Dutch city or province, e.g. `Utrecht`, `Den Haag`, `Noord-Holland`. Empty = all of the Netherlands |
| **Buy or rent** (`listing_type`) | `sale` or `rent` |
| **Property type** (`property_type`) | house, apartment, land, commercial or parking |
| **Min / max price** (`min_price`, `max_price`) | In euro; monthly rent for rentals |
| **Min rooms** (`min_rooms`) | Minimum number of rooms (kamers) |
| **Min living area** (`min_living_area_m2`) | Square metres |
| **Search URLs** (`start_urls`) | Search result pages copied from huislijn.nl; the other search fields are then ignored |
| **Max listings** (`limit`) | Stop after this many listings |
| **Full details** (`includeDetails`) | Paid add-on |
| **Price history** (`trackHistory`, `historyStoreName`) | Paid add-on, see below |
| **Proxy** (`proxyConfiguration`) | Not needed for Huislijn |

```json
{
    "location": "Utrecht",
    "listing_type": "sale",
    "limit": 20,
    "includeDetails": false,
    "trackHistory": false
}
```

Property type is applied to the listings the Actor scrapes (Huislijn's own filter only takes one exact label), so narrow searches finish faster than a nationwide search for one type.

#### Price history

Switch on **Price history** (`trackHistory`) to follow price and status changes over time. The Actor keeps a small record per listing in a **named key-value store in your own Apify account** (default name `realestate-history`; change it with `historyStoreName`). We store nothing and run no database.

- **The first run starts the series.** Listings are recorded, nothing is added to the items yet and nothing is charged for history.
- **From the second run on**, every listing that is already in the store gets `first_seen_at`, `previous_price`, `price_change`, `price_change_pct`, `status_changed` and `price_history` (the last 20 changes: `{at, price, status}`). A new point is stored only when the price or the status changed, so the store stays small.
- **Schedule it** (for example daily) with the same search and the same store name. Huislijn shows only the current asking price and the status (`Beschikbaar`, `Onder bod`, `Verkocht onder voorbehoud`), so history is the way to see price cuts and listings going under offer.
- **Do not run two runs on the same store at the same time**: the last writer wins per listing and a price point can get lost. Use one store per schedule, or run them one after another.
- The store name is shared with our other real-estate Actors, so the same listing keeps one history when it shows up in several of them. Use another `historyStoreName` for a separate series. If you delete the store, the history starts over.
- Price: **$1.00 per 1,000 listings that already had history** (see below).

#### ⬆️ Output

Listings are stored in the default dataset, newest first. View them as a table in the **Output** tab or export JSON, CSV, Excel, XML or HTML.

##### Listing from the search results

```json
{
    "id": "huislijn:4444540",
    "source": "huislijn",
    "url": "https://www.huislijn.nl/koopwoning/nederland/noord-holland/4444540/wigbolt-ripperdastraat-44-amsterdam",
    "title": "Wigbolt Ripperdastraat 44, Amsterdam",
    "listing_type": "sale",
    "property_type": "apartment",
    "status": "available",
    "price": 450000,
    "price_currency": "EUR",
    "price_period": null,
    "price_type": "asking",
    "address": "Wigbolt Ripperdastraat 44, 1067EH Amsterdam",
    "street": "Wigbolt Ripperdastraat",
    "house_number": "44",
    "postcode": "1067EH",
    "city": "Amsterdam",
    "region": "Noord-Holland",
    "country": "NL",
    "lat": 52.381884,
    "lon": 4.804192,
    "living_area_m2": 93,
    "plot_area_m2": null,
    "rooms": 3,
    "bedrooms": 2,
    "bathrooms": null,
    "energy_label": null,
    "construction_year": 2005,
    "listed_at": null,
    "agent_name": null,
    "agent_phone": null,
    "agent_url": null,
    "image_urls": [
        "https://cdn-v4.huislijn.nl/objects/4444540/f73e6525d4dc4eb7ba5117ad8d15a6202af22abf/m.webp"
    ],
    "description": null,
    "scraped_at": "2026-10-30T15:05:25Z",
    "property_subtype": "Portiekflat",
    "price_condition": "kosten_koper",
    "status_label": "Beschikbaar",
    "external_url": null
}
```

##### The same kind of listing with the Full details add-on

```json
{
    "id": "huislijn:4444540",
    "source": "huislijn",
    "url": "https://www.huislijn.nl/koopwoning/nederland/noord-holland/4444540/wigbolt-ripperdastraat-44-amsterdam",
    "title": "Wigbolt Ripperdastraat 44, Amsterdam",
    "listing_type": "sale",
    "property_type": "apartment",
    "status": "available",
    "price": 450000,
    "price_currency": "EUR",
    "price_period": null,
    "price_type": "asking",
    "address": "Wigbolt Ripperdastraat 44, 1067EH Amsterdam",
    "street": "Wigbolt Ripperdastraat",
    "house_number": "44",
    "postcode": "1067EH",
    "city": "Amsterdam",
    "region": "Noord-Holland",
    "country": "NL",
    "lat": 52.381884,
    "lon": 4.804192,
    "living_area_m2": 93,
    "plot_area_m2": null,
    "rooms": 3,
    "bedrooms": 2,
    "bathrooms": null,
    "energy_label": null,
    "construction_year": 2005,
    "listed_at": null,
    "agent_name": "bij Bosch Makelaars",
    "agent_phone": "0362340005",
    "agent_url": "https://www.huislijn.nl/makelaar/137305/bij-bosch-makelaars-almere",
    "image_urls": [
        "https://cdn-v4.huislijn.nl/objects/4444540/f73e6525d4dc4eb7ba5117ad8d15a6202af22abf/m.webp"
    ],
    "description": "**See for English text below**\nAangeboden door bij Bosch Makelaars\nZie jij jezelf hier al wonen? Plan een bezichtiging via de planner aan de zijkant of neem telefonisch of via mail contact met ons op!\n\nRuimte, comfort én je eigen parkeerplaats: aan de Wigbolt Ripperdastraat 44 komt het allemaal same ...",
    "scraped_at": "2026-10-30T15:05:25Z",
    "property_subtype": "Portiekflat",
    "price_condition": "kosten_koper",
    "status_label": "Beschikbaar",
    "external_url": null
}
```

##### Fields added by the Price history add-on

```json
{
    "first_seen_at": "2026-10-30T15:09:52+00:00",
    "previous_price": 349000,
    "price_change": -20000,
    "price_change_pct": -5.73,
    "status_changed": false,
    "price_history": [
        {
            "at": "2026-10-30T15:09:52+00:00",
            "price": 349000,
            "status": "available"
        },
        {
            "at": "2026-11-06T15:10:01+00:00",
            "price": 329000,
            "status": "available"
        }
    ]
}
```

#### What can I do with Huislijn data?

- 🔔 **Deal alerts**: schedule a daily run and get new listings and price cuts in Slack, e-mail or Google Sheets
- 📈 **Market monitoring**: follow asking prices per city, property type and size over time
- 🏢 **Lead generation for agents, valuers and renovators**: find listings by price, size and energy label
- 🧠 **AI and analytics**: feed prices, areas and descriptions into valuation models or LLM pipelines

#### Tips for best results

- The Actor always asks Huislijn for the newest-first order (`order=created desc`), so a small `limit` gives you the latest listings. If you paste a **Search URL** that has its own `order`, that order is kept.
- Huislijn shows 13 listings per page, so 100 listings take 8 requests (about 4 seconds). **Cap**: a search reaches at most about 10,000 results (769 pages), even when the site counts more (about 19,000 homes for sale nationwide). To get everything, run one search per province or city, or split by price with `min_price` and `max_price`.
- Rentals on Huislijn are mostly entries fed by other portals (for example huurwoningen.nl): `external_url` links to the original.
- Use **Search URLs** for filters the form does not have (for example other regions or extra facets): apply them on huislijn.nl, copy the URL from the address bar and paste it.
- Leave **Full details** off for monitoring and counting; switch it on when you need descriptions and contacts.
- Results from the same search are deduplicated by listing ID.

#### Frequently asked questions

##### Can I use Huislijn Listings Scraper with the Apify API?

Yes. Every run has a dataset you can read through the [Apify API](https://docs.apify.com/api/v2). Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("carabain-digital/huislijn-listings").call(run_input={
    "location": "Utrecht",
    "listing_type": "sale",
    "max_price": 500000,
    "limit": 100,
})
for home in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(home["price"], home["address"] or home["city"], home["url"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('carabain-digital/huislijn-listings').call({
    location: 'Utrecht',
    listing_type: 'sale',
    max_price: 500000,
    limit: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'listings');
```

##### Can I use Huislijn Listings Scraper through an MCP server or with AI agents?

Yes. Add it to an AI agent through the [Apify MCP server](https://mcp.apify.com) (`https://mcp.apify.com?tools=carabain-digital/huislijn-listings`), or let the agent find it with `search-actors` and run it with `call-actor`. A small search (`limit` 20) finishes in a few seconds, and the dataset items are flat and small, so agents can read them with `get-dataset-items`. Example prompt: *"Use Huislijn Listings Scraper to find the 20 newest homes for sale in Utrecht and summarise the price range and typical living area."*

##### Can I integrate Huislijn data with other apps?

Yes: Google Sheets, Slack, Make, Zapier, n8n, Airtable or your own webhook, through Apify [integrations](https://apify.com/integrations) and [webhooks](https://docs.apify.com/platform/integrations/webhooks). Schedule runs to keep the data fresh.

##### Why is a field empty?

`listed_at` is always null because Huislijn shows no listing date. `agent_*` and `description` need the **Full details** add-on, and rentals fed by other portals have no agent there. `energy_label` is given in the search result for about half of the sale listings; the add-on fills it from the detail page when available. `house_number` is empty for rentals where the site hides it.

##### Is "price on request" handled?

Yes. Such listings have `price_type` `on_request` and `price` null. `price_condition` is `kosten_koper` (k.k.) or `von` (vrij op naam) when the site says so.

##### Do I get duplicates?

Within one run no: results are deduplicated by listing ID. Huislijn gets its listings from estate agents that also publish on Funda and Pararius, so across sites match on postcode and house number.

##### Is it legal to scrape Huislijn?

The Actor only collects publicly visible property listings, the same data anyone can see on huislijn.nl. Listings can contain personal data (for example an agent's name or phone number, or a private seller), and rules such as GDPR may apply to how you store and use it. The site's terms of use may also restrict automated access. Check your use case with a lawyer. More background: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

##### Huislijn Listings Scraper not working? Feedback

Open an issue on the **Issues** tab of this Actor with the run link and we will look at it. Feature ideas are welcome there too.

#### Other scrapers by us

| Actor | Covers |
|---|---|
| [Zimmo Listings Scraper](https://apify.com/carabain-digital/zimmo-listings) | Belgium: zimmo.be, with price history and publication date |
| [Immoweb Listings Scraper](https://apify.com/carabain-digital/immoweb-listings) | Belgium: immoweb.be, the largest Belgian property portal |
| [Immovlan Listings Scraper](https://apify.com/carabain-digital/immovlan-listings) | Belgium: immovlan.be |
| [Huislijn Listings Scraper](https://apify.com/carabain-digital/huislijn-listings) | Netherlands: huislijn.nl |
| [Pararius Listings Scraper](https://apify.com/carabain-digital/pararius-listings) | Netherlands: pararius.nl, rentals and sales |
| [Netherlands Real Estate Scraper](https://apify.com/carabain-digital/netherlands-real-estate) | Huislijn and Pararius in one run, merged and deduplicated |

⭐ **Does it work well for you?** A review on the Store page helps others find this Actor and helps us keep it maintained.

# Actor input Schema

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

Dutch city or province. Example: `Utrecht`, `Den Haag` or `Noord-Holland`. Leave empty for all of the Netherlands.

## `listing_type` (type: `string`):

`sale` for properties for sale, `rent` for rentals. Example: `sale`.

## `property_type` (type: `string`):

Only this kind of property. Example: `house`. Leave empty for all types. Applied to the scraped listings, so narrow searches are faster.

## `min_price` (type: `integer`):

Minimum price in euro (monthly rent for rentals). Example: `200000`.

## `max_price` (type: `integer`):

Maximum price in euro (monthly rent for rentals). Example: `450000`.

## `min_rooms` (type: `integer`):

Minimum number of rooms (kamers). Example: `3`.

## `min_living_area_m2` (type: `integer`):

Minimum living area in square metres. Example: `80`.

## `start_urls` (type: `array`):

Optional. Search result URLs copied from huislijn.nl, for filters this form does not have, e.g. `https://www.huislijn.nl/koopwoning/nederland/utrecht/utrecht?c-minPrice=300000`. When set, the other search fields are ignored. The Actor adds newest-first sorting unless the URL has an `order`.

## `limit` (type: `integer`):

Stop after this many listings (newest first). A search reaches at most about 10,000 results; split big searches by city or price. Example: `100`. Up to 10,000.

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

Also open each listing's detail page: the full description, the estate agent with phone number and agent page, and the energy label when the search result lacks it. Adds $1.00 per 1,000 listings on top of the base price. One extra request per listing. Rentals fed by other portals have a shortened description and no agent.

## `trackHistory` (type: `boolean`):

Remember each listing's price and status in a named storage in your own Apify account and add `previous_price`, `price_change`, `price_change_pct`, `status_changed`, `first_seen_at` and `price_history` to every listing you have seen before. Schedule the Actor to build a series. Adds $1.00 per 1,000 listings that already had history (the first sighting is free). Do not run two runs on the same store at once.

## `historyStoreName` (type: `string`):

Name of the key-value store that keeps the history (lowercase letters, digits and dashes). The same name across runs and across our other real-estate Actors shares one history. Example: `realestate-history`.

## `proxyConfiguration` (type: `object`):

Huislijn works without a proxy. Enable one only if runs get blocked.

## Actor input object example

```json
{
  "location": "Utrecht",
  "listing_type": "sale",
  "limit": 20,
  "includeDetails": false,
  "trackHistory": false,
  "historyStoreName": "realestate-history",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped listings, one item per property.

# 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",
    "listing_type": "sale",
    "limit": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("carabain-digital/huislijn-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",
    "listing_type": "sale",
    "limit": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("carabain-digital/huislijn-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",
  "listing_type": "sale",
  "limit": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call carabain-digital/huislijn-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,carabain-digital/huislijn-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/0BOem3pTBOfahOKEg/builds/ikzJGIqkWnHhW8jF6/openapi.json
