# Boliga.dk Scraper (`shahidirfan/boliga-dk-scraper`) Actor

Extract real estate listings from Boliga.dk with structured property data including price, address, size, rooms, lot area, energy rating, listing status, images, coordinates, and property details. Perfect for market research, price tracking, lead generation, and analytics.

- **URL**: https://apify.com/shahidirfan/boliga-dk-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 10 total users, 2 monthly users, 100.0% runs succeeded, 0 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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### What does Boliga.dk Scraper do?

Boliga.dk Scraper collects Danish property listings from Boliga.dk, the largest real estate marketplace in Denmark. Provide a Boliga search URL or a city name, and the Actor returns structured listing data including prices, addresses, property details, images, and listing metadata. The output works for market analysis, property research, price monitoring, and real estate data aggregation.

### Why use Boliga.dk Scraper?

- **Structured property data** - Get clean, normalized listing fields instead of copy-pasting from web pages.
- **Flexible input methods** - Run with a Boliga result URL, an area identifier, or a city name.
- **Automation-ready** - Export results to JSON, CSV, Excel, or connect to Google Sheets and other tools.
- **Schedule for monitoring** - Run daily or weekly to track price changes and new listings in specific areas.
- **Deduplicated results** - Duplicate listings are automatically removed using the Boliga listing identifier.

### What data can you extract from Boliga.dk?

| Field | Description |
|-------|-------------|
| `street` | Street address of the property |
| `zip_code` | Danish postal code |
| `city` | City name |
| `price` | Asking price in DKK |
| `rooms` | Number of rooms |
| `size` | Registered size in square meters |
| `lot_size` | Lot size in square meters |
| `property_type` | Property type code |
| `energy_class` | Energy label |
| `build_year` | Year the property was built |
| `squaremeter_price` | Price per square meter |
| `days_for_sale` | Number of days listed on the market |
| `listing_url` | Direct link to the Boliga detail page |
| `image_url` | Primary listing image |

### How to use Boliga.dk Scraper

1. Open the Actor on Apify Store.
2. Enter a Boliga result URL such as `https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg`.
3. Set the maximum number of listings to collect.
4. Optionally adjust the page limit or use an area or city override.
5. Run the Actor.
6. Download the dataset or connect it to your workflow.

#### Using area or city overrides

If you prefer not to use a URL, provide an `areaId` (Boliga region identifier) or a `place` (city name) directly. The Actor will build the search parameters for you.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | Copenhagen region result URL | Boliga result URL to mirror |
| `areaId` | Integer | No | - | Boliga area identifier override |
| `place` | String | No | - | City or place name override |
| `results_wanted` | Integer | No | `20` | Maximum number of listings to save |
| `max_pages` | Integer | No | `5` | Maximum number of result pages to request |
| `proxyConfiguration` | Object | No | Apify proxy disabled | Proxy settings for reliable runs |

### Output Data

| Field | Type | Description |
|-------|------|-------------|
| `listing_id` | Integer | Boliga listing identifier |
| `street` | String | Street address |
| `clean_street` | String | Normalized street name |
| `zip_code` | Integer | Danish postal code |
| `city` | String | City name |
| `municipality_code` | Integer | Municipality code |
| `area_id` | Integer | Boliga area identifier |
| `property_type` | Integer | Property type code |
| `item_type` | Integer | Listing item type code |
| `price` | Integer | Asking price in DKK |
| `price_change_percent_total` | Number | Total price change percentage |
| `squaremeter_price` | Number | Price per square meter |
| `monthly_net` | Integer | Monthly net payment estimate |
| `monthly_expenses` | Integer | Monthly expense estimate |
| `down_payment` | Integer | Required down payment estimate |
| `energy_class` | String | Energy label |
| `rooms` | Number | Number of rooms |
| `size` | Integer | Registered size in square meters |
| `lot_size` | Integer | Lot size in square meters |
| `basement_size` | Integer | Basement size in square meters |
| `floor` | Integer | Floor number when available |
| `build_year` | Integer | Year built |
| `days_for_sale` | Integer | Days on market |
| `views` | Integer | Listing views |
| `latitude` | Number | Latitude coordinate |
| `longitude` | Number | Longitude coordinate |
| `created_date` | String | Listing creation timestamp |
| `is_active` | Boolean | Whether the listing is currently active |
| `is_foreclosure` | Boolean | Foreclosure flag |
| `image_url` | String | Primary listing image URL |
| `images` | Array | Listing image objects when available |
| `listing_url` | String | Boliga detail page URL |
| `search_url` | String | Source result URL used for the run |

### Usage Examples

#### Basic listing collection from a Boliga result URL

Run with a Copenhagen region result page and collect 20 listings:

```json
{
  "startUrl": "https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg",
  "results_wanted": 20,
  "max_pages": 2
}
```

#### Collect listings by area identifier

Use a direct area ID to collect listings from a specific Boliga region:

```json
{
  "areaId": 1,
  "results_wanted": 50,
  "max_pages": 3
}
```

#### Collect listings by city name

Provide a city name to collect properties in a specific location:

```json
{
  "place": "Frederiksberg",
  "results_wanted": 40,
  "max_pages": 2
}
```

#### Large-scale collection across multiple pages

Increase the result limit and page cap for broader coverage:

```json
{
  "startUrl": "https://www.boliga.dk/resultat/landsdele/nordsjaelland/alle-til-salg",
  "results_wanted": 200,
  "max_pages": 5
}
```

### Sample Output

```json
{
  "listing_id": 2307239,
  "street": "Herninggade 23, 5. th.",
  "zip_code": 2100,
  "city": "Kobenhavn O",
  "price": 4995000,
  "squaremeter_price": 84661,
  "rooms": 2,
  "size": 59,
  "energy_class": "D",
  "build_year": 1940,
  "days_for_sale": 45,
  "views": 8,
  "latitude": 55.7132,
  "longitude": 12.5534,
  "image_url": "https://i.boliga.org/dk/550x/2307/2307239.jpg",
  "listing_url": "https://www.boliga.dk/bolig/2307239/herninggade-23-5-th-2100-koebenhavn-oe",
  "is_active": true,
  "search_url": "https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg"
}
```

### Tips for Best Results

- **Use a complete Boliga result URL** for best reliability. The Actor can parse region, city, and postal code searches from the URL path.
- **Start with a small result count** for testing. Use `results_wanted: 20` and `max_pages: 2` to verify the output before running larger collections.
- **Use area or city overrides** when a result URL is not available or when you want simpler input.
- **Residential proxies improve success rates** on Boliga. If you encounter incomplete results, enable Apify residential proxy in the proxy configuration.
- **Check the dataset preview** before scheduling larger runs to confirm you are collecting the right properties.

### Integrations

- **Google Sheets** - Send scraped listing data to spreadsheets for analysis and sharing.
- **Webhooks** - Trigger downstream workflows after each run completes.
- **Make or Zapier** - Connect results to no-code automations and notifications.
- **API** - Access datasets programmatically from your own systems.
- **CSV, Excel, JSON, XML** - Download the dataset in your preferred format from Apify Console.

### Related Actors

- [Propertyfinder Scraper](https://apify.com/shahidirfan/propertyfinder-scraper) - Collect property listings from PropertyFinder.ae with pricing, specifications, location data, agent details, and listing media.
- [Housing.com Property Scraper](https://apify.com/shahidirfan/housing-com-property-scraper) - Extract real estate listings from Housing.com with pricing, seller details, sizes, tags, and location data.

### Frequently Asked Questions

#### Can I export the data to CSV or Excel?

Yes. Apify datasets can be downloaded in CSV, Excel, JSON, XML, and other supported formats from the dataset page.

#### Can I run this Actor on a schedule?

Yes. You can schedule the Actor in Apify Console to refresh data hourly, daily, weekly, or at another interval that suits your monitoring needs.

#### How are duplicate listings handled?

Duplicate listings are automatically detected and skipped using the unique Boliga listing identifier. You will not get repeated entries for the same property.

#### What if some fields are missing in the output?

Some fields may be empty when the source page does not publish that information. For example, not all listings include basement size or floor number. Check multiple results before assuming the Actor failed.

#### Can I search by postal code?

Yes. Boliga result URLs support postal code searches. Use a URL such as `https://www.boliga.dk/resultat/postnumre/2100/alle-til-salg` to filter by a specific Danish postal code.

#### Is it legal to scrape Boliga.dk?

Scraping public web data can be legal, but you are responsible for complying with applicable laws, Boliga's terms of service, and your own data handling obligations.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate data collection from publicly available sources on Boliga.dk. Users are responsible for using the data responsibly and complying with applicable laws, the Boliga.dk terms of service, and data protection regulations.

# Actor input Schema

## `startUrl` (type: `string`):

Boliga result URL to mirror, for example a region or city sale page.

## `areaId` (type: `integer`):

Optional Boliga area identifier. The Copenhagen region page uses area ID 1.

## `place` (type: `string`):

Optional city or place name when not using a start URL.

## `results_wanted` (type: `integer`):

Maximum number of listings to save.

## `max_pages` (type: `integer`):

Safety cap on the number of result pages to request from Boliga.

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

Residential proxies are recommended for reliable Boliga runs.

## Actor input object example

```json
{
  "startUrl": "https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg",
  "results_wanted": 20,
  "max_pages": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "startUrl": "https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg",
    "results_wanted": 20,
    "max_pages": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/boliga-dk-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 = {
    "startUrl": "https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg",
    "results_wanted": 20,
    "max_pages": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/boliga-dk-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 '{
  "startUrl": "https://www.boliga.dk/resultat/landsdele/koebenhavn-by/alle-til-salg",
  "results_wanted": 20,
  "max_pages": 2
}' |
apify call shahidirfan/boliga-dk-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/gcvgKAVgGPRP8cdBp/builds/sMPRtdZsndR7TenG3/openapi.json
