Booli Scraper - Sweden Property Listings & Sold Prices
Pricing
from $2.63 / 1,000 property searches
Booli Scraper - Sweden Property Listings & Sold Prices
Scrape Booli.se: homes for sale plus the full slutpriser archive — asking and sold prices, area, rooms, fee, agency and price changes, in Swedish.
Pricing
from $2.63 / 1,000 property searches
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Booli Scraper - Sweden Property Listings & Sold Prices 🚀
🎉 Every Booli.se home for sale, plus the full sold-price archive, with asking and final prices on the same rows
Built for analysts valuing Swedish housing, agencies watching their stock, and anyone done copying prices out of a browser by hand
🔎 What is the Booli Sweden Property Scraper — and when should you use it?
The Booli Sweden Property Scraper turns Booli.se homes for sale and the sold-price archive, for any Swedish area into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: Swedish property rows from Booli.se: asking prices on homes for sale, final registered sold prices with the asking-price difference, area, rooms, living area, monthly fee, plot size, coordinates, agency and Booli's own estimate. Counties and municipalities resolve by name; finer areas via a pasted search URL.
Use something else when: the property data you need is not on Booli.se. Use Hemnet Scraper for Sweden's market leader, asking and sold prices with broker contacts. Use Boligsiden Scraper for Denmark's valuation-led portal, listing and sold prices. Use Finn.no Scraper for Norway's property market, listings and prices. This actor covers the two search surfaces Booli publishes — bostäder till salu (homes for sale, including snart till salu) and slutpriser (final registered sale prices built on lagfarter from Lantmäteriet). Full advert text and complete photo sets live on each listing's own page and are not part of the search rows; Booli Pro statistics and the broker-comparison tools are separate Booli products and out of scope.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/booli-property-scraper
Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want Booli.se property rows and prices for any Swedish area using the Apify Actor `sian.agency/booli-property-scraper`.Use it when I need: Swedish property rows from Booli.se: asking prices on homes for sale, final registered sold prices with the asking-price difference, area, rooms, living area, monthly fee, plot size, coordinates, agency and Booli's own estimate. Counties and municipalities resolve by name; finer areas via a pasted search URL.Don't use it when: the property data you need is not on Booli.se — use hemnet-property-scraper or boligsiden-property-scraper or finn-no-property-scraper instead.How to call it: give `locations` a list of Swedish municipalities or counties (Motala kommun, Stockholms län) or paste Booli search addresses into `searchUrls`; pick the `operation` (search for homes for sale, sold for the slutpriser archive); set `objectTypes`, price, room or living-area bounds and `maxResults` to narrow it.Start with this input:{"operation": "sold","locations": ["Motala kommun","Vasastan, Stockholm"],"objectTypes": ["Lägenhet","Villa"],"maxResults": 200}Ask me which Swedish areas to cover, whether the buyer wants homes currently for sale or the sold-price archive, and how many results the run should stop at, then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Pull every sold villa in Motala kommun with the final price, the asking price and the percentage between them.
- List apartments for sale in Vasastan, Stockholm under 6 million kr with the monthly fee and the agency name.
- Show homes coming to market (snart till salu) in Göteborg with coordinates, newest first.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/booli-property-scraper.md.
📋 Overview
The actor pages Booli's own search results exactly the way the site does, filtered and de-duplicated. It stops the moment your row budget is reached. You are charged per returned result, never per page fetched, and results your filters exclude are never saved and never billed.
| Operation | What it returns | Typical rows per page |
|---|---|---|
| 🔍 Property Search | Homes for sale with asking price, facts, agency and estimate | 35 |
| 🧾 Sold Prices (Slutpriser) | Final registered prices with asking-price comparison | 35 |
✨ Features
- Both surfaces, one actor: asking prices and the sold archive under one run and one bill.
- Any Swedish area: every municipality and county resolves by name; numeric area ids and pasted search URLs reach the finer areas.
- Booli's own property-type filter, with exactly the six values the site offers.
- Filtered rows never bill — price, rooms and living-area bounds are applied before anything is saved.
- The pre-market backlog as a switch: "only coming to market" (snart till salu) isolates supply that has not formally hit the market yet.
- Coordinates on every row, so mapping is a join rather than a geocoding project.
- Structured output: numbers as numbers, dates as dates, identical in the dataset, the exports and the run report.
- Nothing to configure — no proxy picker, no area-id archaeology. Press Start.
🎬 Quick Start
- Open the actor and press Start. The default run reads current homes for sale across all of Sweden and stops at 100 rows.
- Watch the log: each page prints how many results matched, how many were saved, and what was charged.
- Export the dataset as JSON, CSV or Excel.
report.htmlin the key-value store holds the human summary.
🚀 Getting Started (3 Simple Steps)
Step 1: Choose your areas
Type them the way Swedes do — Sverige, Stockholms län, Motala kommun. All 290 municipalities and all 21 counties resolve by name, and the log prints the exact match it picked, area id included, so nothing is silently guessed. For an area finer than a municipality (a district like Vasastan), or for byte-exact control, paste the address of the Booli search you built in your browser into Search URLs — the area, the surface (till salu or slutpriser) and the property type ride in the URL.
Step 2: Pick the surface and the filters
operation decides the question: Property Search for homes on the market, Sold Prices (Slutpriser) for what they actually went for. Then narrow by property type, price band, rooms, living area, new construction, or "coming to market" only. Filtered-out results cost nothing.
Step 3: Press Start, then export
The run pages Booli until your maxResults budget is hit or the search runs out. Download the dataset, or hand the API example below to your pipeline.
📥 Input Configuration
| Field | Type | Default | What it does |
|---|---|---|---|
| 🎯 Operation | select | 🔍 Property Search | Property Search or Sold Prices (Slutpriser) |
| 📍 Areas in Sweden | list | (empty = all Sweden) | Free-text area names, Booli area ids, or a mix; each resolves against Booli's own suggestions |
| 🌐 Booli search URLs | list | (empty) | Pasted booli.se search addresses, read verbatim — page numbers in them are ignored |
| 🏠 Property types | multi-select | (all) | Booli's own six values: Lägenhet, Villa, Kedjehus-Parhus-Radhus, Fritidshus, Gård, Tomt/Mark |
| 🔢 Max results | integer | 100 | Whole-run budget across all areas |
| 💵 Min / 💰 Max price (kr) | integer | 0 | Asking price on search rows, final price on sold rows |
| 🛏️ Min / 🚪 Max rooms | integer | 0 | Results stating no room count are dropped while a bound is set |
| 📐 Min / 📏 Max living area (m²) | integer | 0 | Same rule as rooms |
| 🏗️ Only new construction | boolean | off | Booli's own nyproduktion flag |
| ⏳ Only coming to market | boolean | off | Booli's snart till salu flag — the pre-market backlog |
📤 Output
Every row carries the fields below (empty rather than guessed when Booli does not publish a value). The exact set is declared in the actor's dataset schema, so the Output tab renders typed, sortable columns.
| Field | Type | On which rows | Meaning |
|---|---|---|---|
booliId | string | all | Booli's own id — stable join key |
url | string | all | The listing's Booli address |
streetAddress | string | all | Street address as Booli shows it |
objectType | string | all | Lägenhet, Villa, Radhus, Fritidshus, Gård, Tomt, … |
listPrice / listPriceText | number / string | all | Asking price (number + display string) |
soldPrice / soldPriceText | number / string | sold | Final registered price |
soldPriceDiffPct / soldPriceDiffText | number / string | sold | Sold vs asking, e.g. −8.3 |
soldPriceType | string | sold | How the price arose — Sista bud, Slutpris, … verbatim |
soldDate | date | sold | Registration date |
listSqmPrice | number | most | Price per m² |
listPriceDiffPct | number | search | Booli's asking-price change flag |
estimatePrice | number | search | Booli Värdering, where the listing carries one |
rooms, livingArea, additionalArea, plotArea | number | all | The facts on the card |
rent | number | apartments | Monthly fee (avgift) |
tenureForm | string | all | Äganderätt, Bostadsrätt, … |
isNewConstruction, upcomingSale, biddingOpen | boolean | search | Booli's own flags |
publishedAt, daysActive | date / number | search | Market freshness |
nextShowing | string | search | Next viewing, as Booli words it |
descriptiveAreaName, municipality | string | all | Where it is |
latitude, longitude | number | all | Coordinates |
agencyName, agencyUrl, agencyThumbnail | string | search | The agency behind the listing |
amenities, thumbnailUrl, photoCount | array / string / number | all | Card facts |
searchedLocation, searchUrl | string | all | Which of your inputs produced the row |
💼 Use Cases & Examples
1. Sold-price comps and valuation
Sold Prices for a municipality puts final price against asking price on every row: the uplift percentage Swedish valuation actually runs on. Median it by property type and you have a comps engine, not a scrape.
2. Asking-price market studies
Price per square metre, stock mix across property types, fee burden per apartment — one run per area, coordinates included, ready for the pivot table.
3. Pre-market sourcing
"Only coming to market" turns Booli's snart till salu backlog into a feed: supply before the bidding, on a schedule, and billed per row.
4. Agency lead generation
Group a municipality by agencyName and you can see who holds the stock and where: the shortlist a brokerage scout or a prop-tech sales team actually works from.
5. New-listing monitoring
Schedule an area, keep the booliIds you have seen, and yesterday's diff is today's run. publishedAt and daysActive do the dating for you.
6. Price-cut and bid tracking
listPriceDiffPct and biddingOpen come straight off Booli's cards. Those are the two signals buyers wait for, and you never hold your own price history to compute them.
🔗 Integration Examples
JavaScript/Node.js
import { Actor } from 'apify';const run = await Actor.call('sian.agency/booli-property-scraper', {operation: 'sold',locations: ['Motala kommun'],objectTypes: ['Villa'],maxResults: 200,}, { memoryMbytes: 512, budgetUsd: 0.5 });const { items } = await Actor.dataset(run.defaultDatasetId).getData();for (const row of items) {console.log(row.streetAddress, row.soldPrice, 'vs asking', row.listPrice, `(${row.soldPriceDiffPct}%)`);}
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("sian.agency/booli-property-scraper").call(run_input={"operation": "search","locations": ["Vasastan, Stockholm"],"objectTypes": ["Lägenhet"],"maxPrice": 6000000,"maxResults": 300,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["streetAddress"], item["listPrice"], item["rent"], item["agencyName"])
cURL
curl -X POST "https://api.apify.com/v2/acts/sian.agency~booli-property-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"operation": "sold","locations": ["Motala kommun", "Vasastan, Stockholm"],"objectTypes": ["Lägenhet", "Villa"],"maxResults": 200}'
Automation Workflows (N8N / Zapier / Make)
This actor is an Apify actor, so it plugs into any automation platform that can call an HTTP API:
- N8N — use the Apify node (or an HTTP Request node against the Run Actor endpoint above) to schedule area sweeps and pipe rows into Google Sheets, Airtable or a database.
- Zapier / Make — trigger on a schedule, run the actor, iterate the dataset items, route each row wherever your business needs it.
- Cron + API — the run-sync-get-dataset-items endpoint returns the dataset inline, so a scheduled curl is a complete pipeline.
📊 Performance & Pricing
Measured on the live portal: 35 results per page, roughly 1.5–3 s per page, prices and facts read from the structured data Booli embeds in its own pages.
FREE Tier (Try It Now)
- 25 results per run, every operation available
- Same data quality as paid — nothing held back
PAID Tier (Production Ready)
- $2.99 per 1,000 results on the Bronze tier, falling to $2.63 at Gold
- $0.005 per run start, a fraction of a cent per scheduled run
- Per-result billing: a filtered-out or unmatched input costs nothing
| Volume | Approximate cost |
|---|---|
| 1,000 results | ~$0.003 |
| 10,000 results | ~$0.03 |
| 100,000 results | ~$0.30 (Gold rates below that) |
❓ FAQ
Do I need a proxy or an unlocker key for this?
No. Booli.se blocks plain datacentre requests, and the actor handles the route itself, the same way a browser in Sweden gets the pages. There is no proxy setting because which proxy to use is our cost decision, not something you should have to know.
Will the Swedish text and prices come through correctly?
Yes. The actor reads the structured data Booli embeds in its own pages, so prices arrive as numbers in kronor, dates as dates, and every Swedish name — areas, agencies, streets — arrives exactly as Booli publishes it.
What areas can I search?
Every municipality and county in Sweden resolves by name, and numeric area ids cover whatever finer area you need. For a district, or for exact control, paste a Booli search address into Search URLs — the log shows the exact match for every name.
What is the difference between the two operations?
Property Search reads homes currently for sale: asking price, facts, agency and Booli's estimate. Sold Prices reads the slutpriser archive: final registered prices with the asking price and the percentage between them, built on lagfarter from Lantmäteriet. Same areas, same row budget, two different questions.
How many results can one search return?
Booli serves 35 results per page and keeps paging while the search has more; the all-Sweden listing search alone covers tens of thousands of homes. For national work, split by area or property type. Each is its own search with its own budget.
Are sold prices for every sale in Sweden?
No. The archive covers sales with a registered deed (lagfart) published through Lantmäteriet. That is the great majority of arm's-length sales, but not every transfer, and the newest registrations lag completion by a few weeks.
What does the Booli estimate field contain?
Booli's automated valuation (Booli Värdering) on the listings that carry one. Where Booli shows none, the field stays empty rather than guessed.
Can I get the full advert text and every photo?
Not in this version. The rows carry what Booli's search pages carry, including the first photos. Full advert text and complete photo sets are a natural next operation; ask and it moves up the roadmap.
🛠️ Troubleshooting
| Symptom | Fix |
|---|---|
| "matched no area in Booli's own suggestions" | Check the spelling, or go one level broader — the municipality rather than the district. A pasted search URL always works. |
| A run returns fewer rows than you asked for | The row budget, the FREE-tier cap or your own filters stopped it. The log names which one, on every page. |
| "Booli.se declined the request" on an input | The site throttled that moment. Re-run the input; it already retried five times before giving up. |
| A row has an empty field | Booli does not publish that value for that property (plots carry no living area, sold rows carry no agency). Empty means unknown, never zero. |
| Rows missing after filtering | Filters never bill and never save a row they exclude — lower the bound to see them again. |
⚖️ Legal
Booli and booli.se are trademarks of Booli Search Technologies AB (SBAB). This actor is not affiliated with, endorsed by, or sponsored by Booli, SBAB or Lantmäteriet. It reads publicly available listing data at run time; prices, photos and listing text belong to the agency or owner who published them, and a listing can be edited or withdrawn by its author at any time. Sold prices build on registered deeds (lagfarter) that Booli attributes to Lantmäteriet.
💬 Support
- 🐛 Issues and feature requests: Issues tab
- ⭐ If the actor saved you an afternoon: leave a 5-star review
- 🏠 More SIÁN scrapers: sian.agency on Apify
🔗 More SIÁN scrapers
- Hemnet Scraper: Sweden's market leader, asking and sold prices with broker contacts
- Boligsiden Scraper: Denmark, listing and sold prices
- Finn.no Scraper: Norway's property market
⭐ Using Booli Scraper? Leave a 5-star review — it keeps the actor maintained. Bugs or feature ideas? Open an issue on the Issues tab.