Boliga Scraper – Danish Real Estate Listings & Sold Prices avatar

Boliga Scraper – Danish Real Estate Listings & Sold Prices

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Boliga Scraper – Danish Real Estate Listings & Sold Prices

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

7

Monthly active users

4 days ago

Last modified

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 listingType input.
  • ✅ 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.dk search 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.

FieldTypeDescription
listingTypestringforSale (til salg) or sold (solgte boliger). Default forSale.
zipAreasarrayPick one or more Danish areas/cities from the dropdown (e.g. Copenhagen Ø, Aarhus C). Empty = all of Denmark.
zipCodesstringExtra Danish postal codes, comma-separated, e.g. "2100,2200,8000". Combined with zipAreas.
propertyTypesarrayDwelling type codes to include ("1"–"9"). Empty = all types. See the code map in Tips.
priceMin / priceMaxintegerPrice range in DKK.
roomsMin / roomsMaxintegerNumber-of-rooms range.
sizeMin / sizeMaxintegerLiving-area range in m².
buildYearMin / buildYearMaxintegerConstruction-year range.
soldYearMin / soldYearMaxintegerSale-year range — only used for sold runs; ignored for homes for sale.
startUrlsarrayAdvanced. Ready-made api.boliga.dk search URLs. When provided, these take priority and the filters above are ignored.
maxItemsintegerStop after collecting this many properties (0 = no limit). Recommended for sold searches, which can return hundreds of thousands of records.
proxyConfigurationobjectProxy 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

FieldDescription
listingTypeforSale or sold — which dataset this record came from.
idBoliga property ID (natural key, used for de-duplication).
urlDirect link to the property page on boliga.dk.
propertyTypeDanish dwelling type (Villa, Ejerlejlighed, Rækkehus, Andelsbolig, Fritidshus…).
propertyTypeCodeNumeric Boliga property-type code (1–10).
addressStreet address.
zipCodeDanish postal code.
cityCity / town.
municipalityCodeDanish municipality (kommune) code.
pricePrice in DKK — asking price for active listings, final sale price for sold homes.
squareMeterPricePrice per square meter (DKK/m²).
priceChangePercentTotal price change in %.
roomsNumber of rooms.
sizeLiving area in m².
lotSizeLot / land area in m² (present when available).
floorFloor the unit is on (present when available).
buildYearYear built.
energyClassEnergy label A–G (present when available; mainly on active listings).
basementSizeBasement area in m² (present when available).
daysForSaleDays on market — active listings only (null for sold).
isForeclosureForeclosure flag — active listings only (null for sold).
soldDateDate the property was sold (ISO YYYY-MM-DD) — sold records only.
salesTypeSale type — sold records only: Alm. Salg (regular), Fam. Salg (family), Auktion or Andet.
latitude / longitudeGPS coordinates.
guidBoliga's internal GUID for the property (present when available).
scrapedAtWhen 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 null when Boliga doesn't expose them: soldDate/salesType appear only on sold records, daysForSale/isForeclosure only on active listings, and lotSize, floor, basementSize, energyClass and guid appear 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/zipcodeTo range), then merges and de-duplicates everything into one dataset.
  • maxItems controls 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

  1. Open the actor on Apify Console and click Try for free.
  2. Choose a listing type — For sale (til salg) or Sold prices (solgte boliger).
  3. (Optional) target an area — pick areas/cities from the dropdown or add zip codes. Leave empty to cover all of Denmark.
  4. (Optional) add filters — property type, price, rooms, living area, build year, and (for sold homes) the sale year.
  5. Set Max items — cap the run (recommended, especially for sold prices).
  6. Click Start and watch results stream into your dataset.
  7. Export to JSON, CSV, Excel, XML or RSS, or pull the data via the Apify API.
  8. 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,8000 returns exactly the areas you care about and runs much faster than scraping all of Denmark.
  • 💰 For valuations, use sold + a recent soldYearMin. Recent comparable sales are the gold standard for estimating value — and check salesType to exclude Fam. Salg (family sales, often below market).
  • 🔢 Always set maxItems for 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.dk URL and drop it into startUrls — 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.

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.


Scraping real estate in other markets? Pair the Boliga scraper with these sibling property scrapers from the same author:


🔌 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. 🏠🇩🇰