# Blocket Scraper: Ads, Prices, Cars and Counties (`automation_craft/blocket-scraper`) Actor

Blocket.se ads in Sweden: the marketplace and 17 vehicle types (bil, MC, båt) by keyword, category, län, dealer, plate or VIN, split past Blocket's 10,000 ad reach, no login. Rows: pris, märke, modell, miltal in mil and km, besiktning, Privat or Företag. Pay per result; price summary by län; API.

- **URL**: https://apify.com/automation_craft/blocket-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### Blocket Scraper: Ads, Prices, Cars and Counties

**Blocket scraper** for Sweden's largest marketplace: search Blocket's marketplace (general goods: furniture, electronics, clothes,
children's things and every other category) and its vehicles (cars, motorcycles, mopeds, ATVs, snowmobiles, boats, boat berths,
caravans, motorhomes, trucks, buses, construction and farm machinery, A-tractors) by keyword, category, county or municipality, map
radius, Blocket's own filters, a dealer, a plate or VIN, a pasted Blocket link or an ad id, and get every ad as one row: title, price in
SEK, place and county, map point, photos, private seller or company, and on vehicles make, model, model year, mileage in Swedish mil
and in km, fuel, gearbox and the vehicle type's own facts. Every search also gives a free price summary of the ads it met, by county
and by category or make. Add the ad page for the full description, every key fact, inspection dates, owners, equipment and the shop
or dealer card, and on vehicles Blocket's own list of similar vehicles and a market valuation from the asking prices of comparable ads.
No login, no cookies.

Who uses it: car, MC, boat and caravan dealers watching other dealers' stock and prices, resellers and recommerce shops pricing
second hand goods, importers and exporters looking for vehicles to buy, valuation, finance and insurance teams checking market prices
by county, analysts of Sweden's used goods and used car markets, and teams feeding Blocket data into their own sheets, apps or AI
agents.

### Quick start

1. Open the **Input** tab. In **What to search** pick `Marketplace (general goods)`, `Vehicles (cars, MC, boats and more)` or both.
2. Add **Keywords** (`soffa`, `iphone 15`, `barnvagn`), **Marketplace categories** by Blocket's Swedish name (`Möbler och
   inredning`, `Soffor`, `Mobiltelefoner`) or **Vehicle types** (cars are the default), and **Places** (`Stockholm`, `Göteborg`,
   `Skåne`).
3. Narrow it with Blocket's filters: price, seller (`Privat` or `Företag`), condition, ad type, brand, shipping; on vehicles
   **Makes** and **Models**, model year, mileage in mil, **Fuel**, **Gearbox**, **Body or type**, **Equipment** (`Dragkrok` for a
   towbar) and the type's own filters. Or give **Dealer ids**, **Plates to look up**, **VINs to look up**, or paste Blocket links into
   **Search links** and **Ad links or Blocket ad ids**.
4. Turn on **Include the ad page (Ad details)** for the full ad, and on vehicles **Add similar vehicles (add-on)** or **Add a market
   valuation (add-on)** if you want them. Set **Maximum rows** and click **Start**. Download the rows as JSON, CSV or Excel, or read
   them through the Apify API.

The prefilled input reads 20 sofas (`soffa`) in Stockholm from the marketplace: 20 Listing events and 1 Results page, $0.0172 at Gold
and $0.0222 on the Free plan with the start fee (8 seconds on a test run of 2026-10-24). For a daily feed, schedule the run in Apify
(set **Posted within (hours)** to 24) and keep the ad ids you have seen in your own sheet or flow: this Actor keeps no memory between
runs.

### What you get

One row per ad (`type: "listing"`, `vertical: "marketplace"` or `"vehicles"`), one free coverage row per search with its price
summary (`type: "search"`), free status rows for anything that could not be delivered (`type: "status"`) and a run summary
(`type: "summary"`). Every price is in Swedish kronor (`currency: "SEK"`). A field Blocket does not show for an ad is `null`.

#### Fill rates measured

The share of delivered rows that carry each field, from the test runs of 2026-10-24 (build 0.1.4: 27,615 marketplace, search row rows, 70 marketplace, ad details rows, 9,395 vehicles, search row rows, 424 vehicles, ad details rows). The vehicle search rows are mostly boats (8,303 of the 9,395, from one run over every boat), which carry no model, mileage or gearbox on Blocket; a private seller's plate and VIN are counted with personal data off, so they appear only on dealers' rows and on runs with **Include personal data** on. "n/a": not a field of that row.

| Field | Marketplace, search row | Marketplace, Ad details | Vehicles, search row | Vehicles, Ad details |
|---|---|---|---|---|
| `price` | 100% | 99% | 100% | 100% |
| `county` | 100% | 100% | 100% | 100% |
| `municipality` | 57% | 66% | 64% | 82% |
| `latitude` | 100% | 100% | 100% | 100% |
| `imageUrl` | 99% | 100% | 99% | 98% |
| `sellerType` | 100% | 100% | 100% | 100% |
| `companyName` | under 1% | 14% | 62% | 68% |
| `brand` | 1% | 43% | n/a | n/a |
| `searchAttributes` | 1% | 44% | n/a | n/a |
| `description` | 0% | 100% | 0% | 98% |
| `condition` | 0% | 83% | 0% | 2% |
| `categoryPath` | 0% | 100% | n/a | n/a |
| `postalCode` | 0% | 100% | 0% | 100% |
| `make` | n/a | n/a | 100% | 100% |
| `model` | n/a | n/a | 11% | 100% |
| `year` | n/a | n/a | 100% | 100% |
| `mileageKm` | n/a | n/a | 11% | 97% |
| `fuel` | n/a | n/a | 65% | 100% |
| `transmission` | n/a | n/a | 11% | 98% |
| `priceExVat` | n/a | n/a | 3% | 17% |
| `plate` | n/a | n/a | 8% | 68% |
| `vin` | n/a | n/a | 7% | 64% |
| `powerHp` | n/a | n/a | 0% | 97% |
| `equipment` | n/a | n/a | 0% | 95% |
| `nextInspection` | n/a | n/a | 0% | 56% |
| `owners` | n/a | n/a | 0% | 54% |
| `dealer` | n/a | n/a | 0% | 68% |
| `companyOrgNumber` | 0% | 14% | 0% | 66% |
| `companyPhone` | 0% | 10% | 0% | 68% |

#### On every row

| Field | What it is |
|---|---|
| `adId`, `url`, `title` | Blocket's ad id (Annons-ID), the ad's link, its title as served |
| `price`, `currency` | the asking price as a number, in SEK |
| `location`, `municipality`, `county`, `countySource` | Blocket's place, the municipality (kommun) and the county (län) of the ad; `countySource` says whether the county came from Blocket's own municipality name (`blocketMunicipality`) or from the ad's map point (`mapPoint`) |
| `latitude`, `longitude`, `coordinateAccuracy` | the ad's map point (Blocket's placeholder point in the middle of Sweden is no place and is `null`) |
| `publishedAt`, `editedAt` | when Blocket published the ad, when it was last edited (ad page) |
| `sellerType`, `companyName`, `companyId`, `companyPageUrl` | `private` or `business`, the shop's or dealer's name, Blocket id and page on Blocket |
| `imageUrl`, `imageUrls`, `imageCount` | the main image, every image link, their count |
| `searchKey`, `searchLabel`, `position`, `detailsIncluded`, `scrapedAt` | the search the row came from, its place in the results, whether the ad page was read, the read time |

#### Marketplace rows

| Field | What it is |
|---|---|
| `tradeType`, `tradeTypeEnglish` | "Säljes" (for sale), "Bortskänkes" (given away) or "Köpes" (wanted), and in English |
| `brand`, `searchAttributes` | the brand Blocket shows on the search row, the search row's own attributes (size, memory ...) |
| `shippingAvailable`, `buyNow`, `sellerPaysShipping` | Blocket's shipping flags |
| `mainCategory`, `subCategory`, `category`, `categoryPath` | Blocket's category path (ad page) |
| `condition`, `conditionEnglish` | Blocket's condition grade ("Bra skick - varsamt använd"), and in English (ad page) |
| `description`, `descriptionText`, `attributes`, `postalCode` | the seller's text as served and as plain text, the ad's key facts, the postal code (ad page) |
| `companyOrgNumber`, `companyPhone`, `companyWebsite`, `companyAddress` | a shop's profile: organisation number, phone, website, address (ad page) |

#### Vehicle rows

| Field | What it is |
|---|---|
| `kind`, `vehicleKind`, `vehicleKindLabel` | the vehicle type you asked for (`car`, `mc`, `boat` ...), Blocket's view type and its label ("Cars (Bil)") |
| `make`, `model`, `modelSpecification`, `year` | make, model, model line, model year |
| `mileage`, `mileageUnit`, `mileageKm` | mileage as Blocket counts it (Swedish mil, `SCANDINAVIAN_MILE`) and in kilometres (10 km a mil) |
| `fuel`, `transmission`, `bodyType`, `wheelDrive`, `colour` | as Blocket names them, each with an English twin (`fuelEnglish`, `transmissionEnglish` ...) |
| `priceExVat`, `salesForm`, `monthlyPrice`, `leasing` | the price without VAT where Blocket gives it, "Begagnad bil till salu", "Ny bil till salu" or "Leasing", a lease's monthly price and terms |
| `plate`, `vin` | the registration number and VIN (a dealer's always; a private seller's only with **Include personal data** on) |
| `powerHp`, `engineVolume`, `seats`, `doors`, `weightKg`, `maxTrailerWeight`, `bootSizeLitres` | engine power, engine size, seats, doors, weight, towing weight, boot size (ad page) |
| `batteryCapacity`, `drivingRangeKm`, `chargingCosts` | battery, range and Blocket's running cost box of an electric car (ad page) |
| `firstRegistration`, `owners`, `lastInspection`, `nextInspection` | first registration, number of owners, the last and next inspection (besiktning) dates (ad page) |
| `equipment`, `knownDamages`, `damagesDetails`, `majorRepairs`, `hasLiens` | equipment list, the seller's own answers on damage, repairs and liens (ad page) |
| `boatClass`, `lengthFeet`, `widthCm`, `material`, `motorType`, `maxSpeedKnots`, `sleepers` | boat class, length, width, hull, engine, top speed, berths |
| `redFlags` | warning signs as evidence: the seller's own damage, repair and lien answers, and mentions in the title or description of export only, damage or a fault, a lease takeover, a driving ban, deregistration or a sale for parts, each with the phrase and the sentence around it (a mention is only a mention: "ingen skada" mentions damage too) |
| `daysOnMarket`, `searchAdsOnBlocket` | days since publication, Blocket's count of the search the row came from |
| `dealer` | the dealer card (below), with the ad page |

#### The dealer card and the shop profile

With the ad page, every dealer ad carries `dealer`: Blocket's dealer id (`id`, the one **Dealer ids** takes), `name`, the Swedish
organisation number (`orgNumber`) with its company register link (`registryUrl`), `address`, `phone`, `email`, `website`, `logo`,
`description`, `openingHours`, `openingNow`, `authorizedBrands`, `memberAssociations` (such as "Medlem i Motorbranschens
Riksförbund"), `sellingPoints`, `yearsOnBlocket` (Blocket's own text, such as "5+ år på Blocket"), `pageUrl` and `adsUrl` (Blocket's
search of the dealer's ads). A marketplace shop's ad page fills the row's company fields (name, address, phone, website, organisation
number) and `companyPageUrl`. These are business data and always delivered. A sole trader's organisation number is its owner's
personal identity number, so it is withheld with **Include personal data** off (`companyOrgNumberIsPersonal` says which).

#### Example row

One dealer car of a test run of 2026-10-24 (the test actor's build 0.1.4) with the ad page, similar vehicles and the market valuation, trimmed to the
main fields (the full row has 190 keys):

```json
{
  "type": "listing", "vertical": "vehicles", "kind": "car",
  "adId": "27404675", "url": "https://www.blocket.se/mobility/item/27404675", "title": "Volvo V60",
  "make": "Volvo", "model": "V60", "year": 2022, "mileage": 15205, "mileageUnit": "SCANDINAVIAN_MILE", "mileageKm": 152050,
  "fuel": "Diesel", "fuelEnglish": "diesel", "transmission": "Automatisk", "transmissionEnglish": "automatic",
  "bodyType": "Kombi", "powerHp": 197, "price": 228700, "currency": "SEK", "salesForm": "Begagnad bil till salu",
  "location": "Helsingborg", "municipality": "Helsingborg", "county": "Skåne", "countySource": "blocketMunicipality",
  "latitude": 56.07521, "longitude": 12.72189, "publishedAt": "2026-10-24T07:01:52.000Z",
  "sellerType": "business", "companyName": "Kamux Helsingborg", "companyId": "4521087", "companyOrgNumber": "556897-5725",
  "companyPageUrl": "https://www.blocket.se/mobility/dealer/4521087/kamux-helsingborg",
  "plate": "FEZ86T", "vin": "YV1ZWK5VDN2469115",
  "dealer": {
    "id": "4521087", "name": "Kamux Helsingborg", "orgNumber": "556897-5725", "phone": "08-559 034 05",
    "email": "leads.helsingborg@kamux.se", "website": "https://www.kamux.se/stores/helsingborg",
    "address": "Bergavägen 6, 254 66 Helsingborg", "memberAssociations": ["Medlem i Motorbranschens Riksförbund"],
    "yearsOnBlocket": "5+ år på Blocket", "pageUrl": "https://www.blocket.se/mobility/dealer/4521087/kamux-helsingborg"
  },
  "redFlags": [],
  "marketValuation": {
    "comparables": 41, "currency": "SEK", "medianPrice": 317900, "p25Price": 289800, "p75Price": 349700,
    "priceVsMedianPercent": -28.1, "priceVsMedianSek": -89200, "confidence": "high", "adsInSearch": 687
  },
  "marketValuationStatus": "delivered", "similarVehiclesStatus": "delivered",
  "searchAdsOnBlocket": 2357, "scrapedAt": "2026-10-24T08:06:30.728Z"
}
```

#### The coverage row of each search, with its price summary (free)

Every search ends with one free row: Blocket's count of ads (`adsOnBlocket`), the filters sent (`filtersSent`), Blocket's order
(`order`), pages and rows read, distinct ads met (`distinctAdsMet`), ads delivered (`adsDelivered`), ads already delivered by an
earlier search of the run (`alreadyDelivered`), ads left out by a check (`filteredOut`, `filteredOutBy`), slices read past Blocket's
reach (`slicesRead`), ads that stayed beyond reach (`adsBeyondReach`), whether the search was read to its end (`complete`) and why it
stopped (`stoppedBy`).

Its `priceSummary` gives the count, lowest, quartiles (`p25`, `median`, `p75`), mean and highest asking price of the ads the search
met that passed every filter checked on the row (with ad pages read, a car weight range, the deal filter or the red flag filter
on, the ads delivered by that search, since only those were judged on their page or their valuation), the count of ads without a price (`withoutPrice`), and the same per county
(`byCounty`) and per category (`byCategory`, marketplace) or per make (`byMake`, vehicles), each part with its count, median, lowest,
highest and mean, largest first (at most 40 parts each). Each marketplace category you name is its own search, so asking for several
categories gives you prices by category and by county in one run. Turn it off with **Price summary per search**; it is free either way.

### Add-ons

#### Ad details (the ad page)

**Include the ad page (Ad details)** reads each ad's page and merges it into the row: the full description, every key fact and photo,
the category path, the postal code, the edit time, a shop's profile, and on vehicles the equipment, registration date, inspection
dates, owners, warranty, declared damages, leasing terms and the dealer card. It is billed as one Ad details per row that carries its
ad page and takes about a second per row. The ad page is always read (and billed) on an ad link, on a plate or VIN lookup and with
the similar vehicles add-on.

#### Similar vehicles list

**Add similar vehicles (add-on)** adds `similarVehicles`: Blocket's own list of vehicles like the ad (`adId`, `url`, `title`, the
year and mileage text as Blocket shows it, the price as served and as a number, `imageUrl`). It reads the ad page too.
`similarVehiclesStatus` says `delivered` or why the list is empty (`noData` when Blocket lists none, `notOffered`, `failed`,
`notRead`); only `delivered` is billed.

#### Market valuation and the deal filter

**Add a market valuation (add-on)** reads, for each vehicle chosen for delivery, Blocket's search of the same make and model one model
year either side, its newest 50 ads, and keeps only the other ads of exactly that make and model with a price; leasing ads are left
out (their price is a monthly payment). From those asking prices `marketValuation` gives the count (`comparables`), `medianPrice`,
`p25Price`, `p75Price`, `minPrice`, `maxPrice`, `meanPrice`, a `confidence` (high with 20 or more comparable ads, medium with 10 to
19, low below), Blocket's own count of that search (`adsInSearch`), five comparable ads to check by hand (`comparableSample`), the
`basis` in words, and how far this vehicle's price stands from the median (`priceVsMedianPercent`, `priceVsMedianSek`; empty on a
leasing ad, whose monthly price is not compared). It works on searches and on ad links alike. These are
asking prices, not sale prices. With fewer comparable ads than **Minimum comparable ads** (5 by default, up to 50), or a vehicle
without make, model or model year, there is no valuation and nothing is billed (`marketValuationStatus`: `noData` or `notOffered`).

The deal filter delivers only the vehicles you want to see: **Deal filter: at most this far from the median (%)** (`-10` for at least
10 percent under the market) or **(SEK)** (`-20000` for at least 20,000 kr under). **Leave out red flagged vehicles** drops every
vehicle whose row carries a red flag. Vehicles left out, or without a valuation while a deal filter is set, are free. Both judge
vehicles only, so a run that uses them reads vehicles only (a marketplace search next to them is refused, free).

#### Phone number (add-on)

**Add the phone number of business vehicle ads** reads, for each vehicle row delivered with its ad page, the number behind the ad's
call button, as Blocket gives it to a visitor who presses it (`phoneNumber`, for example `08-122 284 44`). Dealers and companies have
the button; it can show another number than the dealer card's `phone` (a tracked line). A private seller's ad has no button for
visitors (`phoneNumberStatus`: `notOffered`), and an ad Blocket gives no number for is `noData`; neither is billed. Measured on a test
run of 2026-10-24: 9 of 10 dealer cars carried a number.

### Plate and VIN lookups

**Plates to look up** and **VINs to look up** find the Blocket ad of each vehicle you name. Swedish plates such as `ABC123`, `ABC 123`
or `ABC12A` are sent in both forms Blocket's ads store them (with and without the space), 10 plates to one Blocket search; a
personalised plate (2 to 7 letters and digits holding a digit) and a VIN (11 to 17 letters and digits) are sent as typed, 20 to one
search, in each vehicle type you pick (cars when **Vehicle types** is empty), at most 300 plates and 300 VINs a run. Every vehicle
Blocket answers has its ad page read, and a row is delivered only when the ad carries the plate or VIN asked: on its ad page, or, on a
private car whose ad page shows no plate, on Blocket's search row, with the page's VIN equal to the search row's when both show one.
Each delivered row names the lookups it answers in `matchedLookups` (list and position, never the plate or VIN). Each search's
coverage row lists its lookups with `found` (`true`, `false`, or `null` when the search could not be read in full), and the run
summary repeats every result. A plate or VIN no ad carries costs nothing. Measured on a test run of 2026-10-24: 4 plates and 1 VIN
in one search, 3 plates and the VIN found, the made up plate not found, 10 seconds.

A private seller's plate field stays empty with **Include personal data** off, even on the row its plate found.

### Dealer stock

**Dealer ids** reads every vehicle of one dealer with Blocket's own dealer filter, one search per dealer and vehicle type. It takes
Blocket's dealer id (the `companyId` of a dealer row) or the dealer's page link on Blocket
(`https://www.blocket.se/mobility/dealer/<id>/<name>`, the `companyPageUrl` of a dealer row). With the ad page on, every row carries
the dealer card. Measured on a test run of 2026-10-24: 20 cars of one dealer (the cap set) with their ad pages in 44 seconds.

### How much does it cost to scrape Blocket?

You pay per event, with Apify's store discounts by plan. A marketplace ad and a vehicle cost the same; the ad page and the vehicle
add-ons are billed only when you turn them on and only on a row that carries them.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (one marketplace ad row, primary) | $0.83 per 1,000 | $0.76 per 1,000 | $0.68 per 1,000 | $0.59 per 1,000 |
| Vehicle (one vehicle row, any type) | $0.83 per 1,000 | $0.76 per 1,000 | $0.68 per 1,000 | $0.59 per 1,000 |
| Ad details (one row that carries its ad page) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Results page (a search page that brings an ad new in the run and delivers one; up to 200 marketplace ads or 50 vehicles) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Similar vehicles list (add-on, one per row that carries a list) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Market valuation (add-on, one per row that carries a valuation) | $1.40 per 1,000 | $1.28 per 1,000 | $1.16 per 1,000 | $1.00 per 1,000 |
| Phone number (add-on, one per row that carries the number behind a business ad's call button) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Actor start (once per run) | $0.0049 | $0.0049 | $0.0049 | $0.0049 |

Platinum and Diamond plans pay the Gold price. The Actor start is a flat fee per run, with no plan discount.

The Store pricing card shows these same prices per 1,000 events: "$0.59 / 1,000" on the Listing row means one marketplace ad costs
$0.00059 at Gold, and "$1.40 / 1,000" on the Market valuation row means one valuation costs $0.0014 on the Free plan.

- **Listing** is charged once per marketplace ad delivered as a row, **Vehicle** once per vehicle ad, from a search, a dealer, a
  lookup or a link. An ad met twice in one run (two keywords, two slices) is delivered and billed once.
- **Results page** is charged once per Blocket search page the run reads that brings at least one ad not met before in the run and
  from which an ad is delivered (up to 200 marketplace ads or 50 vehicles a page, so about $0.0025 per 1,000 marketplace ads and $0.01
  per 1,000 vehicles at Gold). It pays for the searches that deliver only a few rows (a plate list, many dealers, many small
  searches), so the row price stays low. A page of repeats, a page whose ads are all left out by a filter, a page Blocket did not
  apply, the first page of a split, an empty search, ad links and every page of a run's restarted attempt are free.
- **Ad details**, **Similar vehicles list**, **Market valuation** and **Phone number** are charged only with their setting on (Ad
  details also on ad links, lookups, similar vehicles, phone numbers and a car weight range), and only on a row that carries them.
- Never billed: repeats in the run, ads left out by a filter, a plate or VIN no ad carries, a removed or unknown ad link, a vehicle
  with too few comparable ads, a refused setting, a search that finds nothing, coverage rows, status rows and the summary.
- **Every run is charged the Actor start fee ($0.0049), also when it finds nothing** (an empty input, a filter no ad passes, a plate no
  ad carries): such a run costs $0.0049.

Worked examples, computed from the prices above with the start fee included (Results pages counted as full pages; a real run can bill
one or two more where a page brings only a few new ads, as a car search whose newest ads move while it is read):

| Run | Events | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|---|
| The prefill: 20 sofas in Stockholm | 20 Listing, 1 Results page | $0.0222 | $0.0207 | $0.0191 | $0.0172 |
| 1,000 marketplace ads, search rows only | 1,000 Listing, 5 Results pages | $0.8384 | $0.7681 | $0.6878 | $0.5974 |
| 1,000 marketplace ads with their ad pages | 1,000 Listing, 1,000 Ad details, 5 Results pages | $1.5384 | $1.4081 | $1.2678 | $1.0974 |
| 1,000 cars, search rows only | 1,000 Vehicle, 20 Results pages | $0.8489 | $0.7777 | $0.6965 | $0.6049 |
| 500 cars with their ad pages | 500 Vehicle, 500 Ad details, 10 Results pages | $0.7769 | $0.7113 | $0.6407 | $0.5549 |
| 200 cars with the market valuation | 200 Vehicle, 200 Market valuation, 4 Results pages | $0.4537 | $0.4155 | $0.3752 | $0.3249 |
| 200 cars with similar vehicles | 200 Vehicle, 200 Ad details, 200 Similar vehicles list, 4 Results pages | $0.4537 | $0.4155 | $0.3752 | $0.3249 |
| A run that delivers nothing | none | $0.0049 | $0.0049 | $0.0049 | $0.0049 |

Set the run's maximum cost in Apify high enough for large runs: a row whose events do not all fit under it is withheld whole, never
delivered unbilled or billed without its data.

### Input

The Actor has 99 settings; every one is in the **Input** tab with its own help text. The main ones:

| Setting | What it does |
|---|---|
| `verticals` | `marketplace` (general goods) and `vehicles`, each its own search. Left empty: the marketplace, or vehicles when only vehicle settings are given. |
| `keywords` | Search words, each its own search (`soffa`, `iphone 15`, `volvo v70`). Blocket matches them in the ad texts. |
| `categories` | Marketplace categories, sub categories or product categories by Blocket's Swedish name (`Möbler och inredning`, `Soffor`, `Mobiltelefoner`) or value, each its own search. |
| `vehicleTypes` | The vehicle searches, each its own: `car` (Cars (Bil), the default), `mc` (Motorcycles (MC)), `scooter` (Mopeds, scooters and moped cars), `atv` (ATVs), `snowmobile` (Snowmobiles), `boat` (Boats (Båt)), `boatDock` (Boat berths (Båtplats)), `caravan` (Caravans (Husvagnar)), `mobileHome` (Motorhomes (Husbil)), `truck` (Trucks and trailers), `bus` (Buses and minibuses), `construction` (Construction machinery), `tractor` (Tractors), `agriTools` (Forestry and farm machinery), `threshers` (Combine harvesters), `aTractor` (A-tractors (A-traktorer)), or `b2bAll` (All business vehicles: trucks, buses, construction, farm). Boat engines are a marketplace product category on Blocket. |
| `dealerIds` | Dealer ids or dealer page links, each a search of every vehicle of that dealer (per vehicle type). |
| `plates`, `vins` | Plate and VIN lookups (above). Not together with keywords or dealer ids. |
| `searchUrls` | Blocket search links (`https://www.blocket.se/recommerce/forsale/search?...` or `https://www.blocket.se/mobility/search/<type>?...`), read with all their filters. |
| `adUrls` | Ad links (`/recommerce/forsale/item/<id>`, `/mobility/item/<id>`, `https://www.blocket.se/<id>`) or ad ids, up to 5,000, each read with its ad page. A removed or unknown ad is a free status row. |
| `locations` | Counties (län) or municipalities (kommuner) by Blocket's name (`Stockholm`, `Göteborg`, `Skåne`) or value. Several places are one search. |
| `latitude`, `longitude`, `radiusKm` | Blocket's own map radius around a point in Sweden (1 to 500 km). |
| `minPrice`, `maxPrice`, `sellerType`, `postedToday` | Price in kronor, private sellers or companies only (Blocket's "Privat" and "Företag"), Blocket's "Nytt från idag". |
| `conditions`, `tradeTypes`, `brands`, `shippingOnly` | Marketplace: condition grade, ad type ("Säljes", "Bortskänkes", "Köpes"), brand (`IKEA`, `Apple`, `Stokke`), "Kan skickas". |
| `makes`, `models`, `minYear`, `maxYear`, `minMileage`, `maxMileage`, `minPowerHp`, `maxPowerHp`, `fuelTypes`, `transmissions`, `bodyTypes`, `wheelDrives`, `colours`, `salesForms` | Blocket's vehicle filters by Blocket's Swedish names (`Volvo`, `V70`, `El`, `Automatisk`, `Kombi`, `Leasing`). Mileage in Swedish mil (10 km), as Blocket's filters take it. |
| `equipment`, `wheelSets`, `minTrailerWeightKg`, `maxTrailerWeightKg`, `smoothTradeOnly`, `vatDeductibleOnly` | Cars: equipment (`Dragkrok`, `Apple CarPlay`, `Backkamera` ...), wheel sets, towing weight, Tryggad Bilaffär only, VAT deductible only ("Endast avdragbar moms", also MC and caravans). |
| `minEngineCc`, `maxEngineCc`, `vehicleConditions` | MC, ATVs, snowmobiles: engine size in cc; new or used (MC, caravans, motorhomes). |
| `minLengthFeet`, `maxLengthFeet`, `minWidthCm`, `maxWidthCm`, `minBoatEngineHp`, `maxBoatEngineHp`, `minTopSpeedKnots`, `maxTopSpeedKnots`, `boatMaterials`, `berths`, `seatGroups` | Boats: length, width, engine power, top speed, material, berths, seats. |
| `minLengthCm`, `maxLengthCm`, `minWeightKg`, `maxWeightKg` | Caravans and motorhomes: length and weight, sent to Blocket. Cars: the weight is read from each car's ad page (Blocket's car search has no weight filter), so every car of the search has its ad page read and billed as Ad details when delivered; a car whose page shows no weight is left out, free. |
| `attributeFilters` | Any other filter of the search's own Blocket filter list, by name or Swedish label: `{"truck_segment": ["Dragbil"], "shipping_types": ["Gratis frakt"]}`. |
| `postedAfter`, `postedWithinHours`, `postedBefore`, `includeKeywords`, `requireAllKeywords`, `excludeKeywords`, `titleOnly`, `excludeAdIds` | Filters checked on every row; an ad left out is free. **Posted before** reads the newer ads in front and leaves them out free, so a day far back can stop the run on its allowance for unpaid reads. |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `maxRowsPerSearch`, `startPage` | Paid rows per run (default 100), per search, pages per search, rows read per search; **Start page** reads every search from that page of Blocket's own results (53 marketplace ads or 50 vehicles a page) to go on where an earlier run stopped; given, even as 1, every search is read in Blocket's own pages, so runs of page 1, 2, 3 never overlap (such a search is not split and its coverage row says it is not complete; not with plates or VINs). |
| `includeDetails`, `includeSimilarVehicles`, `includePhoneNumber`, `includeMarketValuation`, `minComparables`, `maxPriceVsMarketPercent`, `maxPriceVsMarketSek`, `excludeRedFlagged` | The add-ons and the deal filter (above). |
| `includePersonalData` | The personal data switch (below). |
| `priceSummary`, `includeRawData`, `descriptionFormat`, `descriptionMaxLength`, `outputFields`, `compactOutput`, `excludeEmptyFields`, `extractContacts`, `phoneExtractionMode` | The price summary per search (on by default); Blocket's search row; description `asServed`, `text` or `markdown` and a length cut; your own field list or the most used fields only; empty fields left out; e-mails, phones, websites and social profiles written in the texts (companies' ads always, private ads with personal data on). |
| `failIfIncomplete`, `completenessTolerancePercent`, `completenessToleranceAbsolute`, `maxFailedRequestsPercent`, `proxyConfiguration`, `requestsPerSecond`, `maxConcurrency`, `maxRequestRetries` | Fail the run when a search is incomplete or too many reads failed; your own bar for a complete search; your own proxy links (Apify's datacenter proxy by default); the pace (0.2 to 2 requests a second, default 1), requests in flight (1 to 4), retries (0 to 5). |

A run reads at most 300 searches. A monitor or alert setting refuses the run with a free row that says this Actor keeps no monitor,
and an empty input is refused with a free row (only the run's start fee is charged).

#### Example inputs

Sofas and armchairs in Skåne and Halland, with their ad pages:

```json
{ "verticals": ["marketplace"], "categories": ["Soffor", "Fåtöljer"], "locations": ["Skåne", "Halland"], "includeDetails": true, "maxItems": 200 }
```

Used Volvo V70 estates under 100,000 kr in Västra Götaland, with a market valuation, only those at least 10 percent under the median:

```json
{ "verticals": ["vehicles"], "makes": ["Volvo"], "models": ["V70"], "maxPrice": 100000, "locations": ["Västra Götaland"], "includeMarketValuation": true, "maxPriceVsMarketPercent": -10, "maxItems": 100 }
```

Which of these cars are for sale on Blocket, and at what price:

```json
{ "plates": ["ABC123", "ABC12A"], "vins": ["YV1ZWK5VDN2469115"] }
```

Every vehicle of one dealer, with the dealer card:

```json
{ "dealerIds": ["https://www.blocket.se/mobility/dealer/4521087/kamux-helsingborg"], "includeDetails": true, "maxItems": 500 }
```

#### Every filter is checked

Every named filter is resolved against the search's own Blocket filter list. A value the list does not offer (a make, a place, a
category) is a free row that lists the values it does offer, and the search delivers nothing: an unknown value never widens a search.
A filter a vehicle type does not have (engine size on cars) refuses that search with a free row naming the filters it has. Every page
Blocket answers must echo back the filters sent; a page where Blocket dropped one becomes a free row and the search delivers nothing
more.

#### Past Blocket's 10,000 and 2,500 ad reach

Blocket serves at most 50 pages of one search: 10,000 marketplace ads at 200 a page, and 2,500 vehicles at 50 a page (past page 50
the marketplace answers an error and the vehicle search answers page 1 again). The marketplace alone counted about 872,000 ads and cars about 154,000 on 2026-10-24. When Blocket counts more
ads than one search can reach and you want more, the search is split into slices by Blocket's own counts: marketplace searches by
category, sub category and product category, then by county; vehicle searches by make and model, make, boat class and county; then by
price bands. Each slice is read in Blocket's own order, an ad met in an earlier slice is skipped free, and the coverage row says how
many slices were read and how many ads stayed beyond reach (`adsBeyondReach`). A search is `complete` when its slices met about every
ad Blocket counted (at least 98 percent less 2 ads on a split search, 99 percent less 2 on one search, or your own bar set with
`completenessTolerancePercent` and `completenessToleranceAbsolute`).

#### Restarts

If Apify restarts a run on another server, the run reads its own dataset back: the rows already delivered are neither delivered nor
charged again, and the pages of the restarted attempt are free. Nothing is billed twice.

#### Personal data

A private seller is an ad Blocket marks as private ("Privat"). With **Include personal data** off (the default), these fields are null
on a private seller's row: the plate and VIN (`plate`, `vin`, and their entries in the key facts `attributes`), the seller's Blocket
user id (`sellerId`), street (`streetAddress`), the seller's own links and ad references (`videoUrl`, `externalLink`,
`moreInfoLinks`, `conditionReport`, `conditionReportUrl`, `advertiserRef`, `externalAdId`), a lease's return place, the contacts found
in the texts (**Extract contacts from texts**) and the raw search row; a private seller's map point is rounded to 2 decimals (about 1
km) when Blocket gives it to the address. On every ad, a contact person's name, phone and e-mail (`contacts`) are null with the switch
off, and so is a sole trader's organisation number (in Sweden it is its owner's personal identity number). Turning the switch on adds
all of these. A company's or dealer's name, id, organisation number, address, phone, website and dealer card are business data and
always delivered. Titles, descriptions, equipment texts and the seller's own answers are delivered exactly as Blocket serves them, so
an ad's own text can name a person or give a phone number. Blocket shows no private seller's name or phone to visitors who are not
logged in, so this Actor never has them. Plate and VIN lookups work with the switch on or off. You are responsible for a lawful use of
personal data, GDPR included.

### What this Actor does NOT do

- **No monitor and no alerts.** It keeps no memory between runs: no "new only" rows, no price change, sold or removal tracking across
  runs, no Telegram, Slack, Discord, WhatsApp or webhook alerts; a run that asks for one is refused free. Schedule the run in Apify
  (**Posted within (hours)** set to 24) and compare the rows in your own sheet or flow by `adId`.
- **No sort order.** Blocket's robots.txt asks robots not to send its sort parameter, so every search is read in Blocket's own
  default order (newest first on vehicles and on marketplace searches without words, relevance with words); a pasted link's sort is
  dropped with a free note.
- **No private seller name or phone, no messages.** Blocket shows them only to logged in users (a private seller's ad has no call
  button for visitors); this Actor never logs in and never contacts a seller. A shop's and a dealer's phone are on the ad page and
  delivered, and the number behind a business vehicle ad's call button is the **Phone number** add-on.
- **No login only data.** Saved searches, favourites, messages, a seller's profile pages (`/profile`, disallowed by Blocket's
  robots.txt) and anything behind a Blocket account are not read.
- **No vehicle history report and no register data.** A United States style title status (salvage, rebuilt) is not a fact on Blocket;
  the seller's own damage, repair and lien answers and the red flags are what Blocket serves, and register data is not on Blocket.
- **No sale prices.** Prices, price summaries and market valuations are asking prices of ads on Blocket.
- **No other currencies.** Blocket prices in SEK only; rows carry SEK and `currency`.
- **No view counts and no sponsored slot.** Blocket's pages carry no view count, and its paid ad above a search is not read; every row
  is an organic search result.
- **No photo downloads.** Photo links only.
- **No other sites.** This listing reads Blocket only; FINN.no and its parts have their own listings (below).
- **No guessed spellings and no empty input sample.** A value is used as you send it (after trimming and case) or refused with a free
  row listing Blocket's own values; an input with nothing to search is refused with a free row, and the Console prefill is the example.
- **No unpaid crawling.** A run stops with a status row when its unpaid work (pages whose ads were all filtered out or already
  delivered, removed ads, the reads that check a search's filters) passes a small allowance (USD 0.0004 plus a share of every billed
  event): narrow the search or loosen the filters checked on each row. Each add-on likewise may spend USD 0.003 (USD 0.0005 with a
  deal or red flag filter) on reads that bill nothing, plus a share of its delivered events; with a deal filter, a spent valuation
  share ends the run, since no vehicle can pass without a valuation.

### Use it from an AI agent (MCP)

AI agents can run this Actor as a tool through Apify's MCP server: connect your MCP client to `https://mcp.apify.com` and add
`automation_craft/blocket-scraper` to its tools. The agent sends the input as JSON (for example `{"verticals": ["vehicles"],
"makes": ["Volvo"], "locations": ["Stockholm"], "maxItems": 20}`) and reads the run's dataset back: the ad rows (`type:
"listing"`), the coverage row of each search with its price summary (`type: "search"`), status rows and the summary. For agents, set
`compactOutput` (the most used fields only, county and `mileageKm` included) or `outputFields`, and `excludeEmptyFields`, keep
`maxItems` small, and read the coverage row to see whether a search was read to its end and how many ads Blocket counts.

### API and integrations

Run it from the Apify API, the Apify client for JavaScript or Python, Make, Zapier, n8n or any HTTP client. Example with the API (put
your own token in place of `<YOUR_TOKEN>`):

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~blocket-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"verticals": ["marketplace"], "keywords": ["soffa"], "locations": ["Stockholm"], "maxItems": 20}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('automation_craft/blocket-scraper').call({ verticals: ['vehicles'], makes: ['Volvo'], includeMarketValuation: true, maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/blocket-scraper").call(run_input={"verticals": ["marketplace"], "categories": ["Mobiltelefoner"], "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

Every row carries `type`; keep `type == "listing"` for the ads, and read the coverage rows (`type == "search"`) for the price
summaries and to see whether each search was read in full. The run report (`REPORT` in the run's key-value store) sums up the run.

### FAQ

#### Is it legal to scrape Blocket?

This Actor reads only the public search and ad pages any visitor sees without logging in, never sends the sort parameter or reads the
profile pages Blocket's robots.txt disallows, and withholds a private seller's personal data unless you turn **Include personal data**
on. Blocket's robots.txt also carries a notice that crawling needs Blocket's written permission, so check Blocket's terms and the GDPR
for your own use; you are responsible for a lawful use.

#### Is there a Blocket API for ads?

This Actor works as one: it reads Blocket's public search and ad pages, logged out, and gives you the rows through the Apify API, as
JSON, CSV or Excel, with a free coverage row per search that says how many ads Blocket counts.

#### How many ads can I get from one Blocket search?

Blocket shows at most 50 pages of one search: 10,000 marketplace ads or 2,500 vehicles. Past that, this Actor splits the search by
Blocket's own categories, makes and models, counties and price bands, skips repeats free, and its coverage row says how many ads it met
against Blocket's count.

#### Can I find a car on Blocket by its registration number?

Yes: put the plates into **Plates to look up** or the VINs into **VINs to look up**. A row is delivered only when the ad carries the
plate or VIN asked, each lookup's result (found or not) is on its search's free coverage row, and a plate no ad carries costs nothing.

#### How do I get new Blocket ads every day?

Schedule the run in Apify with **Posted within (hours)** set to 24, or **New today** on: each run delivers the ads Blocket published
in that window. This Actor keeps no memory between runs and sends no alerts, so keep the ad ids you have already seen in your own
sheet or flow.

#### Why does this Actor run with limited permissions?

It needs nothing outside its own run: it reads Blocket and writes only to its own run's dataset and key-value store. Limited
permissions keep the rest of your Apify account out of its reach.

### Changelog

See the Changelog tab (0.1, the launch).

### More data tools by Automation Craft

- [FINN.no Scraper: Torget, Cars, Homes and Jobs](https://apify.com/automation_craft/finn-scraper)
- [FINN Motor Scraper: Norway Cars, MC and Boats](https://apify.com/automation_craft/finn-motor-scraper)
- [FINN Eiendom Scraper: Norway Homes and Rentals](https://apify.com/automation_craft/finn-eiendom-scraper)
- [FINN Jobs Scraper: Norway Job Ads, Employers](https://apify.com/automation_craft/finn-jobs-scraper)
- [Marktplaats Scraper: Ads, Cars, Sellers & Alerts](https://apify.com/automation_craft/marktplaats-scraper)
- [willhaben Scraper: Immobilien, Cars, Jobs & Ads](https://apify.com/automation_craft/willhaben-scraper)
- [Kleinanzeigen Scraper & API: Ads, Prices, Places](https://apify.com/automation_craft/kleinanzeigen-scraper)
- [Gumtree Scraper: UK, Australia, South Africa Ads](https://apify.com/automation_craft/gumtree-scraper)
- [Mobile.de Scraper: Cars, Prices, Dealers & Ratings](https://apify.com/automation_craft/mobile-de-scraper)
- [AutoScout24 Scraper: EU Car Listings & Prices](https://apify.com/automation_craft/autoscout24-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/blocket-scraper/changelog.md

# Actor input Schema

## `verticals` (type: `array`):

Blocket's marketplace (general goods: furniture, electronics, clothes and every other category) and its vehicles (cars, motorcycles, boats and more), each its own search. Left empty: the marketplace, or vehicles when only vehicle settings are given.

## `keywords` (type: `array`):

Search words, each one its own search ("soffa", "iphone 15", "volvo v70", "barnvagn"). Blocket matches them in the ad texts. Left empty, each search reads without words, newest first.

## `categories` (type: `array`):

Marketplace only: Blocket categories, sub categories or product categories by Blocket's Swedish name ("Möbler och inredning", "Soffor", "Mobiltelefoner") or Blocket's value ("0.78"). Each category is its own search, with its own price summary.

## `vehicleTypes` (type: `array`):

Vehicles only: which Blocket vehicle searches to read, each its own search. Left empty: cars.

## `dealerIds` (type: `array`):

Every vehicle of one dealer: Blocket's dealer ids (the companyId of a dealer row) or a dealer's page link on Blocket (https://www.blocket.se/mobility/dealer/<id>/<name>, the companyPageUrl of a dealer row), each its own search per vehicle type (Blocket's own dealer filter). Not together with plates or vins.

## `plates` (type: `array`):

Swedish plates such as "ABC123", "ABC 123" or "ABC12A", or a personalised plate of 2 to 7 letters and digits holding a digit: each looks for the Blocket ad of that vehicle in each vehicle type (cars when vehicleTypes is empty), sent in both forms Blocket's ads store it (with and without the space), up to 10 plates to one Blocket search. A row is delivered only when the vehicle's own plate is the plate asked (shown on its ad page; where Blocket's page shows no plate, as on a private car, the plate of its search row, with the page's VIN equal to the row's); each plate's result (found, not found) is on its search's free coverage row. At most 300 a run; not together with keywords or dealerIds.

## `vins` (type: `array`):

Vehicle identification numbers (chassinummer, 11 to 17 letters and digits holding both): each looks for the Blocket ad of that vehicle, as plates do, 20 VINs to one Blocket search. A VIN no ad carries is free (its search's coverage row says not found).

## `locations` (type: `array`):

Counties (län) or municipalities (kommuner) by Blocket's name ("Stockholm", "Göteborg", "Skåne") or Blocket's value ("0.300001"). Several places are one search (any of them).

## `latitude` (type: `number`):

With longitude and radiusKm: search around a point in Sweden (Blocket's own map radius).

## `longitude` (type: `number`):

With latitude and radiusKm.

## `radiusKm` (type: `integer`):

With latitude and longitude: the distance in kilometres.

## `minPrice` (type: `integer`):

The lowest price in Swedish kronor, sent to Blocket.

## `maxPrice` (type: `integer`):

The highest price in Swedish kronor, sent to Blocket.

## `sellerType` (type: `string`):

Private sellers only, or companies and dealers only (Blocket's own seller filter, "Privat" or "Företag").

## `postedToday` (type: `boolean`):

Only ads Blocket marks as new today ("Nytt från idag").

## `conditions` (type: `array`):

Blocket's condition labels: "Nytt skick - helt ny", "Mycket bra skick - som ny", "Bra skick - varsamt använd", "Okej skick - synligt använd", "Funkar inte - kan fixas".

## `tradeTypes` (type: `array`):

"Säljes" (for sale), "Bortskänkes" (given away free) or "Köpes" (wanted).

## `brands` (type: `array`):

Brands as Blocket lists them for the search ("IKEA", "Apple", "Stokke" and about 1,600 more).

## `shippingOnly` (type: `boolean`):

Only ads the seller can ship ("Kan skickas").

## `makes` (type: `array`):

"Volvo", "Volkswagen", "Tesla", "Yamaha", "Buster" and the other makes Blocket lists for the vehicle type.

## `models` (type: `array`):

Cars and A-tractors only, with makes: models by Blocket's name ("V70", "Golf", "Model Y").

## `minYear` (type: `integer`):

Every vehicle type with a model year.

## `maxYear` (type: `integer`):

Every vehicle type with a model year.

## `minMileage` (type: `integer`):

In Swedish mil (10 km), as Blocket counts it: cars, MC, mopeds, ATVs and snowmobiles.

## `maxMileage` (type: `integer`):

In Swedish mil (10 km).

## `minPowerHp` (type: `integer`):

Cars, MC, mopeds, ATVs and snowmobiles.

## `maxPowerHp` (type: `integer`):

As minPowerHp.

## `fuelTypes` (type: `array`):

"Bensin", "Diesel", "El", "Hybrid bensin", "Plug-in Bensin", "Fordonsgas" and the other names Blocket lists (cars, MC, mopeds, boats).

## `transmissions` (type: `array`):

Cars and motorhomes: "Automatisk", "Manuell" or "Sekventiell".

## `bodyTypes` (type: `array`):

The body or type Blocket lists for the vehicle type: "Kombi", "SUV", "Sedan", "Halvkombi 5-dörrar" (cars); "Adventure", "Touring" (MC); "Daycruiser", "RIB", "Segelbåt/Motorseglare" (boat classes); truck, bus, machine and farm tool types.

## `wheelDrives` (type: `array`):

Cars and motorhomes: "Fyrhjulsdrift", "Framhjulsdrift", "Bakhjulsdrift".

## `colours` (type: `array`):

Cars only: "Svart", "Vit", "Grå", "Blå", "Silver" and the other names Blocket lists.

## `salesForms` (type: `array`):

Cars: "Begagnad bil till salu", "Ny bil till salu" or "Leasing"; caravans: "Till salu".

## `equipment` (type: `array`):

Cars only: "Dragkrok" (towbar), "Apple CarPlay", "Backkamera", "Bluetooth", "Farthållare", "AC och klimatanläggning", "Kupévärmare", "Motorvärmare", "Parkeringssensor bak", "Interiör i skinn eller delvis i skinn", "Soltak/glastak". Several values: any of them.

## `wheelSets` (type: `array`):

Cars only: "En uppsättning hjul" or "Två eller fler uppsättningar hjul".

## `vehicleConditions` (type: `array`):

MC, caravans and motorhomes: "Ny MC" or "Begagnad MC"; "Ny" or "Begagnat".

## `smoothTradeOnly` (type: `boolean`):

Cars only: ads with Blocket's safe payment and ownership change ("Tryggad Bilaffär").

## `vatDeductibleOnly` (type: `boolean`):

Cars, MC and caravans: only ads whose VAT is deductible for a business buyer ("Endast avdragbar moms").

## `minEngineCc` (type: `integer`):

MC, ATVs and snowmobiles: Blocket's engine size in cubic centimetres.

## `maxEngineCc` (type: `integer`):

As minEngineCc.

## `minLengthFeet` (type: `integer`):

Boats: Blocket's length in feet.

## `maxLengthFeet` (type: `integer`):

Boats.

## `minLengthCm` (type: `integer`):

Caravans and motorhomes: Blocket's length in centimetres.

## `maxLengthCm` (type: `integer`):

Caravans and motorhomes.

## `minWidthCm` (type: `integer`):

Boats: Blocket's width in centimetres.

## `maxWidthCm` (type: `integer`):

Boats.

## `minWeightKg` (type: `integer`):

Caravans and motorhomes: Blocket's weight filter in kilograms. Cars: Blocket's car search has no weight filter, so every car's ad page is read and its weight judged there (each delivered car is billed Ad details too; a car whose page shows no weight is left out, free).

## `maxWeightKg` (type: `integer`):

Caravans and motorhomes; cars read from each ad page (billed Ad details), as Minimum weight.

## `minTrailerWeightKg` (type: `integer`):

Cars only: the largest trailer weight in kilograms.

## `maxTrailerWeightKg` (type: `integer`):

Cars only.

## `minBoatEngineHp` (type: `integer`):

Boats: the power of the boat's engine.

## `maxBoatEngineHp` (type: `integer`):

Boats.

## `minTopSpeedKnots` (type: `integer`):

Boats.

## `maxTopSpeedKnots` (type: `integer`):

Boats.

## `berths` (type: `array`):

Boats, caravans and motorhomes: Blocket's groups of berths, such as "3 - 4".

## `seatGroups` (type: `array`):

Boats and motorhomes: Blocket's seat groups, such as "4 - 6".

## `boatMaterials` (type: `array`):

Boats: "Glasfiber", "Aluminium", "Plast", "Trä", "Annat".

## `attributeFilters` (type: `object`):

Any other filter of the search's own Blocket filter list, by Blocket's name or Swedish label, with values by label or value, or {"min": n, "max": n} for a range. For example {"truck_segment": \["Dragbil"], "shipping_types": \["Gratis frakt"]}. A filter the search does not offer is refused with the filters it does offer.

## `postedAfter` (type: `string`):

Only ads published on or after this day in Sweden (YYYY-MM-DD), checked on every row.

## `postedWithinHours` (type: `integer`):

Only ads published within this many hours of the run's start, checked on every row.

## `postedBefore` (type: `string`):

Only ads published before this day in Sweden (YYYY-MM-DD), checked on every row. Blocket lists newest first, so the newer ads in front are read and left out free; a day far back can stop the run on its allowance for unpaid reads.

## `includeKeywords` (type: `array`):

Words an ad must contain (its title, and its description when the ad page is read). Any one of them, or all with requireAllKeywords.

## `requireAllKeywords` (type: `boolean`):

With includeKeywords: every word must be in the ad.

## `excludeKeywords` (type: `array`):

Ads holding any of these words are left out, free.

## `titleOnly` (type: `boolean`):

includeKeywords and excludeKeywords look at the title only.

## `excludeAdIds` (type: `array`):

Blocket ad ids (Annons-ID) or ad links never to deliver.

## `searchUrls` (type: `array`):

Search pages copied from Blocket's marketplace (https://www.blocket.se/recommerce/forsale/search?...) or its vehicles (https://www.blocket.se/mobility/search/<type>?...), read with all their filters. Blocket's sort order in a link is not sent (Blocket asks robots not to); the link is read in Blocket's default order.

## `adUrls` (type: `array`):

Blocket ad links (https://www.blocket.se/recommerce/forsale/item/<id>, https://www.blocket.se/mobility/item/<id> or https://www.blocket.se/<id>) or Blocket ad ids (Annons-ID): each read with its ad page and billed as one Listing or Vehicle plus one Ad details. A removed or unknown ad is a free row.

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

The most paid rows (marketplace ads and vehicles) the run delivers, across all searches and links.

## `maxItemsPerSearch` (type: `integer`):

The most paid rows from one search or search link.

## `maxPagesPerSearch` (type: `integer`):

The most result pages read for one search.

## `maxRowsPerSearch` (type: `integer`):

How many rows of each search are read at most, the rows left out by a filter included (no limit by default).

## `startPage` (type: `integer`):

Read every search from this page of Blocket's own results (53 marketplace ads or 50 vehicles a page) instead of the first: to go on from where an earlier run stopped. Such a search is not split past Blocket's 50 page reach and its coverage row says it is not complete. Given, even as 1, every search is read in Blocket's own pages from that page, so runs of startPage 1, 2, 3 never overlap. Not with plates or vins.

## `includeDetails` (type: `boolean`):

Read each ad's page: the full description, every key fact and all images, the category path, the postal code, the edited time, a shop's profile (name, address, phone, organisation number, website), and on vehicles the equipment, registration date, inspection dates, owners, warranty, declared damages, leasing terms and the dealer card (organisation number, address, phone, e-mail, website, opening hours, brands). Billed as one Ad details per row that carries its ad page; about a second per row.

## `includeSimilarVehicles` (type: `boolean`):

Vehicles: Blocket's own list of similar vehicles for each ad (id, link, title, year and mileage text, price, image). Reads the ad page too (billed as Ad details). Billed as one Similar vehicles list per row that carries one; an ad Blocket lists none for is empty and free.

## `includePhoneNumber` (type: `boolean`):

Vehicles: the number behind the call button of a business ad on Blocket (a dealer's or a company's), as Blocket gives it to a visitor who presses the button; it can differ from the number in the dealer card. Reads the ad page too (billed as Ad details). Billed as one Phone number per row that carries one; a private seller's ad has no such button (status notOffered), and an ad Blocket gives no number for is free.

## `includeMarketValuation` (type: `boolean`):

Vehicles: the asking prices of the same make and model on Blocket today, one model year either side (count, median, quartiles, lowest and highest), and how far this vehicle's price stands from the median, in percent and kronor. One extra Blocket search per vehicle; billed as one Market valuation per row that carries one. Fewer than 5 comparable ads, or a vehicle without make, model or model year: no valuation, free. Asking prices, not sale prices.

## `maxPriceVsMarketPercent` (type: `integer`):

With includeMarketValuation: deliver only vehicles whose asking price is at most this many percent above (positive) or below (negative) the median of their market valuation, such as -10 for at least 10 percent under the market. Vehicles left out, or with no valuation, are free; their valuation reads are the add-on's unpaid work.

## `maxPriceVsMarketSek` (type: `integer`):

With includeMarketValuation: deliver only vehicles whose asking price is at most this many kronor above (positive) or below (negative) the median of their market valuation, such as -20000 for at least 20,000 kr under the market. Vehicles left out, or with no valuation, are free.

## `minComparables` (type: `integer`):

With includeMarketValuation: the fewest comparable ads a valuation needs (5 to 50, 5 by default); a vehicle with fewer gets no valuation, free. Each valuation says its confidence too: high with 20 or more, medium with 10 to 19, low below.

## `excludeRedFlagged` (type: `boolean`):

Vehicles: leave out, free, every vehicle whose row carries a red flag (the seller's own answer of known damage, major repairs or a lien, or a mention in the title or description of export only, damage or a fault, a lease takeover, a driving ban, deregistration or a sale for parts). A mention is only a mention ("ingen skada" mentions damage too): read redFlags first.

## `includePersonalData` (type: `boolean`):

Deliver the fields that name or reach a private person: a private seller's plate and VIN (in their fields and in the key facts), Blocket user id, street and exact map point (off: the point is rounded to 2 decimals, about 1 km, when Blocket gives it to the address), the seller's own links and ad references, a sole trader's organisation number (in Sweden it is its owner's personal identity number), contact persons' names, phones and e-mails on any ad, and the contacts found in the texts of private ads. Off: those fields are empty; a company's or dealer's name, id, organisation number, address, phone, website and dealer card are business data and always delivered. Plate and VIN lookups work either way. You are responsible for a lawful use, GDPR included.

## `priceSummary` (type: `boolean`):

Each search's coverage row carries the count, lowest, quartiles, median, mean and highest asking price of the ads it met, and the same per county and per category (marketplace) or make (vehicles). Free.

## `includeRawData` (type: `boolean`):

Add Blocket's search row as served (a private seller's only with personal data on).

## `descriptionFormat` (type: `string`):

How the ad description is delivered.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters (descriptionCut marks the row).

## `outputFields` (type: `array`):

Keep only these row fields, by the names the rows carry ("adId", "url", "county", "make", "model", "mileageKm", "marketValuation"); the row's identity, title, price, place, status and image count, and the fields of every add-on that is billed, always stay. Not together with compactOutput.

## `compactOutput` (type: `boolean`):

Deliver only the most used fields (handy for AI agents).

## `excludeEmptyFields` (type: `boolean`):

Drop fields that are empty on a row.

## `extractContacts` (type: `boolean`):

Add the e-mail addresses, phone numbers, websites and social profiles written in the title and description (companies' ads always; private ads with includePersonalData on).

## `phoneExtractionMode` (type: `string`):

With extractContacts.

## `failIfIncomplete` (type: `boolean`):

End the run as failed when a search or link could not be read in full (the rows delivered stay).

## `maxFailedRequestsPercent` (type: `integer`):

End the run as failed when more of its reads failed.

## `completenessTolerancePercent` (type: `number`):

Your own bar for a complete search: a search counts as complete when it met at least Blocket's count of ads less this percent (and less the number of ads below). Empty: the fixed rule (98 percent of Blocket's count less 2 ads on a split search, 99 percent less 2 on one search).

## `completenessToleranceAbsolute` (type: `integer`):

Your own bar for a complete search, in ads: Blocket's count less this many ads (and less the percent above). Empty: the fixed rule.

## `proxyConfiguration` (type: `object`):

Leave as is: Blocket is read through Apify's datacenter proxy, which every Blocket door answers. Your own proxy links replace it.

## `requestsPerSecond` (type: `number`):

The pace of the run's one exit (0.2 to 2).

## `maxConcurrency` (type: `integer`):

At most this many requests in flight, inside the pace (Blocket is never asked more than requestsPerSecond requests a second): ad pages and add-on pages are read on this many lanes.

## `maxRequestRetries` (type: `integer`):

Tries of a failed read after the first.

## Actor input object example

```json
{
  "verticals": [
    "marketplace"
  ],
  "keywords": [
    "soffa"
  ],
  "locations": [
    "Stockholm"
  ],
  "sellerType": "any",
  "postedToday": false,
  "shippingOnly": false,
  "smoothTradeOnly": false,
  "vatDeductibleOnly": false,
  "requireAllKeywords": false,
  "titleOnly": false,
  "maxItems": 20,
  "includeDetails": false,
  "includeSimilarVehicles": false,
  "includePhoneNumber": false,
  "includeMarketValuation": false,
  "excludeRedFlagged": false,
  "includePersonalData": false,
  "priceSummary": true,
  "includeRawData": false,
  "descriptionFormat": "asServed",
  "compactOutput": false,
  "excludeEmptyFields": false,
  "extractContacts": false,
  "failIfIncomplete": false,
  "requestsPerSecond": 1,
  "maxConcurrency": 4,
  "maxRequestRetries": 2
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `report` (type: `string`):

No description

# 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 = {
    "verticals": [
        "marketplace"
    ],
    "keywords": [
        "soffa"
    ],
    "locations": [
        "Stockholm"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/blocket-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 = {
    "verticals": ["marketplace"],
    "keywords": ["soffa"],
    "locations": ["Stockholm"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/blocket-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 '{
  "verticals": [
    "marketplace"
  ],
  "keywords": [
    "soffa"
  ],
  "locations": [
    "Stockholm"
  ],
  "maxItems": 20
}' |
apify call automation_craft/blocket-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/blocket-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/X4JMVloVp8uo30XSc/builds/ovvr2gZhaOwNcEB0B/openapi.json
