BlocketAPI
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.
💁♀️ 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.
| 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 callingstore_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".
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
- Source repo: https://github.com/dunderrrrrr/blocket_api
- PyPI: https://pypi.org/project/blocket-api/
