Boliga Scraper – Danish Real Estate Listings & Sold Prices
Pricing
from $2.00 / 1,000 results
Boliga Scraper – Danish Real Estate Listings & Sold Prices
Boliga scraper & API for Danish real estate: search homes for sale and sold prices and export address, price, rooms, m2, lot, type, sale type, energy, days on market and coordinates. Denmark property and sold-price market data — fast, no login.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
7
Monthly active users
4 days ago
Last modified
Categories
Share
Boliga Scraper – Danish Real Estate Listings & Sold Prices (Solgte Boliger)
Extract active property listings and historical sold prices (solgte boliger / salgspriser) from Boliga.dk — Denmark's largest and most-used real estate marketplace. This Boliga scraper pulls clean, structured Boliga data as JSON, CSV, or Excel: prices in DKK, price per m², rooms, size, build year, energy class, addresses, GPS coordinates, sale dates and more. No login, no coding.
Export to JSON, CSV, Excel, or API.
🇩🇰 Built for Danish real-estate analysts, PropTech builders, mortgage & valuation teams, investors, brokers and journalists — anyone who needs reliable Boliga.dk listing and sold-price data on demand. It's the only Boliga scraper that covers BOTH homes for sale and the full sold-price history: sold prices (solgte boliger) are the single most valuable dataset on Boliga, covering the entire Danish market and going back decades.
🔎 Why scrape Boliga?
Boliga is one of Denmark's largest and most popular property platforms. Danes use it to browse homes for sale and — crucially — to look up what properties actually sold for. Boliga aggregates the entire Danish housing market and layers the official sold-price register on top of live listings, which makes it the single richest public source of Danish real-estate data.
Collecting this data by hand is painful. Boliga paginates results 50 at a time, the useful fields live inside its JSON API (not the HTML you see), and a nationwide sold-price history runs into hundreds of thousands of records. Copy-pasting addresses and prices into a spreadsheet does not scale and gives you nothing you can plug into a model. This Boliga scraper turns the whole platform into a clean, on-demand data feed instead — valuation-grade comparables, market trends and lead lists in minutes, structured and de-duplicated.
Common reasons people scrape Boliga:
- 💰 Build automated valuation models (AVMs) and comparative market analyses (CMA) from real sold prices.
- 📊 Track Danish housing-market trends — price per m², days-on-market and sale prices by area over time.
- 🏦 Feed mortgage, risk and collateral valuation models with official sold-price data.
- 🏘️ Benchmark listings, monitor pricing in specific zip codes, and source deals or foreclosures.
- 🤖 Power PropTech apps, dashboards and AI models with fresh Boliga data.
- 🎯 Generate real-estate leads from new listings and under-priced properties.
✨ What this Boliga scraper does
- ✅ Two data modes in one actor — scrape homes currently for sale (til salg) or the full archive of sold prices (solgte boliger / salgspriser). Just flip the
listingTypeinput. - ✅ Sold prices (solgte boliger) included — final sale price, sale date, sale type (regular / family / auction), price per m² and price change. This is the money dataset most Boliga scrapers skip.
- ✅ Automatic pagination & de-duplication — the actor walks every page of the Boliga API and merges results into one clean dataset, returning hundreds to thousands of unique properties per run with zero duplicates (de-duplicated on the Boliga property
id). - ✅ Rich, structured fields — identity (
id,url,address,zipCode,city), pricing (price,squareMeterPrice,priceChangePercent), specs (rooms,size,lotSize,buildYear,energyClass,floor), classification (propertyType,municipalityCode), geo (latitude,longitude), and mode-specific fields (soldDate,salesType,daysForSale,isForeclosure). - ✅ Powerful targeting & filters — pick areas/cities from a dropdown, add any Danish zip codes, and filter by property type, price range (DKK), rooms, living area (m²), build year, and (for sold homes) the sale year.
- ✅ Start-URL mode — paste ready-made
api.boliga.dksearch URLs and the actor paginates them for you. - ✅ Fast & reliable — HTTP-only against Boliga's own JSON API through a Danish (DK) residential proxy, so runs are quick (hundreds of records in ~20–30 seconds) and resilient to rate-limits.
- ✅ Any export format — JSON, CSV, Excel, XML, RSS, or the Apify API.
🎯 Use cases
- 🏦 Real-estate investors & analysts — track sold prices across zip codes and cities to spot under- and over-valued areas, calculate yields, and time the market.
- 💼 PropTech & startups — power your app, valuation model or comparison site with fresh Danish housing data without building and maintaining a scraper.
- 📊 Market researchers & journalists — analyze price trends, days-on-market and price-per-m² by region, and how sale prices evolve over time.
- 🏘️ Agencies & brokers — benchmark listings against the competition and build automated CMA reports for clients.
- 🏦 Banks & mortgage lenders — feed official Danish sold-price data into risk and collateral valuation models.
- 🎯 Lead generation — surface new listings and foreclosure properties for outreach and deal sourcing.
- 🤖 Data products & AI — build training datasets and live feeds for real-estate ML models, chatbots and analytics dashboards.
📥 Input
Configure a run from the Apify Console UI or pass a JSON input via the API. Everything is optional — hit Start with an empty input and the actor returns a ready sample of up to 150 Danish properties so you can see the output shape instantly.
| Field | Type | Description |
|---|---|---|
listingType | string | forSale (til salg) or sold (solgte boliger). Default forSale. |
zipAreas | array | Pick one or more Danish areas/cities from the dropdown (e.g. Copenhagen Ø, Aarhus C). Empty = all of Denmark. |
zipCodes | string | Extra Danish postal codes, comma-separated, e.g. "2100,2200,8000". Combined with zipAreas. |
propertyTypes | array | Dwelling type codes to include ("1"–"9"). Empty = all types. See the code map in Tips. |
priceMin / priceMax | integer | Price range in DKK. |
roomsMin / roomsMax | integer | Number-of-rooms range. |
sizeMin / sizeMax | integer | Living-area range in m². |
buildYearMin / buildYearMax | integer | Construction-year range. |
soldYearMin / soldYearMax | integer | Sale-year range — only used for sold runs; ignored for homes for sale. |
startUrls | array | Advanced. Ready-made api.boliga.dk search URLs. When provided, these take priority and the filters above are ignored. |
maxItems | integer | Stop after collecting this many properties (0 = no limit). Recommended for sold searches, which can return hundreds of thousands of records. |
proxyConfiguration | object | Proxy settings. Defaults to a Danish (DK) residential proxy, which gives the most reliable results. |
Example input — villas & apartments for sale in Copenhagen
{"listingType": "forSale","zipAreas": ["2100", "2200", "2300"],"propertyTypes": ["1", "3"],"priceMax": 8000000,"maxItems": 400,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "DK"}}
Example input — sold prices in Aarhus since 2023 💰
{"listingType": "sold","zipAreas": ["8000", "8200"],"soldYearMin": 2023,"maxItems": 500}
Example input — all homes for sale under 3,000,000 DKK nationwide
{"listingType": "forSale","priceMax": 3000000,"maxItems": 1000}
Example input — a ready-made Boliga API URL
{"startUrls": [{ "url": "https://api.boliga.dk/api/v2/sold/search/results?zipcodeFrom=2100&zipcodeTo=2100&propertyType=3" }],"maxItems": 300}
📤 Output
Each property is saved as one clean JSON record in your dataset. The examples below are real records from a fresh verification run.
An active listing (forSale):
{"listingType": "forSale","id": "2353911","url": "https://www.boliga.dk/bolig/2353911","propertyType": "Villa","propertyTypeCode": 1,"address": "Ved Grænsen 26","zipCode": "2000","city": "Frederiksberg","municipalityCode": 147,"price": 10750000,"squareMeterPrice": 107500,"priceChangePercent": -6,"rooms": 4,"size": 100,"lotSize": 399,"floor": null,"buildYear": 1915,"energyClass": "E","basementSize": 35,"daysForSale": 95,"isForeclosure": false,"soldDate": null,"salesType": null,"latitude": 55.68379,"longitude": 12.49919,"guid": "A8655DA2-45D3-4CEC-BC8A-3690FB211EEB","scrapedAt": "2026-11-01T23:29:34.898Z"}
A sold apartment (sold):
{"listingType": "sold","id": "1062099617","url": "https://www.boliga.dk/bolig/1062099617","propertyType": "Ejerlejlighed","propertyTypeCode": 3,"address": "Jette Tikjøbs Plads 5, st.","zipCode": "8000","city": "Aarhus C","municipalityCode": 751,"price": 1783200,"squareMeterPrice": 31284,"priceChangePercent": 0,"rooms": 2,"size": 57,"lotSize": null,"floor": null,"buildYear": 2017,"energyClass": null,"basementSize": null,"daysForSale": null,"isForeclosure": null,"soldDate": "2026-10-26","salesType": "Fam. Salg","latitude": 56.167065,"longitude": 10.2278,"guid": "CAC07A06-FC8C-4918-BDE9-58842CDB679D","scrapedAt": "2026-11-01T23:30:45.936Z"}
Output field reference
| Field | Description |
|---|---|
listingType | forSale or sold — which dataset this record came from. |
id | Boliga property ID (natural key, used for de-duplication). |
url | Direct link to the property page on boliga.dk. |
propertyType | Danish dwelling type (Villa, Ejerlejlighed, Rækkehus, Andelsbolig, Fritidshus…). |
propertyTypeCode | Numeric Boliga property-type code (1–10). |
address | Street address. |
zipCode | Danish postal code. |
city | City / town. |
municipalityCode | Danish municipality (kommune) code. |
price | Price in DKK — asking price for active listings, final sale price for sold homes. |
squareMeterPrice | Price per square meter (DKK/m²). |
priceChangePercent | Total price change in %. |
rooms | Number of rooms. |
size | Living area in m². |
lotSize | Lot / land area in m² (present when available). |
floor | Floor the unit is on (present when available). |
buildYear | Year built. |
energyClass | Energy label A–G (present when available; mainly on active listings). |
basementSize | Basement area in m² (present when available). |
daysForSale | Days on market — active listings only (null for sold). |
isForeclosure | Foreclosure flag — active listings only (null for sold). |
soldDate | Date the property was sold (ISO YYYY-MM-DD) — sold records only. |
salesType | Sale type — sold records only: Alm. Salg (regular), Fam. Salg (family), Auktion or Andet. |
latitude / longitude | GPS coordinates. |
guid | Boliga's internal GUID for the property (present when available). |
scrapedAt | When the record was collected (ISO 8601 timestamp). |
Honest note on coverage: the identity, pricing, spec and geo fields above populate on essentially every record (core fields hit ~100% in verification). Some fields are mode- or data-dependent and will be
nullwhen Boliga doesn't expose them:soldDate/salesTypeappear only on sold records,daysForSale/isForeclosureonly on active listings, andlotSize,floor,basementSize,energyClassandguidappear when available (energy class and lot/basement data are much more common on for-sale listings than on sold records).
🔁 Pagination & scale
The Boliga scraper paginates the Boliga API automatically. It requests results in pages of 50, reads the reported total page count from the API response (meta.totalPages) and keeps advancing — page 1, 2, 3 … — until it reaches the last page, an empty page, or your maxItems limit, whichever comes first. You never configure page numbers yourself.
- Large, de-duplicated result sets — a single run routinely returns hundreds to thousands of properties, de-duplicated on the Boliga property
id(with an address + price + sold-date fallback) so you never get the same home twice across pages. - Sold prices go very deep — Denmark's sold-price archive (solgte boliger) spans decades and can contain hundreds of thousands of records nationwide. Always set
maxItems, or narrow by zip code and sale year, to keep runs fast and focused. - Multiple zip codes — for sold searches the actor seeds one paginated search per zip code (the sold endpoint filters by a
zipcodeFrom/zipcodeTorange), then merges and de-duplicates everything into one dataset. maxItemscontrols the ceiling — set it to cap the run (0= no limit). Leave everything empty and the actor returns a ready sample of up to 150 Danish properties so you can preview the output instantly.
⚙️ How to use
- Open the actor on Apify Console and click Try for free.
- Choose a listing type — For sale (til salg) or Sold prices (solgte boliger).
- (Optional) target an area — pick areas/cities from the dropdown or add zip codes. Leave empty to cover all of Denmark.
- (Optional) add filters — property type, price, rooms, living area, build year, and (for sold homes) the sale year.
- Set Max items — cap the run (recommended, especially for sold prices).
- Click Start and watch results stream into your dataset.
- Export to JSON, CSV, Excel, XML or RSS, or pull the data via the Apify API.
- Automate — run on a Schedule, or connect the output to Make, Zapier, Google Sheets, Slack, email or a webhook.
Programmatic run via the API:
curl -X POST "https://api.apify.com/v2/acts/haketa~boliga-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{ "listingType": "sold", "zipAreas": ["2100"], "soldYearMin": 2023, "maxItems": 300 }'
💡 Tips
- 📍 Narrow with zip codes. Targeting
2100,8000returns exactly the areas you care about and runs much faster than scraping all of Denmark. - 💰 For valuations, use
sold+ a recentsoldYearMin. Recent comparable sales are the gold standard for estimating value — and checksalesTypeto excludeFam. Salg(family sales, often below market). - 🔢 Always set
maxItemsfor sold searches. Denmark's sold-price archive is enormous; a nationwide sold search without a limit can run for a very long time. - 🎯 Combine filters (price + rooms + size + build year) to zero in on exactly the segment you care about.
- 🏷️ Property type codes:
1= Villa,2= Rækkehus (townhouse),3= Ejerlejlighed (apartment),4= Fritidshus (vacation home),5= Andelsbolig (cooperative),6= Landejendom (country property),7= Helårsgrund (year-round plot),8= Fritidsgrund (vacation plot),9= Villalejlighed (villa apartment). - 🔗 Reuse Boliga URLs. Build a search on boliga.dk, grab the matching
api.boliga.dkURL and drop it intostartUrls— the actor will paginate it for you.
❓ FAQ
Does this scraper get sold prices (solgte boliger)?
Yes — and that's its biggest advantage. Set listingType to sold to scrape Boliga's archive of Danish sale prices, including the sale date, sale type and price change. Most other Boliga scrapers only cover active listings.
Is it legal to scrape Boliga?
This actor only collects publicly available data from Boliga's own public JSON API — the same information any visitor can see on boliga.dk, no login required. As with any scraping, use the data responsibly and in line with Boliga's terms and applicable law.
How many results can I get, and how fast?
As many as you need — hundreds to thousands per run. In a fresh verification run the actor returned 400 for-sale listings in about 26 seconds and 300+ sold records in about 20 seconds, both with 0 duplicates and ~100% coverage on the core fields. Use maxItems to cap larger runs.
Do I need proxies or a login?
No login is ever required. Boliga rate-limits direct traffic, so the actor uses a Danish (DK) residential proxy by default for the most reliable results — it's already pre-configured, so you can just hit Start.
What's the difference between the sale types?
Alm. Salg is a regular open-market sale, Fam. Salg is a family sale (often below market value), and Auktion is a forced/auction sale. The salesType field tells you which one each sold record is — important when using sold prices for valuation.
What export formats are available?
JSON, CSV, Excel, XML, RSS, or programmatically via the Apify API. The dataset also has a clean tabular overview view.
Is there a Boliga API, and how fresh is the data?
This actor is effectively a ready-made Boliga API: it reads Boliga's own public JSON endpoints (api.boliga.dk) live on every run, so the listings and sold prices are as fresh as Boliga itself. Run it on a Schedule to keep your own dataset continuously up to date.
Can I filter by property type, price or area?
Yes. Filter by property type, price range in DKK, rooms, living area in m², build year, zip code / city, and — for sold homes — the sale year. Combine any of these to target exactly the segment you need.
Can I scrape the whole of Denmark at once?
Yes — leave the zip/area fields empty. For sold prices this is a very large dataset, so set maxItems or split by zip code and sale year to keep runs focused.
Can I run this on a schedule or get alerts for new listings?
Yes. Use Apify Schedules to run the scraper daily or weekly, and combine it with webhooks, Make, Zapier, Slack or email to get notified whenever new properties match your criteria.
🔗 Related scrapers
Scraping real estate in other markets? Pair the Boliga scraper with these sibling property scrapers from the same author:
- 🇮🇱 Yad2 Scraper — Israel's #1 real estate & classifieds marketplace.
- 🇧🇷 ZAP Imóveis Scraper — Brazilian property listings with prices and specs.
- 🇨🇦 Realtor.ca Scraper — Canadian homes for sale and MLS listing data.
- 🇦🇺 Domain.com.au Scraper — Australian real estate listings and sold prices.
- 🇩🇪 ImmobilienScout24 Scraper — Germany's leading property portal.
- 🇮🇪 Daft.ie Scraper — Irish property listings for sale and to rent.
🔌 Integrations
Works seamlessly with the Apify ecosystem: API, Webhooks, Make / Zapier, and Google Sheets, Slack & email. Results download as JSON, CSV, Excel, XML or RSS at any time.
Ready to scrape Boliga.dk? Hit Start and get clean Danish listings and sold prices in seconds. 🏠🇩🇰