Skip to content
Scrappa Get API key
Blocket Bostad API 1 credit/request

Blocket Bostad Rental Search API Documentation

GET https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10

Scrappa's GET /api/blocket-bostad/search returns Swedish rental homes from Blocket Bostad (bostad.blocket.se) as structured JSON.

Rentals only

Blocket Bostad lists homes for rent. It has no sale listings, so this API has no sale parameter and sale is rejected. For homes for sale in Sweden use the Hemnet or Booli APIs. Blocket Bostad has no bathroom filter, so bathrooms is rejected too. Blocket Bostad is built on the Qasa rental platform, so these homes also appear in the Qasa API.

What you get

One request returns one page of homes and the real match count in total. Each home has id, url, platform (blocket, dotcom or homeq), title, description, rent, monthly_cost, tenant_base_fee, currency, rooms, bedrooms, size, home_type, tenant rule flags, rental dates and length, landlord badges, location with coordinates and all images. Call the listing endpoint for amenities, fees, nearby transport and the landlord.

Filters are honoured

Every filter is applied by the source, so total and the paging describe the real result set. Unknown parameters are rejected with 422 instead of being ignored. applied_filters echoes what was sent. Rows that break the requested rent range are removed and counted in meta.filtered_out.

Rent

min_rent and max_rent filter the monthly rent. monthly_cost is the rent plus the tenant fee, so a home can show a monthly_cost slightly above max_rent.

Bedrooms

min_bedrooms matches homes that state a bedroom count. Many listings do not, so bedrooms is often null. Treat this filter as partial.

Areas

area takes a name or identifier from /api/blocket-bostad/location-autocomplete. An unknown area returns 422 (unknown_area) with suggestions, because the source would otherwise return all of Sweden. The source decides which homes belong to an area, so a city search can include homes in neighbouring localities.

Pagination

page is 1-based and limit is 1-100 (default 50). A page past the last one returns an empty list with the correct total. It never returns another page's homes. A page far beyond the end returns 422 (page_out_of_range).

Data quality

Values pass through as landlords entered them, so a few homes show unrealistic rents or sizes.

Blocket Bostad Rental Search API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "success": true,
    "data_source": "Blocket Bostad (Qasa)",
    "market": "sweden",
    "currency": "SEK",
    "total": 612,
    "returned": 1,
    "pagination": {
        "page": 1,
        "limit": 10,
        "pages_count": 62,
        "has_next_page": true,
        "has_previous_page": false
    },
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

This endpoint has no required query parameters.

22 optional filters available.

area string Optional

Area name or identifier from location-autocomplete, for example Göteborg or se/göteborg.

Example value Göteborg
min_rent integer Optional

Minimum monthly rent as a whole number in SEK. Applies to the rent, not to rent plus tenant fee.

Example value 5000
max_rent integer Optional

Maximum monthly rent as a whole number in SEK. Applies to the rent, not to rent plus tenant fee.

Example value 12000
min_rooms number Optional

Minimum room count, for example 1.5.

Example value 10
max_rooms number Optional

Maximum room count.

Example value 10
min_bedrooms integer Optional

Minimum bedroom count. Many listings state no bedroom count, so this filter is partial.

Example value 10
min_size integer Optional

Minimum size in square metres.

Example value 10
max_size integer Optional

Maximum size in square metres.

Example value 10
home_type string Optional

One or more of apartment, terrace_house, cottage, dorm, house, other. Comma-separated.

Example value example
shared boolean Optional

true for shared homes, false for entire homes.

Example value true
furnished boolean Optional

true for furnished homes, false for unfurnished.

Example value true
pets boolean Optional

true for homes that allow pets, false for homes that do not.

Example value true
smoking boolean Optional

true for homes that allow smoking, false for homes that do not.

Example value true
wheelchair_accessible boolean Optional

true or false.

Example value true
first_hand boolean Optional

true for first-hand contracts, false for second-hand.

Example value true
student_home boolean Optional

true or false.

Example value true
senior_home boolean Optional

true or false.

Example value true
corporate_home boolean Optional

true or false.

Example value true
sort string Optional

published_or_bumped_at (default), rent, monthly_cost, start_date, end_date, room_count, square_meters, sorting_score or thirty_day_view_count.

Example value relevance
direction string Optional

desc (default) or asc.

Example value example
limit integer Optional

Homes per page, 1-100 (default 50).

Example value 10
page integer Optional

Result page, 1-based.

Example value 1

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
PHP
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
JavaScript
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
Python
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
Go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10"
C#
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
RUST
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/blocket-bostad/search?area=G%C3%B6teborg&min_rent=5000&max_rent=12000&limit=10")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

success data_source market currency total returned pagination applied_filters +2 more

Common listings fields

id url title description
JSON Response
200 OK
{
    "success": true,
    "data_source": "Blocket Bostad (Qasa)",
    "market": "sweden",
    "currency": "SEK",
    "total": 612,
    "returned": 1,
    "pagination": {
        "page": 1,
        "limit": 10,
        "pages_count": 62,
        "has_next_page": true,
        "has_previous_page": false
    },
    "applied_filters": {
        "area": "se/g\u00f6teborg",
        "min_rent": 5000,
        "max_rent": 12000,
        "sort": "published_or_bumped_at",
        "direction": "desc"
    },
    "listings": [
        {
            "id": "1492340",
            "url": "https://qasa.com/se/sv/home/1492340",
            "title": "Two-room apartment in Majorna",
            "description": "Bright apartment close to the tram.",
            "market": "sweden",
            "currency": "SEK",
            "rent": 11200,
            "monthly_cost": 11866,
            "tenant_base_fee": 666,
            "rooms": 2,
            "bedrooms": 1,
            "size": 48,
            "home_type": "apartment",
            "furnished": true,
            "shared": false,
            "first_hand": false,
            "student_home": false,
            "senior_home": false,
            "corporate_home": false,
            "pets_allowed": false,
            "smoking_allowed": false,
            "wheelchair_accessible": false,
            "instant_sign": false,
            "household_size": 2,
            "block_listing": false,
            "rental_length_seconds": 15778800,
            "rental_length_months": 6,
            "start_date": "2026-12-01T00:00:00Z",
            "end_date": "2027-05-31T00:00:00Z",
            "published_at": "2026-10-25T09:12:00Z",
            "last_bumped_at": null,
            "published_or_bumped_at": "2026-10-25T09:12:00Z",
            "sorting_score": 0.82,
            "platform": "blocket",
            "display_street_number": true,
            "landlord_badges": [],
            "location": {
                "id": "2210451",
                "locality": "G\u00f6teborg",
                "country_code": "SE",
                "street": "Karl Johansgatan",
                "street_number": "12",
                "latitude": 57.6948,
                "longitude": 11.9189
            },
            "images": [
                {
                    "id": "22202803",
                    "url": "https://example.com/home.jpg",
                    "type": "home_picture",
                    "order": 1,
                    "primary": null
                }
            ]
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 1,
        "filtered_out": 0
    }
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Page Out of Range

The `page` lies so far past the last page that Blocket Bostad reports no total (`page_out_of_range`). A page just past the end returns an empty list with the real total instead. Non-billable.

{
    "meta": {
        "attempts": 1,
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "page_out_of_range",
        "message": "Page 20000 is past the last page of this search."
    },
    "success": false
}
422

Unknown Area

The `area` value matches no Swedish Blocket Bostad area (`unknown_area`). The source would ignore it and return every home in the country, so the request is rejected. Up to five suggestions are returned. Non-billable.

{
    "meta": {
        "attempts": 0,
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "unknown_area",
        "message": "Unknown area. Use a name or identifier from /api/blocket-bostad/location-autocomplete.",
        "suggestions": [
            {
                "name": "G\u00f6teborg",
                "identifier": "se/g\u00f6teborg"
            }
        ]
    },
    "success": false
}
422

Validation Error

A query parameter is missing, unknown or unusable. Unknown parameters are rejected, never ignored. Non-billable.

{
    "errors": {
        "sort": [
            "The selected sort is invalid."
        ]
    },
    "message": "The sort must be one of the supported values."
}
503

Upstream Unavailable

Blocket Bostad could not be reached after retries, answered with an error, or its area list is not available (`upstream_unavailable`, `upstream_blocked`, `parser_drift`, `area_list_unavailable`). Retryable and never billed. Clients are never rate limited.

{
    "meta": {
        "attempts": 3,
        "billable": false,
        "retryable": true,
        "endpoint_family": "search"
    },
    "error": {
        "code": "upstream_unavailable",
        "message": "Blocket Bostad is temporarily unavailable. Please retry."
    },
    "success": false
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Try It Live

Test this endpoint in our interactive playground with real data.