# Boligsiden Scraper - Denmark Real Estate Data (`benthepythondev/boligsiden-scraper`) Actor

Scrape Boligsiden.dk (Denmark's #1 property portal): price, price per m², size, rooms, year built, energy label, coordinates, photos AND the estate agent's name, e-mail and phone. Homes and apartments for sale or rent by type, zip code or municipality. Reliable JSON API, no browser.

- **URL**: https://apify.com/benthepythondev/boligsiden-scraper.md
- **Developed by:** [ben](https://apify.com/benthepythondev) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## 🇩🇰 Boligsiden Scraper - Denmark Real Estate Data

Scrape **Boligsiden.dk**, Denmark's #1 real-estate portal, and turn any search into a clean, structured dataset of properties for sale or rent. For every listing you get the **price, price per m², living area, number of rooms, year built, energy label, GPS coordinates, photos** and — crucially for lead generation — the **estate agent's name, e-mail and phone number**. Paste a Boligsiden search URL, choose how many results you want, and go. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Boligsiden Scraper?

Boligsiden.dk aggregates practically every home on the Danish market from all the big estate-agent chains (EDC, home, Danbolig, Nybolig, RealMæglerne and more). This actor reads Boligsiden's own public data feed, so the results are fast, complete and always up to date — no browser, no CAPTCHAs, no missing fields.

Give it a search URL such as *villas for sale in Aarhus* or *apartments for rent in Copenhagen* and it returns one tidy row per property, ready for analysis, a CRM, a price model or an outreach list.

#### What data does it extract?

- **Full address** — street, house number, zip code, city, municipality, region and GPS latitude/longitude
- **Price** — cash price, price per m², monthly owner expense and any recent price change
- **Property facts** — type, living area, weighted area, lot size, rooms, bathrooms, toilets, floors, year built and energy label
- **Estate agent (lead-gen)** — agency name, contact e-mail, phone number, CVR company number and office address
- **Media & content** — listing photos, floor-plan image, marketing title and full description
- **Listing meta** — days on market, next open house, status, Boligsiden URL and the agent's own listing URL

### ⬇️ Input

| Field | Type | Description |
|-------|------|-------------|
| `searchUrls` | array | One or more Boligsiden search-results URLs. Copy them from your browser after filtering on boligsiden.dk (for sale `/tilsalg` or rent `/til-leje`, by type, zip code or municipality). Leave empty for the newest homes for sale across all of Denmark. |
| `maxResults` | integer | Maximum number of listings to return per search URL (default 40). |

#### Example input

```json
{
  "searchUrls": [
    "https://www.boligsiden.dk/tilsalg/villa/aarhus-c-8000",
    "https://www.boligsiden.dk/tilsalg/ejerlejlighed"
  ],
  "maxResults": 100
}
````

### ⬆️ Output

Each dataset item looks like this (real fields the actor emits):

```json
{
  "id": "a2fb47e3-6ff0-4d86-b5b6-3dacc8c0d618",
  "url": "https://www.boligsiden.dk/bolig/nordre-frihavnsgade-15-2-tv-2100-koebenhavn-oe-01015044__15__2__tv",
  "realtor_case_url": "https://home.dk/sag/6200002833",
  "property_type": "condo",
  "status": "open",
  "price": 6995000,
  "currency": "DKK",
  "price_per_m2": 78596,
  "price_change_percentage": 0,
  "monthly_expense": 5573,
  "area_m2": 89,
  "weighted_area_m2": 91,
  "lot_size": null,
  "rooms": 4,
  "bathrooms": 1,
  "toilets": 1,
  "floors": 2,
  "year_built": 1902,
  "energy_label": "c",
  "has_balcony": true,
  "has_elevator": false,
  "has_terrace": false,
  "days_on_market": 12,
  "address": "Nordre Frihavnsgade 15, 2100 København Ø",
  "road": "Nordre Frihavnsgade",
  "house_number": "15",
  "zip": 2100,
  "city": "København Ø",
  "municipality": "København",
  "province": "Byen København",
  "latitude": 55.700718,
  "longitude": 12.579353,
  "description_title": "Lys 4-værelses med altan",
  "agent_name": "EDC Poul Erik Bech, Østerbro og Nordhavn",
  "agency": "EDC Poul Erik Bech, Østerbro og Nordhavn",
  "agent_email": "531@edc.dk",
  "agent_phone": "35550531",
  "agent_cvr": "12345678",
  "agent_address": "Østerbrogade 100",
  "agent_zip": 2100,
  "agent_city": "København Ø",
  "image": "https://images.boligsiden.dk/images/case/.../1440x960/....webp",
  "num_images": 5,
  "floor_plan": "https://billeder.edc.dk/.../floorplan.jpg",
  "search": "https://www.boligsiden.dk/tilsalg/ejerlejlighed"
}
```

### 💡 Use cases

- 🏠 **Real-estate lead generation** — build targeted lists of estate agents (name, e-mail, phone) by area or property type for outreach and partnerships.
- 📊 **Market analysis & valuation** — track asking prices, price per m², energy labels and days-on-market across Danish municipalities to power AVMs and reports.
- 🔔 **Deal & price-drop monitoring** — schedule the actor to spot new listings and price changes the moment they hit the market.
- 🗺️ **Data enrichment & mapping** — feed clean address, coordinates and property attributes into your CRM, GIS or investment dashboard.

### ❓ FAQ

**Which Boligsiden searches are supported?**
Any search-results URL from boligsiden.dk — homes for sale (`/tilsalg`) or rent (`/til-leje`), filtered by property type, zip code or municipality. Just paste the URL you see in your browser.

**How do I scrape a specific city or area?**
Filter on boligsiden.dk until you see the listings you want, then copy the URL from the address bar into `searchUrls`. City/area URLs like `.../villa/aarhus-c-8000` and municipality searches are handled automatically.

**Does it include the estate agent's contact details?**
Yes. Every listing includes the agency name, and where Boligsiden publishes it, the office e-mail, phone number, CVR number and address — ideal for B2B lead generation.

**How many listings can I get?**
As many as the search contains — set `maxResults`. The actor paginates through the whole result set (thousands of listings) for you.

**How fresh is the data?**
It is pulled live from Boligsiden on every run, so it reflects the current market. Schedule the actor to keep a dataset continuously up to date.

**In what formats can I export?**
JSON, CSV, Excel, XML or HTML from the Apify console or API, and you can push straight to Make, Zapier, n8n, Google Sheets or your own database.

**Do I need proxies or an account?**
No. The actor works out of the box; it can optionally route through Apify's Danish residential proxies for extra resilience, but that is not required.

**Is scraping Boligsiden legal?**
The actor only collects publicly available listing information. You are responsible for using the data in line with Boligsiden's terms, the GDPR and any applicable marketing laws (e.g. consent rules under the ePrivacy/CAN-SPAM style regulations) — especially when contacting agents. Do not use personal data for unlawful purposes.

### 🔗 You might also like

- 🇸🇪 **Hemnet Scraper** — Sweden's #1 property portal
- 🇳🇴 **Finn.no Real Estate Scraper** — Norway's biggest marketplace
- 🇳🇱 **Pararius Scraper** — Netherlands rental listings
- 🇳🇱 **Funda Scraper** — Netherlands #1 property portal
- 🇩🇪 **Kleinanzeigen Immobilien Scraper** — German property listings
- 🏘️ **Zillow, Rightmove, Idealista & Immobiliare scrapers** — more countries in the same lead-gen format

**Keywords:** boligsiden scraper, boligsiden.dk, denmark real estate scraper, danish property data, boliger til salg, ejendomsmægler leads, denmark housing api, scrape boligsiden, real estate lead generation denmark, property listings denmark, danish estate agent emails, boligsiden api, apartments for sale denmark, villa til salg, denmark rental listings, copenhagen real estate data, aarhus property scraper, energy label denmark, price per m2 denmark, real estate crm data.

# Actor input Schema

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

Paste one or more Boligsiden search-results URLs (copy them from your browser after filtering on boligsiden.dk). Works for homes for sale (/tilsalg) or rent (/til-leje), by property type (villa, ejerlejlighed, raekkehus, fritidsbolig, …), zip code or municipality. Leave empty for the newest homes for sale across all of Denmark.

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

Maximum number of listings to return per search URL.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.boligsiden.dk/tilsalg"
  ],
  "maxResults": 10
}
```

# 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 = {
    "searchUrls": [
        "https://www.boligsiden.dk/tilsalg"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/boligsiden-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 = {
    "searchUrls": ["https://www.boligsiden.dk/tilsalg"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/boligsiden-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.boligsiden.dk/tilsalg"
  ],
  "maxResults": 10
}' |
apify call benthepythondev/boligsiden-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=benthepythondev/boligsiden-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Boligsiden Scraper - Denmark Real Estate Data",
        "description": "Scrape Boligsiden.dk (Denmark's #1 property portal): price, price per m², size, rooms, year built, energy label, coordinates, photos AND the estate agent's name, e-mail and phone. Homes and apartments for sale or rent by type, zip code or municipality. Reliable JSON API, no browser.",
        "version": "1.0",
        "x-build-id": "UtFz9BKAf13DZX0XU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~boligsiden-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-boligsiden-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/benthepythondev~boligsiden-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-boligsiden-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/benthepythondev~boligsiden-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-boligsiden-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchUrls": {
                        "title": "Boligsiden search URLs",
                        "type": "array",
                        "description": "Paste one or more Boligsiden search-results URLs (copy them from your browser after filtering on boligsiden.dk). Works for homes for sale (/tilsalg) or rent (/til-leje), by property type (villa, ejerlejlighed, raekkehus, fritidsbolig, …), zip code or municipality. Leave empty for the newest homes for sale across all of Denmark.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results per search",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum number of listings to return per search URL.",
                        "default": 40
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
