Blocket API & Scraper
The Blocket API returns the Nordic second-hand marketplaces as clean JSON from one engine: Blocket in Sweden (SEK), FINN torget in Norway (NOK), Tori in Finland (EUR) and DBA in Denmark (DKK), switched with one country parameter.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search returns 53 listings per call with the listing id, title, price, a give-away flag, the municipality, when the ad was published, private or business seller, whether it can be shipped or bought directly, brand, photos and attributes, plus the true total and category and region counts - filtered by keyword, category, region, price, condition, seller type, ad type, shipping and ads published today, sorted by relevance, newest or price. listing returns the full ad: description, condition on the sites' shared five-step scale, the category path, every attribute, every photo, postal code and city, when it was last edited, whether it is still for sale or sold, shipping options, and for business sellers the shop name, organisation id, company registry link, address and their other listings. categories returns the three-level category tree with live counts and the code search filters on. Verification on 2026-09-15 covered 17 listings across bicycles, sofas, phones and children's clothes in all four countries: price matched the listing's own structured data on 16 of 16 and the search row on 17 of 17, and title matched the page heading on 17 of 17. No account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
A price of 0 is not a price - how a Nordic listing really reads
On all four sites a give-away ad is stored with a price of zero, and a for-sale ad can have no price at all. Averaging those rows drags every price series down, and a sold ad still shows its old price. This engine returns price as null when there is no real asking price, flags give-aways with is_free, and marks sold ads with status.
| Listing (measured 2026-09-15) | What the site stores | price | is_free / status |
|---|---|---|---|
| Blocket, 'Cykel bortskänkes' (given away) | price 0 in search, no price on the ad | null | is_free true |
| DBA, bicycle ad 'Til salg' with no price | price 0 in search | null | is_free false |
| Blocket, 'Tärnö bord och stolar' (sold) | price 200 kr still shown | 200 | status sold |
| Blocket, 'Custom Beach Cruiser cykel' | price 1 400 kr | 1400 | is_free false, status active |
On one Blocket page for 'cykel' sorted by lowest price, all 28 zero-price rows were give-aways, and they come first. A search filtered to give-aways returned 48 ads, every one with price null and is_free true.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/blocket/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "cykel",
"country": "se"
}
}{
"ok": true,
"meta": {
"api": "blocket",
"endpoint": "search",
"mode": "live",
"latency_ms": 650.1,
"record_count": 53,
"bytes": 339254,
"cache_hit": false,
"pagination": {
"page": 1,
"has_more": true,
"page_size": 53,
"total": 17732
},
"country": "se"
},
"data": {
"results": [
{
"listing_id": "26636833",
"title": "Retro cykel",
"url": "https://www.blocket.se/recommerce/forsale/item/26636833",
"price": 1500,
"currency": "SEK",
"is_free": false,
"listing_type": "sell",
"listing_type_label": "Säljes",
"location": "Söråker",
"coordinates": {
"lat": 62.50412,
"lon": 17.48707
},
"listed_at": "2026-09-16T12:30:19Z",
"seller_type": "private",
"seller_name": null,
"brand": null,
"shipping_available": false,
"buy_now": false,
"free_shipping": false,
"image": "https://images.blocketcdn.se/dynamic/default/item/26636833/5a10b2c9-368f-41f3-a7ab-0eb9417d9bd8",
"images": [
"https://images.blocketcdn.se/dynamic/default/item/26636833/5a10b2c9-368f-41f3-a7ab-0eb9417d9bd8",
"https://images.blocketcdn.se/dynamic/default/item/26636833/fe88b171-4bb7-40ef-9c09-01ec70e33fdd",
"https://images.blocketcdn.se/dynamic/default/item/26636833/cd6453f4-034a-4f19-bc4f-f36123a01774"
],
"image_count": 4,
"attributes": null,
"labels": [
"Privat"
]
},
{
"listing_id": "26633506",
"title": "Cykel Kronan 3 växlad unisexcykel",
"url": "https://www.blocket.se/recommerce/forsale/item/26633506",
"price": 3000,
"currency": "SEK",
"is_free": false,
"listing_type": "sell",
"listing_type_label": "Säljes",
"location": "Halmstad",
"coordinates": {
"lat": 56.67437,
"lon": 12.85567
},
"listed_at": "2026-09-16T10:38:48Z",
"seller_type": "private",
"seller_name": null,
"brand": "Monark",
"shipping_available": false,
"buy_now": false,
"free_shipping": false,
"image": "https://images.blocketcdn.se/dynamic/default/item/26633506/70fb52af-6b13-4e1e-9e01-cfd306cb6d9e",
"images": [
"https://images.blocketcdn.se/dynamic/default/item/26633506/70fb52af-6b13-4e1e-9e01-cfd306cb6d9e"
],
"image_count": 1,
"attributes": null,
"labels": [
"Privat"
]
},
{
"listing_id": "26632897",
"title": "Monark trehjuling cykel 20\" blå unisex",
"url": "https://www.blocket.se/recommerce/forsale/item/26632897",
"price": 3150,
"currency": "SEK",
"is_free": false,
"listing_type": "sell",
"listing_type_label": "Säljes",
"location": "Svalöv",
"coordinates": {
"lat": 55.92477,
"lon": 13.16728
},
"listed_at": "2026-09-16T10:13:35Z",
"seller_type": "private",
"seller_name": null,
"brand": "Monark",
"shipping_available": false,
"buy_now": false,
"free_shipping": false,
"image": "https://images.blocketcdn.se/dynamic/default/item/26632897/6d2444b0-2ada-4891-948d-070bdc915b09",
"images": [
"https://images.blocketcdn.se/dynamic/default/item/26632897/6d2444b0-2ada-4891-948d-070bdc915b09",
"https://images.blocketcdn.se/dynamic/default/item/26632897/6bb993da-b397-4ff5-9404-cc77b3c49d14",
"https://images.blocketcdn.se/dynamic/default/item/26632897/62f6171b-8404-4eb9-9514-8f55603d3909"
],
"image_count": 3,
"attributes": null,
"labels": [
"Privat"
]
}
],
"count": 53,
"total_results": 17732,
"page": 1,
"last_page": 50,
"has_more": true,
"sort_applied": "relevance",
"filters_applied": null,
"category_facets": [
{
"category": "0.91",
"name": "Affärsverksamhet",
"count": 27
},
{
"category": "0.67",
"name": "Bygg och trädgård",
"count": 96
},
{
"category": "0.77",
"name": "Djur och tillbehör",
"count": 41
}
],
"region_facets": [
{
"location": "0.300010",
"name": "Blekinge",
"count": 280
},
{
"location": "0.300020",
"name": "Dalarna",
"count": 461
},
{
"location": "0.300009",
"name": "Gotland",
"count": 83
}
],
"country": "se",
"site": "Blocket",
"currency": "SEK",
"query": "cykel"
}
}What the Blocket API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search second-hand listings on Blocket (se), FINN (no), Tori (fi) or DBA (dk) by keyword, category or region: listing id, title, price in local currency (null for give-aways), free/give-away flag, municipality, publication time, private or business seller, shipping and buy-now availability, brand, images and attributes, with the true total and category/region counts. Filter by price, condition, seller type, ad type, shipping and ads published today; sort by relevance, newest or price. | Price-intelligence teams call search to search second-hand listings on Blocket (se), FINN (no), Tori (fi) or DBA (dk) by keyword, cat…. | query, country, category, location, page, ... |
| listing | The full listing by id or URL: title, full description, price and currency, give-away flag, status (active or sold), condition on the five-step scale, category path with its search code, all attributes (size, brand, model…), every image with dimensions, postal code and city, last-edited time, shipping and buy-now availability, and the seller — for businesses the shop name, organisation id, company registry link, address, website and their other listings; for private sellers only the seller type. | Classifieds aggregators call listing to get the full listing by id or URL. | listing_id, country, max_rotations |
| categories | The marketplace category tree of one site with live listing counts — three levels, each node with the code to pass as `category` to search. Optionally counted for a keyword. | Resale and arbitrage tools call categories to get the marketplace category tree of one site with live listing counts. | country, query, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/blocket/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"cykel","country":"se"}'import requests
r = requests.post(
"https://api.reefapi.com/blocket/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "cykel",
"country": "se"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/blocket/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "cykel",
"country": "se"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.blocket.search with {"query":"cykel","country":"se"}.Who uses this API and why
- Resale and price-intelligence teams track second-hand prices per category in Sweden, Norway, Finland and Denmark with search sorted by newest.
- Recommerce and refurbishment businesses watch give-away and low-price ads in their region with listing_type, location and price filters.
- Market analysts size supply per category and region from total_results, category_facets and region_facets without paging through ads.
- Dealers monitor business competitors' stock and prices through listing's seller block and the shop's other listings.
Questions developers ask before integrating
Which sites and countries does the Blocket API cover?
Four marketplaces that share one platform: country=se is Blocket (Sweden, SEK), no is FINN torget (Norway, NOK), fi is Tori (Finland, EUR) and dk is DBA (Denmark, DKK). site=blocket, finn, tori or dba works too, and a pasted listing URL picks the country by itself. The response fields are identical on all four; titles, labels and category names come back in the site's language.
Why is price null on some listings?
Because the site has no asking price for them. Give-away ads are stored with a price of zero; they come back as price null with is_free true and listing_type give_away. A few for-sale ads also have no price, and they come back as price null with is_free false. A zero is never returned as a price, so an average over price never includes free items.
Does the API show sold listings?
A sold ad can stay online with its old price. listing returns status sold (with the site's own label, such as Såld) instead of active, so a stale price is never read as a live offer. search returns ads that are currently listed.
Can I get the seller's name and phone number?
For business sellers, listing returns the shop name, organisation id, a link to the national company registry, address, website and the shop's other listings. For private sellers the sites do not show a name to visitors, so seller.name is null and only the seller type is returned. Phone numbers and e-mail addresses written into descriptions are redacted by default.
How do category codes work?
Codes look like 0.69 (Sport and outdoor), 1.69.3963 (Cycling) and 2.69.3963.257 (Bicycles), and the same code means the same category on all four sites. The categories action returns the whole three-level tree with live counts, every search returns category_facets, and listing returns category_search_code for the ad's own category.
How deep can I page?
53 listings per page and up to 50 pages per query - the sites stop there even when total_results is larger (17,660 bicycles for 'cykel' on Blocket on 2026-09-15). Narrow the query with category, location, price or published_today to reach the rest.
What do the sites NOT publish?
The original creation date on the ad page (listing returns edited_at; search returns listed_at, the time the ad was published or renewed), a private seller's name, a view count, and a shipping price before checkout. Condition is optional for sellers: 14 of 17 verified listings had one, and some business shops leave it out.
What is the Blocket API?
Blocket API is a ReefAPI endpoint group for nordic second-hand listings from blocket, finn, tori and dba. It returns live JSON through POST requests under /blocket/v1.
Is the Blocket API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Blocket calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Blocket login or account?
No login to Blocket is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Blocket data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Blocket API use?
Blocket actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Blocket from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call blocket actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Blocket API a Blocket scraper?
It is the managed alternative to a DIY Blocket scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same nordic second-hand listings from blocket, finn, tori and dba back as clean JSON.