Boliga.dk Scraper
Pricing
from $1.50 / 1,000 results
Boliga.dk Scraper
Scrape real estate listings from Boliga.dk — Denmark's leading property portal with 30,000+ active listings. Returns price (DKK), area (m²), rooms, municipality, GPS coordinates, property type, energy rating and listing date for sale listings.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share

Extract structured property listings from Boliga.dk — Denmark's leading real estate portal. Filter by property type, municipality, and price range. No API key or account required.
Why this scraper?
🏠 Complete listing data in one run
Get every key field per listing — address, price, size, rooms, build year, energy class, agent name, publish date, and coordinates — without needing a Boliga account or API contract.
🗺️ Flexible geographic targeting
Filter by Danish municipality code (e.g. 101 for Copenhagen, 751 for Aarhus, 461 for Odense) or paste a Boliga search URL directly as a startUrl to replicate any filter combination from the site.
🏷️ Nine property types supported
Villa, apartment, townhouse, bungalow, farm, holiday home, allotment house, co-housing, and cooperative — select one or leave empty to scrape all types.
💶 Price range filtering
Set minimum and/or maximum asking price in DKK to target a specific segment of the market.
🔍 Optional detail enrichment
Enable fetchDetails to add premium image sets, estate agent homepage URLs, and the direct agency listing page per property.
📅 Max listing age filter
Use daysOld to restrict results to recently published listings — ideal for daily monitoring runs or alerting pipelines.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
transaction | String | sale | Transaction type. Currently only sale is supported. |
propertyType | String | (all) | Filter by property type: villa, apartment, townhouse, bungalow, farm, holiday, allotment, cohousing, cooperative. Leave empty for all types. |
municipalityId | Integer | (none) | Danish municipality code. E.g. 101 = Copenhagen, 751 = Aarhus, 461 = Odense, 147 = Frederiksberg, 630 = Vejle. |
minPrice | Integer | (none) | Minimum asking price in DKK. |
maxPrice | Integer | (none) | Maximum asking price in DKK. |
daysOld | Integer | (none) | Only return listings published within the last N days. |
fetchDetails | Boolean | false | Fetch the detail page per listing to retrieve premium images, estate URL, and full agent info. Slower and slightly higher cost. |
maxItems | Integer | 100 | Maximum number of listings to return. Boliga's API caps results at 300 per filtered query; use narrower filters (e.g. by municipality or price range) to access larger result sets. |
startUrls | Array | [] | Paste one or more Boliga.dk search result URLs. Filter parameters (municipality, property type, price) are parsed directly from the URL query string and take precedence over individual inputs above. |
Output schema
Always present
| Field | Type | Description |
|---|---|---|
id | String | Boliga internal listing ID. |
url | String | Full URL to the listing page on boliga.dk. |
operationType | String | Always sale in the current version. |
propertyType | String | Human-readable property type label (e.g. Villa, Apartment). |
title | String | Auto-generated title combining property type, rooms, and size (e.g. Villa, 5 rooms, 140 m²). |
priceText | String | Formatted asking price string in Danish locale (e.g. DKK 3.495.000). |
priceAmount | Integer | Asking price as a plain number in DKK. |
priceCurrency | String | Always DKK. |
squaremeterPrice | Integer|null | Price per m² in DKK. Null if not provided by the API. |
downPayment | Integer|null | Required down payment in DKK. Null if not provided. |
monthlyExpenses | Integer|null | Estimated monthly net expenses in DKK. Null if not available. |
street | String|null | Street address including house number. |
city | String | City name. |
zipCode | String|null | Danish postal code. |
municipality | String|null | Municipality name. |
country | String | Always DK. |
latitude | Float|null | GPS latitude. |
longitude | Float|null | GPS longitude. |
bedrooms | Integer|null | Number of rooms (Boliga does not distinguish rooms from bedrooms). |
bathrooms | null | Not available from Boliga — always null. |
surfaceTotal | Integer|null | Living area in m². |
lotAreaM2 | Integer|null | Lot/land area in m². Present for villas and farms. |
basementM2 | Integer|null | Basement area in m². Null if no basement or not reported. |
surfaceUnit | String | Always m². |
buildYear | Integer|null | Year the property was built. |
energyClass | String|null | Danish energy rating label (A–G). |
floor | Integer|null | Floor number. Relevant for apartments and co-housing. |
features | Array | List of notable features derived from available fields (e.g. ["Energy class B", "Built 1965", "Floor 2"]). |
daysForSale | Integer|null | Number of days the listing has been active on boliga.dk. |
images | Array | List of image URLs. At least one thumbnail is always present. |
agencyName | String|null | Name of the estate agency handling the listing. |
agencyUrl | null | Not available without fetchDetails. |
estateUrl | null | Not available without fetchDetails. |
publishDate | String|null | Publish date in YYYY-MM-DD format. |
publishDateISO | String|null | Full ISO 8601 publish timestamp. |
source | String | Always boliga.dk. |
scrapedAt | String | ISO 8601 timestamp of when the item was scraped. |
contentHash | String | 16-character MD5 hash of id + priceAmount + surfaceTotal. Use for change detection across runs. |
With fetchDetails: true
| Field | Type | Description |
|---|---|---|
images | Array | Replaced with the full premium image set from the detail page (higher resolution, more images). |
agencyUrl | String|null | Estate agency homepage URL. |
estateUrl | String|null | Direct URL to the listing on the agency's own website. |
Example output record
{"id": "4217893","url": "https://www.boliga.dk/bolig/4217893/roskildevej-45","operationType": "sale","propertyType": "Villa","title": "Villa, 5 rooms, 147 m²","priceText": "DKK 3.495.000","priceAmount": 3495000,"priceCurrency": "DKK","squaremeterPrice": 23776,"downPayment": 349500,"monthlyExpenses": 9840,"street": "Roskildevej 45","city": "Roskilde","zipCode": "4000","municipality": "Roskilde","country": "DK","latitude": 55.6423,"longitude": 12.0852,"bedrooms": 5,"bathrooms": null,"surfaceTotal": 147,"lotAreaM2": 620,"basementM2": null,"surfaceUnit": "m²","buildYear": 1967,"energyClass": "C","floor": null,"features": ["Energy class C", "Built 1967"],"daysForSale": 12,"images": ["https://i.boliga.org/dk/800x/4217/4217893.jpg"],"agencyName": "EDC Roskilde","agencyUrl": null,"estateUrl": null,"publishDate": "2026-05-27","publishDateISO": "2026-05-27T08:14:00.000Z","source": "boliga.dk","scrapedAt": "2026-06-07T10:22:41.153Z","contentHash": "a3f9c12b8d1e4f7a"}
Examples
Apartments in Copenhagen under DKK 3,000,000:
{"propertyType": "apartment","municipalityId": 101,"maxPrice": 3000000,"maxItems": 200}
Villas for sale in Aarhus — recent listings only:
{"propertyType": "villa","municipalityId": 751,"daysOld": 14,"maxItems": 100}
Using a Boliga search URL directly (startUrls mode):
{"startUrls": [{ "url": "https://www.boliga.dk/resultat?salesTypeId=1&propertyType=2&municipality=147&priceMax=2500000" }],"maxItems": 50}
Daily feed — new listings across all property types in Odense:
{"municipalityId": 461,"daysOld": 1,"maxItems": 500}
💰 Pricing
$1.50 per 1,000 results — you only pay for successfully retrieved listings. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.50 |
| 10,000 | ~$15.00 |
| 100,000 | ~$150.00 |
Flat-rate data subscription services typically charge $29–$149/month regardless of usage.
Use the Max items cap in the input to control your spend exactly.
Performance
| Run size | Approx. time | Memory |
|---|---|---|
| 100 listings | ~30 seconds | 256 MB |
| 500 listings | ~2–3 minutes | 256 MB |
| 1,000 listings (1 query) | ~4–5 minutes | 256 MB |
| 1,000 listings + fetchDetails | ~10–15 minutes | 256 MB |
Boliga's API caps each filtered query at approximately 300 results. For larger extractions, combine multiple queries (different municipalities or property types) using startUrls.
Known limitations
- 300-result cap per query: Boliga's API returns a maximum of ~300 listings per unique filter combination. To extract more, split by municipality, property type, or price range and pass multiple search URLs via
startUrls. - Sale only: The
transactionfield currently supportssaleonly. Rental listings are not available via the same API endpoint. - No bathroom count: Boliga does not expose bathroom counts in its API response. The
bathroomsfield is always null. - Municipality codes required: Geographic filtering requires the numeric municipality code, not a free-text city name. A full list of Danish municipality codes is available on the Danish Government's municipality page.
daysOldfilter is client-side: The scraper fetches pages in reverse-chronological order and stops whendaysForSaleexceeds the limit. On very active markets, this is efficient; on quiet ones, a few extra pages may be fetched before the cutoff is reached.
Technical details
- Source: boliga.dk — Denmark's largest property portal
- Memory: 256 MB
- Retry: Automatic retry on network errors with exponential backoff, 3 attempts per request, Retry-After header respected
- Proxy: Danish residential proxy — required for Boliga's API (datacenter IPs are blocked)
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl