# Boliga Scraper - Danish Real Estate Listings & Prices (`studio-amba/boliga-scraper`) Actor

Scrape real estate listings and property prices from Boliga.dk, Denmark's leading property portal. Search by location, property type, price range, and rooms. No login required.

- **URL**: https://apify.com/studio-amba/boliga-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

### Boliga Scraper

Scrape real estate listings and property prices from **Boliga.dk** — Denmark's leading property portal with comprehensive coverage of the Danish housing market. Extract structured data including prices, addresses, property details, energy ratings, and days on market. No login or cookies required.

### How to scrape Boliga data

Extracting property data from Boliga.dk manually is tedious, especially when you need hundreds or thousands of listings for market analysis. This actor automates the process and returns clean, structured JSON data ready for analysis.

1. Go to the [Boliga Scraper](https://apify.com/itsnotyouitsme/boliga-scraper) page on Apify Store.
2. Click **Try for free** to open the actor in Apify Console.
3. Enter your search criteria — city, property type, price range, or leave defaults for Copenhagen.
4. Click **Start** and wait for the run to complete.
5. Download your data in JSON, CSV, Excel, or connect via API.

### Features

- Search by **location** (city, area, or region in Denmark)
- Filter by **property type**: villa, apartment (ejerlejlighed), townhouse (raekkehus), vacation home, country property
- Filter by **listing type**: for sale or for rent
- Filter by **price range** (min/max in DKK)
- Filter by **number of rooms** (min/max)
- Returns **20+ fields** per listing including price, address, surface area, rooms, build year, energy rating, and days on market
- Automatic **pagination** — scrape hundreds or thousands of listings in one run
- **No login required** — works without cookies or authentication
- Built-in **proxy support** for reliable access with Danish residential proxies

### Input options

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `searchQuery` | String | City or area to search (e.g., "København", "Aarhus") | København |
| `propertyType` | Enum | Property type filter | All types |
| `listingType` | Enum | Sale or rent | Sale |
| `minPrice` | Integer | Minimum price in DKK | — |
| `maxPrice` | Integer | Maximum price in DKK | — |
| `minRooms` | Integer | Minimum number of rooms | — |
| `maxRooms` | Integer | Maximum number of rooms | — |
| `maxResults` | Integer | Maximum listings to return | 100 |
| `proxyConfiguration` | Object | Proxy settings | Danish residential proxy |

#### Property types

| Value | Description |
|-------|-------------|
| `all` | All property types |
| `villa` | Villa / detached house |
| `ejerlejlighed` | Owner-occupied apartment |
| `raekkehus` | Townhouse / terraced house |
| `fritidshus` | Vacation / holiday home |
| `landejendom` | Country property / farm |

### Output fields

Each listing contains these fields:

| Field | Type | Description |
|-------|------|-------------|
| `title` | String | Property title / address |
| `price` | Number | Asking price in DKK |
| `currency` | String | Currency code (DKK) |
| `listingType` | String | "sale" or "rent" |
| `propertyType` | String | Property type |
| `address` | String | Street address |
| `city` | String | City name |
| `postalCode` | String | Danish 4-digit postal code |
| `rooms` | Number | Number of rooms |
| `surface` | Number | Living area in m2 |
| `landSurface` | Number | Plot/land area in m2 |
| `buildYear` | Number | Year built |
| `epcScore` | String | Energy rating (A-G) |
| `daysOnMarket` | Number | Days listed |
| `pricePerSqm` | Number | Price per m2 (DKK) |
| `imageUrl` | String | Main listing photo URL |
| `agencyName` | String | Real estate agency |
| `url` | String | Full Boliga.dk listing URL |
| `scrapedAt` | String | ISO timestamp |

### Example output

```json
{
    "title": "Vesterbrogade 42, 3. tv.",
    "price": 3450000,
    "currency": "DKK",
    "listingType": "sale",
    "propertyType": "ejerlejlighed",
    "address": "Vesterbrogade 42, 3. tv.",
    "city": "København V",
    "postalCode": "1620",
    "rooms": 3,
    "surface": 85,
    "landSurface": null,
    "buildYear": 1906,
    "epcScore": "D",
    "daysOnMarket": 14,
    "pricePerSqm": 40588,
    "imageUrl": "https://images.boliga.dk/...",
    "agencyName": "Nybolig",
    "url": "https://www.boliga.dk/bolig/1234567",
    "scrapedAt": "2026-05-27T12:00:00.000Z"
}
````

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the Output tab.

### Cost estimation

Running costs depend on the number of listings scraped. This actor uses a browser (Playwright) because Boliga.dk requires JavaScript rendering.

| Listings | Estimated cost | Estimated time |
|----------|---------------|----------------|
| 100 | ~$0.10 | 1-2 min |
| 500 | ~$0.40 | 5-8 min |
| 1,000 | ~$0.75 | 10-15 min |
| 5,000 | ~$3.50 | 45-60 min |

Costs include compute units and residential proxy traffic. Actual costs may vary depending on proxy usage and page complexity.

### Tips for best results

- **Use Danish city names** for search queries (e.g., "København" not "Copenhagen", "Aarhus" not "Arhus")
- **Start with fewer results** (50-100) to verify the output matches your needs before scaling up
- **Use property type filters** to narrow results and reduce run time
- **Price range filters** help when you only need specific market segments
- Residential proxy with Danish location (DK) is recommended and pre-configured by default

### Integrations

Connect Boliga Scraper to other tools and workflows:

- **API access** — Trigger runs programmatically via REST API
- **Webhooks** — Get notified when a run completes
- **Scheduling** — Set up recurring scrapes (daily, weekly)
- **Zapier / Make** — Connect to 3,000+ apps
- **Google Sheets** — Export results directly to spreadsheets

### FAQ

**Is it legal to scrape Boliga.dk?**
This actor extracts publicly available data from Boliga.dk. Users are responsible for ensuring their use complies with applicable laws, Boliga's Terms of Service, and data protection regulations (GDPR).

**How fresh is the data?**
Each run fetches live data directly from Boliga.dk. Results reflect the current state of listings at the time of scraping.

**What if the scraper returns no results?**
Boliga.dk has anti-bot protections. The actor uses residential proxies and browser automation to handle this. If you get empty results, try running again — the debug HTML is saved to the key-value store for troubleshooting.

**Can I scrape sold properties?**
This version focuses on active listings (for sale and for rent). Sold property data may be added in a future update.

### Support

Found a bug or need a custom feature? Open an issue in the [Issues tab](https://apify.com/itsnotyouitsme/boliga-scraper/issues) and we will respond within 24 hours. For custom scraping solutions, reach out through the same channel.

# Actor input Schema

## `searchQuery` (type: `string`):

City or area to search (e.g., 'Kobenhavn', 'Aarhus', 'Odense', 'Aalborg'). Leave empty to search all of Denmark.

## `propertyType` (type: `string`):

Filter by property type.

## `listingType` (type: `string`):

Search for properties for sale or rent.

## `minPrice` (type: `integer`):

Minimum price in DKK.

## `maxPrice` (type: `integer`):

Maximum price in DKK.

## `minRooms` (type: `integer`):

Minimum number of rooms.

## `maxRooms` (type: `integer`):

Maximum number of rooms.

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

Maximum number of listings to return.

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

Proxy settings. Danish residential proxy recommended for best results.

## Actor input object example

```json
{
  "searchQuery": "København",
  "propertyType": "all",
  "listingType": "sale",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DK"
  }
}
```

# 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 = {
    "searchQuery": "København",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DK"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/boliga-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 = {
    "searchQuery": "København",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DK",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/boliga-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 '{
  "searchQuery": "København",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DK"
  }
}' |
apify call studio-amba/boliga-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Boliga Scraper - Danish Real Estate Listings & Prices",
        "description": "Scrape real estate listings and property prices from Boliga.dk, Denmark's leading property portal. Search by location, property type, price range, and rooms. No login required.",
        "version": "0.1",
        "x-build-id": "U5bNsrzSkEbWPMJh6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~boliga-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-boliga-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/studio-amba~boliga-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-boliga-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/studio-amba~boliga-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-boliga-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": {
                    "searchQuery": {
                        "title": "Search Query / Location",
                        "type": "string",
                        "description": "City or area to search (e.g., 'Kobenhavn', 'Aarhus', 'Odense', 'Aalborg'). Leave empty to search all of Denmark."
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "all",
                            "villa",
                            "ejerlejlighed",
                            "raekkehus",
                            "fritidshus",
                            "landejendom"
                        ],
                        "type": "string",
                        "description": "Filter by property type.",
                        "default": "all"
                    },
                    "listingType": {
                        "title": "Listing Type",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Search for properties for sale or rent.",
                        "default": "sale"
                    },
                    "minPrice": {
                        "title": "Minimum Price (DKK)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price in DKK."
                    },
                    "maxPrice": {
                        "title": "Maximum Price (DKK)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price in DKK."
                    },
                    "minRooms": {
                        "title": "Minimum Rooms",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of rooms."
                    },
                    "maxRooms": {
                        "title": "Maximum Rooms",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of rooms."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of listings to return.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Danish residential proxy recommended for best results."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
