# BoligPortal Rental Listings Scraper (`parseforge/boligportal-scraper`) Actor

Scrapes BoligPortal rental listings by city. Returns rent, size, rooms, and location for apartments across Denmark's largest cities.

- **URL**: https://apify.com/parseforge/boligportal-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Real estate, Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.00 / 1,000 result items

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/platform/actors/running/actors-in-store#pay-per-event

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### BoligPortal Rental Listings Scraper

**Scrape rental listings from BoligPortal across Denmark's largest cities, up to a million per run.** Every listing includes rent, size, location, and available move-in dates. No login or API key. Export to CSV, JSON, Excel, or XML.

BoligPortal is Denmark's dominant rental marketplace, but manually checking for new apartments wastes hours. This scraper reads the public listing feed directly, filtering by city, and returns every match in one consistent schema. It is built for anyone who needs a fast, structured view of the Danish rental market.

| Who uses it | What they scrape BoligPortal for |
|---|---|
| International students | Finding available apartments in Copenhagen or Aarhus before arrival. |
| Relocation agencies | Building a database of current rental options for corporate clients moving to Denmark. |
| Real estate analysts | Tracking rent price trends across major Danish cities over time. |
| Property investors | Monitoring new supply and pricing in Odense, Aalborg, and Esbjerg. |

### What it does

This Actor collects BoligPortal rental listings by city and returns each one as a flat row with rent, size, rooms, and location details.

- 🏙️ **City-level targeting:** Choose from Copenhagen, Aarhus, Odense, Aalborg, Esbjerg, Randers, Kolding, or Horsens.
- 📊 **Structured output:** Each listing arrives as a flat row, ready for analysis in spreadsheets or databases.
- ⚡ **High-volume runs:** Set a maximum up to 1,000,000 listings to capture the full market in one go.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with BoligPortal data

**📈 Track rental market trends.**

A market analyst runs the scraper weekly on Copenhagen and Aarhus to feed a rent price index dashboard.

**🏠 Build a relocation shortlist.**

A relocation agent scrapes all available Horsens listings to send a filtered list of family-sized apartments to an incoming expat.

**📊 Monitor competitor supply.**

A property manager scrapes Odense daily to see how many new units competitors are listing and at what price.

**🎓 Find student housing.**

An international student scrapes Aalborg for apartments under 50 sqm with immediate availability before the semester starts.

### Why choose this scraper

|  | What you get |
|---|---|
| **Rent price** | The monthly cost in DKK, scraped directly from the listing. |
| **Apartment size** | Square meters and number of rooms for easy filtering. |
| **Location** | Postal code and city name to map supply geographically. |
| **Move-in date** | When the apartment becomes available, critical for planning. |

### How it compares

No other Store actor targets BoligPortal the same way, so the honest comparison is with the alternatives teams actually weigh.

| | BoligPortal Rental Listings Scraper | Build it in-house | By hand |
|---|---|---|---|
| Setup | Run it now, zero config | Days of engineering | None, but hours per pull |
| When BoligPortal changes | Maintained for you | You fix it | You re-learn the page |
| Proxies, retries, anti-bot | Built in | Your problem | Browser only |
| Output | Fixed JSON schema, CSV/Excel export | Whatever you build | Copy-paste |
| Cost | Pay per result | Engineering time | Analyst hours |

### Configure the run

Drive the Actor by selecting a city slug and a maximum number of listings, and it returns every match in a clean dataset. The Input tab lists every parameter.

A first run with the defaults:

```json
{
  "maxItems": 10
}
```

A larger pull:

```json
{
  "maxItems": 200
}
```

### Pricing

Pay-per-result: **$0.021 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $2.10 |
| 1,000 results | $21.00 |
| 10,000 results | $210.00 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [BoligPortal Rental Listings Scraper](https://apify.com/parseforge/boligportal-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to BoligPortal through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/boligportal-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that the city slug is spelled correctly and matches one of the eight supported cities. Also verify that your maxItems is set to a number greater than zero.

**The run finishes but returns fewer listings than expected.**

BoligPortal may have fewer active listings than your maxItems value at the time of the scrape. Try running again later, or check the site directly to confirm current availability.

**Some listing details are missing in the output.**

The scraper extracts all fields visible on the public listing card. If a landlord omitted a detail like move-in date, that field will be empty in your dataset.

**The Actor is taking a long time to complete.**

A high maxItems value on a city with many listings will take longer. Reduce the maximum, or run the Actor on a smaller city like Horsens or Randers to test speed.

**I see an error about the city input.**

Use the dropdown in the input editor to select a city. Typing a custom value that is not in the enum list will cause the run to fail.

### FAQ

| Question | Answer |
|---|---|
| Does this scraper require a BoligPortal login? | No, it reads the publicly available listing pages. No account, password, or API key is needed. |
| Can I scrape listings from multiple cities at once? | The Actor runs for one city per execution. To cover several cities, run it multiple times with different city slugs, or schedule parallel runs. |
| What data fields does the scraper return? | It returns rent, size, number of rooms, postal code, city, move-in date, and the listing URL, among other fields visible on the public page. |
| Is it legal to scrape BoligPortal? | This Actor only accesses publicly available pages. You are responsible for complying with BoligPortal's terms of service and local laws. |
| How do I find the correct city slug? | The input editor provides a dropdown list of the eight supported cities. Select one, and the Actor handles the URL construction. |
| Can I filter by rent price or apartment size? | The Actor collects all listings for the chosen city. Apply your own filters to the exported CSV or JSON dataset after the run completes. |
| How many listings can I scrape in one run? | You can set the maximum up to 1,000,000. The Actor stops when it reaches your limit or when no more listings are available. |
| What export formats are supported? | You can export your results to CSV, JSON, Excel, or XML directly from the Apify dataset tab. |
| Does this work for commercial real estate? | This Actor targets residential rental listings. It does not separate commercial properties if they appear in the same city feed. |

### Related actors

- [facebook-marketplace-scraper](https://apify.com/parseforge/facebook-marketplace-scraper?fpr=vmoqkp): Use this if you also need to find rental listings posted by individuals on Facebook Marketplace in Denmark.

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by BoligPortal A/S. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `city` (type: `string`):

City slug

## `maxItems` (type: `integer`):

Maximum number of rental listings to scrape.

## Actor input object example

```json
{
  "city": "copenhagen",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/boligportal-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 = { "maxItems": 10 }

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

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 10
}' |
apify call parseforge/boligportal-scraper --silent --output-dataset

```

## MCP server setup

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

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8TQH9mSo6fsh1Uz7U/builds/8UKZeBnb69uIdx0FK/openapi.json
