# Boligsiden.dk Scraper 🔥 Homes & Real Estate 🏠 (`memo23/boligsiden-scraper`) Actor

Boligsiden.dk scraper: Danish homes for sale, rentals and foreclosure auctions. Price, every price cut, views, open house, energy label, GPS, photos, agent phone, email, CVR. Rent, deposit, move-in date. Auction court, bids, lawyer. Filter by area, type, price. New-listings mode.

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

## Pricing

from $0.50 / 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

## Boligsiden.dk Homes & Real Estate Scraper

Paste any **Boligsiden.dk** search URL and export Danish homes for sale, rentals, or foreclosure auctions as clean JSON, CSV, or Excel. Each row carries the asking price, DKK per m², public valuation, energy label, rooms, GPS, photos, and the estate agent's name, phone, email, CVR, and rating. On top of that you get every price cut since the home was listed, how many people viewed and saved the listing, the next open house, and the building's heating and roof from BBR. Pagination, deduplication, and filtering are handled for you.

| Input | Rows emitted |
|---|---|
| Municipality page `/kommune/koebenhavn/tilsalg` | One row per home for sale in that municipality |
| City page `/by/aarhus-c/tilsalg` | One row per home in that city |
| Zip-code page `/postnummer/2100/tilsalg` | One row per home in that zip code |
| All of Denmark `/tilsalg` | Every home for sale on Boligsiden (40,000+) |
| Any of the above with types or prices, e.g. `/tilsalg/villa,raekkehus?priceMax=5000000` | Only the matching homes |
| Rentals `/lejeboliger` (with `/kommune/`, `/by/` or `/postnummer/`) | One row per rental: rent, deposit, move-in date, pets |
| Foreclosure auctions `/tvangsauktioner` (optionally `/kommune/aarhus` or `/landsdel/fyn`) | One row per auction: court, date, bids, lawyer, case documents |

> Pure HTTP against Boligsiden's own JSON API. No browser, no proxy, no third-party unblocking service.

### How it works

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-boligsiden.png)

1. The actor reads the location (`/kommune/`, `/by/` or `/postnummer/`), the property types after `/tilsalg/`, and any `priceMin`, `priceMax`, `areaMin`, `areaMax` from your `startUrl`. Input fields override the URL.
2. It queries `api.boligsiden.dk/search/cases`, 200 homes per page, in the sort order you pick, and skips duplicate case IDs.
3. For each home it reads the listing timeline (opening price and every price change) and the listing's view, click and favourite counts, 10 at a time.
4. Boligsiden serves at most 10,000 results per search. When a search matches more and you ask for more, the actor splits it into asking-price bands that each fit, so a whole-Denmark run can return every listing.
5. Each home is flattened into a clean row, with the full source record nested under `raw`, and saved to the dataset.

A run of 500 fully enriched homes takes about 10 seconds.

### Why use this scraper

- **Clean, flat rows.** Address, price, DKK/m², rooms, energy label, GPS, and agent contact as top-level fields, ready for a spreadsheet.
- **Agent lead lists.** Every row has the estate agency's name, phone, email, CVR number, chain, website, and its seller and buyer rating on Boligsiden.
- **Price-cut history.** `originalPrice`, every asking-price change with date and percent, and `totalDaysOnMarket` across relistings. Sort by biggest or most recent price drop.
- **Demand signal.** Page views, clicks to the agent's site, and favourites for every listing.
- **Scheduled monitoring.** `onlyNewListings` returns only homes your search has not seen before, so a daily run is a clean new-listings feed.
- **Rentals and foreclosures too.** Switch `listingType` (or paste a `/lejeboliger` or `/tvangsauktioner` URL) for rental listings with rent, deposit, and move-in date, or for every Danish foreclosure auction with court, minimum bid, highest bid, and links to the case documents.
- **Real filters.** Municipality (one or several), city, zip code, 15 property types, price band, and size band, from the URL or from input fields.
- **No 10,000-result ceiling.** Large searches are split by price automatically.
- **Cheap runs.** No proxy and no browser, so compute cost stays low.

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrl` | string | yes | Boligsiden search URL with `/tilsalg` in the path. Default: Copenhagen municipality. |
| `listingType` | string | no | `auto` (from the URL, default), `forSale`, `rentals`, `foreclosures`. |
| `municipality` | string | no | Municipality slug, e.g. `koebenhavn`, `aarhus`. Several: `odense,aalborg`. Replaces the URL's location. |
| `propertyTypes` | string\[] | no | Any of `villa`, `condo`, `terraced house`, `villa apartment`, `holiday house`, `cooperative`, `farm`, `hobby farm`, `full year plot`, `holiday plot`, `houseboat`, `cattle farm`, `pig farm`, `plant farm`, `forest`. Replaces the URL's types. |
| `priceMin` / `priceMax` | integer | no | DKK band: asking price (for sale), monthly rent (rentals), or public valuation (foreclosures). |
| `areaMin` / `areaMax` | integer | no | Living area band in m². |
| `roomsMin` / `roomsMax` / `petsAllowed` | integer / boolean | no | Rentals only. |
| `sortBy` | string | no | `default`, `newest`, `longestOnMarket`, `priceLow`, `priceHigh`, `sqmPriceLow`, `sqmPriceHigh`, `biggestPriceDrop`, `latestPriceDrop`. |
| `includePriceHistory` | boolean | no | Opening price and every price change. Default `true`. |
| `includeListingStats` | boolean | no | Page views, agent-site clicks, favourites. Default `true`. |
| `onlyNewListings` | boolean | no | Skip listings this search returned in earlier runs. Works for all three listing types. Default `false`. |
| `maxItems` | integer | no | 1 to 50,000. Default 100. Free plan: 5 per run. |
| `proxy` | object | no | Not needed. Set it only if your runs get blocked. |

Danish type slugs in URLs map as Boligsiden maps them: `villa`, `ejerlejlighed` (condo), `raekkehus` (terraced house), `villalejlighed`, `fritidsbolig` (holiday house), `andelsbolig` (cooperative), `landejendom` (farm and hobby farm), `helaarsgrund`, `fritidsgrund`, `husbaad`.

#### Example input

```json
{
  "startUrl": "https://www.boligsiden.dk/kommune/aarhus/tilsalg/villa,raekkehus",
  "priceMax": 5000000,
  "areaMin": 100,
  "sortBy": "biggestPriceDrop",
  "maxItems": 500
}
```

### Output schema

Every row has a `listingType` of `forSale`, `rentals`, or `foreclosures`. The Output tab has a table view for each.

#### Homes for sale (`listingType: "forSale"`)

Sample (trimmed):

```json
{
  "caseId": "016da6bb-9e6e-46aa-8f34-fdeaa4525a53",
  "url": "https://www.boligsiden.dk/cases/016da6bb-9e6e-46aa-8f34-fdeaa4525a53",
  "address": "Istedgade 88, 4., 1650 København V",
  "street": "Istedgade",
  "houseNumber": "88",
  "floor": "4",
  "zipCode": 1650,
  "city": "København V",
  "municipality": "København",
  "province": "Byen København",
  "propertyType": "condo",
  "askingPrice": 12750000,
  "originalPrice": 15995000,
  "priceChangePercentage": -20.29,
  "numberOfPriceChanges": 3,
  "lastPriceChangeDate": "2026-09-16T15:36:21.407593Z",
  "priceHistory": [
    {
      "date": "2026-05-14T10:03:28.311083Z",
      "price": 15995000,
      "type": "open",
      "changePercentage": null
    },
    {
      "date": "2026-06-03T07:43:25.448957Z",
      "price": 15295000,
      "type": "price_change",
      "changePercentage": -4.38
    },
    {
      "date": "2026-06-29T20:39:52.515866Z",
      "price": 13750000,
      "type": "price_change",
      "changePercentage": -10.1
    },
    {
      "date": "2026-09-16T15:36:21.407593Z",
      "price": 12750000,
      "type": "price_change",
      "changePercentage": -7.27
    }
  ],
  "pricePerSqm": 67460,
  "housingArea": 189,
  "numberOfRooms": 6,
  "yearBuilt": 1875,
  "energyLabel": "c",
  "latitude": 55.669266,
  "longitude": 12.553126,
  "daysOnMarket": 142,
  "totalDaysOnMarket": 142,
  "pageViews": 4172,
  "agentSiteClicks": 3062,
  "favourites": 91,
  "openHouseDate": "2026-10-04T10:00:00Z",
  "openHouseSignUpUrl": "https://www.nybolig.dk/services/redirect/case/N260362/N2603620000644",
  "publicValuation": 4000000,
  "downPayment": 640000,
  "monthlyExpense": 8234,
  "grossMortgageMonthly": 71242,
  "heating": "Fjernvarme/blokvarme",
  "roofingMaterial": "Tegl",
  "councilTaxPercentage": 23.5,
  "imageUrl": "https://images.boligsiden.dk/images/case/016da6bb-9e6e-46aa-8f34-fdeaa4525a53/1440x960/752420df-43b2-49dc-83bb-451178ee8831.webp",
  "externalUrl": "https://www.nybolig.dk/services/redirect/case/N260362/N2603620000644",
  "realtorName": "Nybolig Vesterbro - Enghave Plads",
  "realtorPhone": "33889400",
  "realtorEmail": "1670@nybolig.dk",
  "realtorCvr": "42442690",
  "realtorBranch": "Nybolig",
  "realtorRating": 9.18,
  "realtorRatingCount": 11,
  "realtorBuyerRating": 7.71,
  "status": "open",
  "raw": {
    "...": "full Boligsiden case record"
  }
}
```

#### Rentals (`listingType: "rentals"`)

Rentals share the for-sale columns (address, size, rooms, GPS, photos, agent, BBR, views) and add rent fields. `askingPrice` and `pricePerSqm` are `null`.

```json
{
  "listingType": "rentals",
  "caseId": "52ada1cd-dd1a-44d5-8bcc-6eaa601879f1",
  "url": "https://www.boligsiden.dk/cases/52ada1cd-dd1a-44d5-8bcc-6eaa601879f1",
  "address": "Hans Knudsens Plads 1A, 4. 7, 2100 København Ø",
  "zipCode": 2100,
  "city": "København Ø",
  "municipality": "København",
  "propertyType": "condo",
  "monthlyRent": 9500,
  "deposit": 28500,
  "prepaidRent": 9500,
  "utilitiesMonthly": 550,
  "rentPerSqmYear": 3257,
  "housingArea": 35,
  "numberOfRooms": 1,
  "energyLabel": "a2015",
  "availableFrom": "2026-11-01",
  "petsAllowed": false,
  "daysOnMarket": 1,
  "pageViews": 29,
  "favourites": 0,
  "realtorName": "home Sydhavnen & Projektsalg",
  "realtorPhone": "33330305",
  "realtorEmail": "177@home.dk",
  "imageUrl": "https://images.boligsiden.dk/images/case/52ada1cd-dd1a-44d5-8bcc-6eaa601879f1/1440x960/a227bd47-ad6c-4cb3-92af-014ee5b05619.webp",
  "status": "open",
  "raw": {
    "...": "full Boligsiden rental record"
  }
}
```

#### Foreclosure auctions (`listingType: "foreclosures"`)

```json
{
  "listingType": "foreclosures",
  "foreclosureId": "696edb3b-6a9d-4599-8b9c-077b7837199e",
  "url": "https://www.boligsiden.dk/tvangsauktioner/adresse/havnegade-6-5610-assens?id=696edb3b-6a9d-4599-8b9c-077b7837199e",
  "address": "Havnegade 6, 5610 Assens",
  "zipCode": 5610,
  "city": "Assens",
  "municipality": "Assens",
  "propertyType": "villa",
  "status": "2. auktion",
  "auctionDate": "2026-10-06T07:00:00Z",
  "auctionCourt": "Retten i Odense",
  "auctionAddress": "Albanigade 30, 5000 Odense",
  "viewingDate": "2026-10-05T11:00:00Z",
  "publicValuation": 1374000,
  "valuatedBid": 1374000,
  "highestBid": 1,
  "securityAmount": 268673,
  "livingArea": 176,
  "lotArea": 410,
  "numberOfRooms": 5,
  "yearBuilt": 1880,
  "claimant": "Nordea Kredit Realkreditaktieselskab",
  "lawFirm": "Njord Law Firm",
  "lawyerName": "Bettina Erringsø",
  "contactPhone": "…",
  "contactEmail": "…",
  "courtCaseNumber": "AS 209/2026",
  "statstidendeNumber": "S09092026-78",
  "cadastralNumbers": [
    "605c, Assens Bygrunde"
  ],
  "documents": [
    {
      "name": "Salgsopstilling",
      "url": "https://tvang.boligsiden.dk/api/public/document-download/8ebc3d8d-fbf8-4b73-8462-26a18cc4770d"
    },
    {
      "name": "Salgsopstilling uden bilag",
      "url": "https://tvang.boligsiden.dk/api/public/document-download/72d07784-9a21-416a-b51f-fb51ce208772"
    }
  ],
  "description": "Ejendom i 1,5 plan i Assens by tæt på skole, butikker, havnemiljø mm. Tinglyst grundareal 410 m², heraf vej 0 m². Boliga…",
  "raw": {
    "...": "full foreclosure record"
  }
}
```

#### Key output fields

| Field | Meaning |
|---|---|
| `askingPrice` | Asking price in DKK |
| `pricePerSqm` | DKK per m² of living area |
| `housingArea` / `lotArea` | Living area and plot size in m² |
| `energyLabel` | Danish energy label, `a2020` to `g` |
| `publicValuation` | Latest public property valuation in DKK, when published |
| `downPayment` / `monthlyExpense` | Required down payment and monthly owner cost in DKK |
| `daysOnMarket` / `totalDaysOnMarket` | Days on market now, and in total including earlier listings of the same home |
| `originalPrice` / `priceChangePercentage` | First asking price and the change since, negative for a cut |
| `priceHistory` | Every listing event: opened, price change (with percent), closed |
| `pageViews` / `agentSiteClicks` / `favourites` | How many people viewed, clicked through, and saved the listing on Boligsiden |
| `openHouseDate` / `openHouseSignUpUrl` | Next open house and its sign-up link, when scheduled |
| `grossMortgageMonthly` / `netMortgageMonthly` | Monthly mortgage cost before and after tax deduction, as listed |
| `heating` / `roofingMaterial` / `externalWallMaterial` / `yearRenovated` | Main building from BBR (roof material flags asbestos-containing fibre cement) |
| `floorPlanImages` | Floor-plan images, when the agent uploaded them |
| `province` / `councilTaxPercentage` / `landValueTaxPerThousand` | Region and municipal tax rates |
| `cooperative` | Co-op details for andelsbolig listings: max price, association debt, allocation |
| `images` | Up to 5 photo URLs at 1440×960 |
| `externalUrl` | The listing on the estate agent's own website |
| `realtorPhone` / `realtorEmail` / `realtorCvr` | Agency contact and Danish company number |
| `realtorRating` / `realtorBuyerRating` | Agency's seller and buyer rating on Boligsiden, 0 to 10 |
| `saleHistory` | Earlier recorded sales of the address, with price and date |
| `buildings` | Building records for the address (BBR) |
| `monthlyRent` / `deposit` / `prepaidRent` / `utilitiesMonthly` | Rentals: monthly rent, deposit, prepaid rent, and utilities on account, in DKK |
| `rentPerSqmYear` / `availableFrom` / `petsAllowed` / `maxRentalMonths` | Rentals: yearly rent per m², move-in date, pet policy, and maximum rental period |
| `auctionDate` / `auctionCourt` / `auctionAddress` / `status` | Foreclosures: when and where the auction is held, and which round |
| `valuatedBid` / `highestBid` / `securityAmount` | Foreclosures: the court's valuation bid, highest bid so far, and security a bidder must provide |
| `viewingDate` / `claimant` / `lawyerName` / `documents` | Foreclosures: viewing time, who forces the sale, the lawyer handling it, and links to the case documents (sales statement, land registry, valuation) |
| `raw` | The full source record from Boligsiden's API |

### What makes this richer than the competition

Compared with Boligsiden actors that take only a search URL and a result limit:

| Capability | URL-only actors | This actor |
|---|---|---|
| Search URL input | Yes | Yes, including city, zip-code, and type-slug URLs |
| Filters as input fields | No | Municipality, 15 property types, price, size |
| More than 10,000 results | Not documented | Auto-split by price, up to 50,000 |
| Price-cut history | No | Opening price plus every change with date |
| Views, clicks, favourites | No | Yes |
| Sort order | No | 9 options, incl. biggest and latest price drop |
| New-listings-only mode | No | Yes, for scheduled runs |
| Rentals | No | Rent, deposit, move-in date, pets, rent per m² |
| Foreclosure auctions | No | Court, date, bids, lawyer, case documents |

### Pricing

**From $0.5 per 1,000 homes.** You pay for each listing saved to the dataset, plus a small per-run start fee. The per-listing price drops with your Apify plan tier. See the **Pricing** tab for the exact rates.

| Event | When |
|---|---|
| Actor start | Once per run |
| Listing | Each home saved to the dataset |

The run stops on its own when your maximum cost per run is reached.

### Use cases

- Track asking prices and DKK/m² across municipalities and property types.
- Build estate-agent lead lists with phone, email, and CVR.
- Compare energy labels, public valuations, and days on market.
- Watch new listings in an area on a daily schedule.
- Feed a spreadsheet, CRM, or pricing model without copying ads by hand.
- Compare rents and rent per m² across Copenhagen, Aarhus, or any zip code.
- Track every upcoming foreclosure auction with court date, minimum bid, and the lawyer to call.

### Notes & limitations

- Covers homes for sale, rentals, and foreclosure auctions. Sold-home records are not a separate mode; each for-sale row carries the address's past sales in `saleHistory`.
- Rentals have no price history (Boligsiden's rental timeline tracks the deposit) and support the `newest`, `priceLow`, and `priceHigh` sort options only.
- Foreclosures: Boligsiden lists around 100 auctions nationwide at any time, so every run reads them all and applies your filters. Case documents and lawyer contact are present on roughly a quarter of auctions, when the lawyer published them on Boligsiden.
- `descriptionBody` is the roughly 500-character teaser Boligsiden publishes. The full ad text is on the agent's site at `externalUrl`.
- Boligsiden publishes up to 5 photos per listing, so `images` holds at most 5.
- Unknown property types are skipped with a warning instead of failing the run.
- With more than 10,000 matches the search is read in price bands, so `sortBy` orders listings within each band.
- `onlyNewListings` remembers listings per search (location, types, price, size). Change any filter and it starts fresh.

### FAQ

**What URLs work?** Any Boligsiden.dk homes-for-sale page (municipality, city, zip code, region, or the national `/tilsalg` page, with or without type and price filters), any `/lejeboliger` rental page, and any `/tvangsauktioner` foreclosure page.

**Can I scrape rentals or foreclosure auctions?** Yes. Paste a `/lejeboliger` or `/tvangsauktioner` URL, or set `listingType` to `rentals` or `foreclosures`. Rent, deposit, and room filters work for rentals; location, type, valuation, and size filters work for foreclosures.

**How many listings can I pull?** Up to 50,000 per run. Searches over 10,000 results are split by price automatically.

**Why am I only getting 5 results?** The free Apify plan caps each run at 5 listings. Upgrade to a paid plan to use your full `maxItems`.

**Can I get only new listings every day?** Yes. Schedule the actor with `onlyNewListings: true` and `sortBy: "newest"`. Each run returns only homes that search has not returned before.

**How do I find price cuts?** Set `sortBy` to `biggestPriceDrop` or `latestPriceDrop`. Each row's `priceHistory` lists every change with its date.

**Do I get the agent's contact details?** Yes. Every row has the agency's name, phone, email, CVR, chain, website, and rating when Boligsiden lists them.

**Is it legal to scrape Boligsiden?** This actor collects public listing information. You are responsible for complying with Boligsiden's terms and applicable law, including GDPR for agent contact data. See [Apify's legality guide](https://blog.apify.com/is-web-scraping-legal).

### Support

Issues, feature requests, or questions? Use the **Issues** tab on this actor's page.

### Additional services

Need custom fields, a scheduled feed, an integration, or a scraper for another Danish property site? Open an issue on this actor's page to ask about custom work.

### Explore more scrapers

Browse the [Apify Store](https://apify.com/store/categories/real-estate) for more real-estate scrapers.

### 🤖 For AI Agents & LLM Apps

**Purpose:** Danish homes for sale, rentals, and foreclosure auctions from Boligsiden.dk, one row per listing, with price or rent, size, energy label, GPS, and agent or lawyer contact.

**Minimal input:**

```json
{ "startUrl": "https://www.boligsiden.dk/kommune/koebenhavn/tilsalg", "maxItems": 50 }
```

**Listing type:** `listingType` = `forSale` (default), `rentals`, or `foreclosures`; or detected from a `/tilsalg`, `/lejeboliger`, or `/tvangsauktioner` URL. Rentals add `monthlyRent`, `deposit`, `prepaidRent`, `utilitiesMonthly`, `rentPerSqmYear`, `availableFrom`, `petsAllowed`, `maxRentalMonths`, `landlordName`. Foreclosure rows have their own shape: `foreclosureId`, `url`, `address`, `auctionDate`, `auctionCourt`, `auctionAddress`, `status`, `publicValuation`, `valuatedBid`, `highestBid`, `securityAmount`, `viewingDate`, `claimant`, `lawFirm`, `lawyerName`, `contactPhone`, `contactEmail`, `courtCaseNumber`, `statstidendeNumber`, `documents`, `description`.

**Filters:** `municipality` (slug, comma-separated for several), `propertyTypes` (enum list), `priceMin`/`priceMax` (DKK), `areaMin`/`areaMax` (m²). They override the URL. `sortBy` (e.g. `newest`, `biggestPriceDrop`), `onlyNewListings` for scheduled feeds, `includePriceHistory` and `includeListingStats` (both default true).

**Output fields:** `caseId`, `url`, `address`, `street`, `houseNumber`, `floor`, `door`, `zipCode`, `city`, `municipality`, `propertyType`, `askingPrice`, `pricePerSqm`, `housingArea`, `lotArea`, `numberOfRooms`, `numberOfBathrooms`, `numberOfToilets`, `numberOfFloors`, `yearBuilt`, `energyLabel`, `hasBalcony`, `hasElevator`, `hasTerrace`, `latitude`, `longitude`, `daysOnMarket`, `totalDaysOnMarket`, `priceChangePercentage`, `isNewOnBoligsiden`, `originalPrice`, `numberOfPriceChanges`, `lastPriceChangeDate`, `priceHistory`, `pageViews`, `agentSiteClicks`, `favourites`, `openHouseDate`, `openHouseDurationMinutes`, `openHouseSignUpUrl`, `publicValuation`, `downPayment`, `monthlyExpense`, `grossMortgageMonthly`, `netMortgageMonthly`, `utilitiesConnectionFee`, `weightedArea`, `basementArea`, `province`, `placeName`, `bfeNumber`, `councilTaxPercentage`, `landValueTaxPerThousand`, `heating`, `roofingMaterial`, `externalWallMaterial`, `yearRenovated`, `floorPlanImages`, `floorPlanUrl`, `cooperative`, `descriptionTitle`, `descriptionBody`, `imageUrl`, `images`, `externalUrl`, `realtorName`, `realtorPhone`, `realtorEmail`, `realtorCvr`, `realtorBranch`, `realtorUrl`, `realtorRating`, `realtorRatingCount`, `realtorBuyerRating`, `realtorEmployees`, `saleHistory`, `buildings`, `status`, `raw`.

**Behavior:** prices in DKK, areas in m², missing values are `null`. Billed per saved listing plus a start fee; the run stops at the caller's max cost. Free plan returns 5 rows. About 10 seconds per 500 rows.

### ⚠️ Disclaimer

Not affiliated with Boligsiden or the estate agents whose listings appear in the data. This actor collects publicly available listing information only. You are responsible for complying with Boligsiden's terms and applicable laws, including data-protection law for any personal data. Read more: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal)

### SEO Keywords

Boligsiden scraper, Boligsiden.dk scraper, Boligsiden price drops, prisfald bolig, Boligsiden lejeboliger, Danish rentals, lejebolig København, rental apartments Denmark, tvangsauktioner, Danish foreclosure auctions, tvangsauktion scraper, Statstidende auctions, new listings Denmark, open house Denmark, åbent hus, Danish homes for sale, Denmark real estate data, Danish property listings export, boliger til salg, Copenhagen apartments for sale, Aarhus villas, Odense houses, Denmark house prices, DKK per square meter, energy label Denmark, public valuation, ejendomsvurdering, estate agent phone email CVR, ejendomsmægler leads, real estate lead generation Denmark, JSON CSV Excel export

# Actor input Schema

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

Boligsiden.dk search URL copied from your browser. Homes for sale: /kommune/koebenhavn/tilsalg, /by/aarhus-c/tilsalg, /postnummer/2100/tilsalg or /tilsalg for all of Denmark, optionally with type slugs (/tilsalg/villa,raekkehus) and priceMin/priceMax/areaMin/areaMax query parameters. Rentals: any /lejeboliger URL. Foreclosure auctions: /tvangsauktioner or /tvangsauktioner/kommune/aarhus/kort. /landsdel/<region> paths also work. The fields below override what the URL carries. Default: Copenhagen homes for sale.

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

What to scrape. 'auto' (default) reads it from startUrl: /tilsalg = homes for sale, /lejeboliger = rentals, /tvangsauktioner = foreclosure auctions. Pick a value to override the URL.

## `municipality` (type: `string`):

Municipality slug as it appears in Boligsiden URLs, e.g. koebenhavn, aarhus, odense, aalborg, frederiksberg. Separate several with commas (odense,aalborg). When set, it replaces the location in startUrl. Leave empty to use the URL's location.

## `propertyTypes` (type: `array`):

Only return these property types. Pick one or more; leave empty for all types (or for the types in startUrl). When set, it replaces the types in startUrl.

## `priceMin` (type: `integer`):

Lowest price in DKK. Homes for sale: asking price, e.g. 2000000. Rentals: monthly rent, e.g. 6000. Foreclosures: public valuation. Overrides the URL. Leave empty for no lower bound.

## `priceMax` (type: `integer`):

Highest price in DKK. Homes for sale: asking price, e.g. 5000000. Rentals: monthly rent, e.g. 12000. Foreclosures: public valuation. Overrides the URL. Leave empty for no upper bound.

## `areaMin` (type: `integer`):

Smallest living area in square meters, e.g. 60. Overrides areaMin in startUrl. Leave empty for no lower bound.

## `areaMax` (type: `integer`):

Largest living area in square meters, e.g. 150. Overrides areaMax in startUrl. Leave empty for no upper bound.

## `roomsMin` (type: `integer`):

Rentals only: fewest rooms, e.g. 2. Ignored for homes for sale and foreclosures.

## `roomsMax` (type: `integer`):

Rentals only: most rooms, e.g. 4. Ignored for homes for sale and foreclosures.

## `petsAllowed` (type: `boolean`):

Rentals only: when checked, return only rentals that allow pets. Leave unchecked for all rentals.

## `sortBy` (type: `string`):

Order in which listings are read. Homes for sale support every option. Rentals support newest, priceLow and priceHigh (by rent). Foreclosures support newest, priceLow and priceHigh (by valuation) and otherwise list the soonest auction first. With more than 10,000 homes for sale the order applies within each price band. Default: Boligsiden's own order.

## `includePriceHistory` (type: `boolean`):

Homes for sale: adds originalPrice, numberOfPriceChanges, lastPriceChangeDate and priceHistory (every asking-price change with date and percent). One extra request per listing. Not used for rentals or foreclosures. Default: true.

## `includeListingStats` (type: `boolean`):

Homes for sale and rentals: adds pageViews, agentSiteClicks and favourites, how many people viewed, clicked through and saved the listing on Boligsiden. One extra request per listing. Default: true.

## `onlyNewListings` (type: `boolean`):

Skip listings this same search already returned in earlier runs, so a daily schedule outputs only fresh homes, rentals or auctions. Seen IDs are kept in the key-value store 'boligsiden-seen-listings' in your account. The first run returns everything up to maxItems. Default: false.

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

Maximum number of listings to save, 1 to 50000. Default 100. Searches with more than 10,000 matches are split by price automatically, so the full limit is reachable. Free Apify plan: 5 listings per run.

## `proxy` (type: `object`):

Optional. The actor reaches Boligsiden directly without a proxy, which is the default and the cheapest option. Set Apify Proxy or your own proxy URLs only if your runs get blocked.

## Actor input object example

```json
{
  "startUrl": "https://www.boligsiden.dk/kommune/koebenhavn/tilsalg",
  "listingType": "auto",
  "sortBy": "default",
  "includePriceHistory": true,
  "includeListingStats": true,
  "onlyNewListings": false,
  "maxItems": 100,
  "proxy": {}
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped property listings in the default dataset.

# 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.boligsiden.dk/kommune/koebenhavn/tilsalg",
    "maxItems": 100,
    "proxy": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "startUrl": "https://www.boligsiden.dk/kommune/koebenhavn/tilsalg",
    "maxItems": 100,
    "proxy": {},
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/boligsiden-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 '{
  "startUrl": "https://www.boligsiden.dk/kommune/koebenhavn/tilsalg",
  "maxItems": 100,
  "proxy": {}
}' |
apify call memo23/boligsiden-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/boligsiden-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/iaw820LTEcfObXoTp/builds/1iazvRUCOP9hi7eMa/openapi.json
