Skip to content

dunderrrrrr/blocket_api

Repository files navigation

BlocketAPI

PyPI version License Python PyPI - Downloads

BlocketAPI allows users to query saved searches, known as "Bevakningar", on blocket.se. This means you can either retrieve results from a specific saved search or list all listings/ads across all saved searches. The results from these queries are returned in a json format.

Blocket is one of Sweden's largest online marketplaces. It was founded in 1996 and allows users to buy and sell a wide range of items, including cars, real estate, jobs, services, and second-hand goods. The platform is known for its extensive reach and user-friendly interface, making it a popular choice for Swedes looking to purchase or sell items quickly and efficiently.

✨ Features

  • List saved searches, called "Bevakningar".
  • Get listings from all or a specific saved search.
  • Search for anything on Blocket with filters for region and category.
  • Get vehicle information, price evaluation and search for vehicles with multiple filters.
  • Search for homes with filters for city, home type and more.
  • Search for stores and get a specific store's listings.

🧑‍💻️ Install

BlocketAPI is available on PyPI.

pip install blocket-api

💁‍♀️ Usage

>>> from blocket_api import BlocketAPI
>>> api = BlocketAPI("YourBlocketTokenHere")
>>> print(api.saved_searches())
...
>>> print(BlocketAPI().custom_search("saab")) # no token required
...

Some calls require a bearerToken. However, some calls are public and don't require a token.

Where token?

Function Token required Description
api.saved_searches() 🔐 Yes List your saved searches (bevakningar)
api.get_listings() 🔐 Yes List items related to a saved search
api.custom_search() 👏 No Search for everything on Blocket and filter by region
api.motor_search() 👏 No Advanced search for car-listings.
api.price_eval() 👏 No Vehicle purchase valuation and details.
api.home_search() 👏 No Query home listings.
api.store_search() 👏 No Search for a store.
api.get_store_listings() 👏 No Get listings from a specific store.

🤓 Detailed usage

saved_searches()

Saved searches are your so called "Bevakningar" and can be found here. Each saved search has and unique id which can be used as a parameter to get_listings(), see below.

>>> api.saved_searches()
[
   {
      "id":"4150081",
      "new_count":0,
      "total_count":41,
      "push_enabled":false,
      "push_available":true,
      "query":"cg=1020&q=buggy&st=s",
      "name":"\"buggy\", Bilar säljes i hela Sverige"
   },
]

get_listings(search_id, limit)

Returns all listings related to a saved search.

Parameters:

  • search_id (int, optional) - Get listings for a specific saved search. If not provided, all saved searches will be combined.
  • limit (int, optional) - Limit number of results returned, max is 99.
>>> api.get_listings(4150081)
{
   "data":[
      {
         "ad":{
            "ad_id":"1401053984",
            "list_id":"1401053984",
            "zipcode":"81290",
            "ad_status":"active",
            "list_time":"2024-07-15T19:07:16+02:00",
            "subject":"Volkswagen 1500 lim 113 chassi",
            "body":"Säljer ett chassi/bottenplatta till en volkswagen 1500 lim 113 1967, blästrat och målat.\nFinns en beach buggy kaross att få med om man vill det. \nReg nmr ABC123",
            "price":{
               "value":10000,
               "suffix":"kr"
            },
            ...
         },
      },
   ],
   "total_count":41,
   "timestamp":"2024-07-16T08:08:43.810828006Z",
   "total_page_count":1
}

custom_search(search_query, region, limit)

Make a custom search through out all of blocked. A region can be passed in as parameter for filtering.

Parameters:

  • search_query (str, required) - A string to search for.
  • region (enum, optional) - Filter results on a region, default is all of Sweden.
  • category (enum, optional) - Filter for a specific category, ex. Category.for_hemmet.
  • limit (int, optional) - Limit number of results returned, max is 99.
>>> from blocket_api import Region
>>> api.custom_search("saab", Region.blekinge) # search for term "saab" in region of "Blekinge"
{
   "data":[
      {
         "ad_id":"1401038836",
         "ad_status":"active",
         "advertiser":{
            "account_id":"684279",
            "name":"Stefan Ingves",
            "type":"private"
         },
         ...
         "location":[
            {
               "id":"22",
               "name":"Blekinge",
               "query_key":"r"
            },
            {
               "id":"256",
               "name":"Ronneby",
               "query_key":"m"
            }
         ],
         ...
      }
    ]
}

motor_search(page, make, fuel, chassi, price, modelYear, milage, gearbox)

To query listings related to a specific car, supply the following parameters:

  • page (int, required) - Results are split in pages, set page number here.
  • make (List[MAKE_OPTIONS]) - Filter a specific make, ex. Audi.
  • fuel (Optional[List[FUEL_OPTIONS]]) - Filter a specific fuel, ex. Diesel.
  • chassi (Optional[List[CHASSI_OPTIONS]]) - Filter a specific chassi, ex. Cab.
  • price (Optional[Tuple[int, int]]) - Set price range, ex. (50000, 100000).
  • modelYear (Optional[Tuple[int, int]]) - Set model year range, ex. (2000, 2020).
  • milage (Optional[Tuple[int, int]]) - Set milage range, ex. (1000, 2000).
  • gearbox (Optional[GEARBOX_OPTIONS]) - Filter a specific gearbox, ex. Automat.
>>> api.motor_search(
    make=["Audi", "Ford"],
    fuel=["Diesel"],
    chassi=["Cab"],
    price=(50000, 100000),
    page=1,
)
...

price_eval(registration_number)

Query price evaluation for a specific vehicle by using cars registration number (ABC123). This returns company and private estimated prices, car information, and more. The api queries same endpoint as Blockets "värdera bil" service.

  • registration_number (str, required) - Registration number of the vehicle.
>>> api.price_eval("ABC123")
{
   "registration_number": "ABC123",
   "private_valuation": 108155,
   "company_valuation": 108155,
   "car_info": {
      "make": "Volkswagen",
      "model": "Polo"
      ...
   }
   ...
}

home_search(city, type, order_by, ordering, offset)

Query home listings from bostad.blocket.se.

  • city (str, required) - City name, ex. Stockholm.
  • type (HomeType, optional) - Type of home, ex. HomeType.apartment.
  • order_by (OrderBy, optional) - Sorting order, ex. OrderBy.price.
  • ordering (HOME_SEARCH_ORDERING, optional) - Sorting order, ex. "descending".
  • offset (int, optional) - Offset for results, ex. 60.
>>> from blocket_api.qasa import HomeType, OrderBy
>>> api.home_search(
    city="Stockholm",
    type=HomeType.apartment,
    order_by=OrderBy.price,
    ordering="descending",
)
...

store_search(search_query, page)

Search for a store in Blocket stores from blocket.se/butiker.

  • search_query (str, required) - The name of the store.
  • page (int, optional) - The page number to return.
>>> api.store_search("Jannes Car and Kebab")
{
  "data": [
    {
      "store_id": "1234",
      "store_name": "Jannes Car and Kebab",
      ...
    },
    ...
  ]
}

get_store_listings(store_id, page)

Get listings from a specific store.

  • store_id (int, required) - The store id. Can be obtained by calling store_search().
  • page (int, optional) - The page number to return.
>>> api.get_store_listings(1234)
{
  "data": [
    {
      "ad_id": "1234",
      "price": 316000,
      "body": "A very nice car.",
      "images": [],
      ...
    },
    ...
  ]
}

🔐 Blocket API token

There are two ways to acquire your token:

  • Log in to Blocket.se with your credentials using any web browser.
  • Go to this URL and copy the value of bearerToken.

If there's a better way of doing this, feel free to help out in #2.

Your token can also be found in the request headers in the "Bevakningar"-section on Blocket.

  • Login to blocket.se: Sign in with your credentials.
  • Click "Bevakningar": Go to the "Bevakningar" section.
  • Inspect the page: Right-click the page and select "Inspect".
  • Open the Network tab: Switch to the Network tab in the Developer Tools.
  • Find request headers: Locate a request where the domain is "api.blocket.se" and the file is "searches". Pretty much every request to api.blocket.se contains this auth-header, so any request will do.
  • Inspect request headers: Look at the request headers to find your token under "Authorization".

token

My token has never expired or changed during this project. However, if your're met with a 401 Unauthorized at some point, you may want to refresh your token by repeating the steps above.

📝 Notes