REST API reference
Hemnet API
13 endpoints for Hemnet. Each one is a POST with a JSON body, called with your API key.
- Base URL
- https://cotlet.dev/api/v1/hemnet
- Connects with
- Your own Hemnet account (Mitt Hemnet)
- Integration page
- Hemnet
| Endpoint | Access | Description |
|---|---|---|
| search_listings | read | Homes for sale and coming to market (kommande), with price, fee, rooms and area. |
| get_listing | read | Full listing: price, monthly fee, area, rooms, viewing times, bidding status and broker. |
| search_sold_prices | read | Sold homes (slutpriser) with final price, asking price and sale date. |
| list_saved_homes | read | Homes you saved, with collection, status (for sale, bidding, sold) and final price when sold. |
| list_collections | read | Your collections (samlingar) of saved homes, with who they are shared with. |
| list_upcoming_viewings | read | Viewing times of your saved homes, soonest first, with address and broker. |
| list_saved_searches | read | Your saved searches with filters and notification settings. |
| list_followed_homes | read | Your own home and other homes you follow, with the value Hemnet shows over time. |
| save_home | write | Save a listing to your saved homes, optionally into one of your collections. |
| remove_saved_home | write | Remove a listing from your saved homes. |
| create_saved_search | write | Save a search and get notified about new homes that match it. |
| delete_saved_search | write | Delete one of your saved searches and its notifications. |
| follow_home | write | Follow the value of any home by address, on the market or not. |
Search listings
readPOST https://cotlet.dev/api/v1/hemnet/search_listings
Returns homes for sale in an area that match your filters, and homes coming to market unless include_upcoming is false. Each item has the asking price, monthly fee, rooms and living area. Pages hold up to 50 homes; pass next_cursor back as cursor for the next page. Use listing_id with get_listing or save_home.
Parameters
| Name | Type | Description |
|---|---|---|
| location required | string | Area, municipality or street, e.g. "Vasastan, Stockholm". |
| housing_types | string[] | Any of apartment, villa, townhouse, holiday_home, plot, farm. Default: all. |
| price_min | integer | Minimum asking price in SEK. |
| price_max | integer | Maximum asking price in SEK. |
| rooms_min | integer | Minimum number of rooms. |
| living_area_min | integer | Minimum living area in m². |
| include_upcoming | boolean | Include homes coming to market. Default: true. |
| cursor | string | Next page cursor from the previous call. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/search_listings \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"location":"Vasastan, Stockholm"}' result = client.call("hemnet", "search_listings", {"location":"Vasastan, Stockholm"}) const result = await cotlet.call('hemnet', 'search_listings', {"location":"Vasastan, Stockholm"}); cotlet call hemnet search_listings --data '{"location":"Vasastan, Stockholm"}' Example response
{
"listings": [
{
"listing_id": "l_21730488",
"address": "Karlbergsvägen 120, Vasastan, Stockholm",
"type": "apartment",
"rooms": 3,
"living_area_m2": 68,
"asking_price_sek": 5450000,
"monthly_fee_sek": 4120,
"status": "for_sale"
}
],
"next_cursor": null
} Get listing
readPOST https://cotlet.dev/api/v1/hemnet/get_listing
Returns one listing as the listing page shows it: asking price, monthly fee, rooms, living area, the broker, viewing times and whether bidding has started. Use it after search_listings to read a home in full.
Parameters
| Name | Type | Description |
|---|---|---|
| listing_id required | string | Listing ID from search_listings or list_saved_homes. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/get_listing \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"listing_id":"listing_8c41d2"}' result = client.call("hemnet", "get_listing", {"listing_id":"listing_8c41d2"}) const result = await cotlet.call('hemnet', 'get_listing', {"listing_id":"listing_8c41d2"}); cotlet call hemnet get_listing --data '{"listing_id":"listing_8c41d2"}' Example response
{
"listing_id": "l_21730488",
"address": "Karlbergsvägen 120, Vasastan, Stockholm",
"type": "apartment",
"rooms": 3,
"living_area_m2": 68,
"asking_price_sek": 5450000,
"monthly_fee_sek": 4120,
"bidding_started": false,
"viewings": [
"2026-10-17T12:00:00+02:00"
],
"broker": "Exempel Mäkleri, Vasastan",
"url": "https://www.hemnet.se/bostad/l_21730488"
} Search sold prices
readPOST https://cotlet.dev/api/v1/hemnet/search_sold_prices
Returns homes sold in an area, with final price, asking price, how far the sale landed above or below asking, and the sale date. Narrow it with sold_since, housing type and rooms. Pages hold up to 100 homes.
Parameters
| Name | Type | Description |
|---|---|---|
| location required | string | Area, municipality or street, e.g. "Vasastan, Stockholm". |
| housing_types | string[] | Any of apartment, villa, townhouse, holiday_home, plot, farm. |
| sold_since | date | Only homes sold on or after this date. |
| rooms_min | integer | Minimum number of rooms. |
| limit | integer | 1 to 100. Default: 50. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/search_sold_prices \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"location":"Vasastan, Stockholm","housing_types":["apartment"],"rooms_min":3,"sold_since":"2026-01-01","limit":100}' result = client.call("hemnet", "search_sold_prices", {"location":"Vasastan, Stockholm","housing_types":["apartment"],"rooms_min":3,"sold_since":"2026-01-01","limit":100}) const result = await cotlet.call('hemnet', 'search_sold_prices', {"location":"Vasastan, Stockholm","housing_types":["apartment"],"rooms_min":3,"sold_since":"2026-01-01","limit":100}); cotlet call hemnet search_sold_prices --data '{"location":"Vasastan, Stockholm","housing_types":["apartment"],"rooms_min":3,"sold_since":"2026-01-01","limit":100}' Example response
{
"sold": [
{
"address": "Odengatan 40, Vasastan, Stockholm",
"rooms": 3,
"living_area_m2": 71,
"asking_price_sek": 4250000,
"final_price_sek": 4500000,
"over_asking_pct": 5.9,
"sold_on": "2026-09-12"
},
{
"address": "Sveavägen 98, Vasastan, Stockholm",
"rooms": 3,
"living_area_m2": 74,
"asking_price_sek": 5200000,
"final_price_sek": 5150000,
"over_asking_pct": -1,
"sold_on": "2026-06-03"
}
]
} List saved homes
readPOST https://cotlet.dev/api/v1/hemnet/list_saved_homes
Returns the homes in your saved homes, with the collection each is in. Status is for_sale, bidding or sold; a sold home carries its final price. Pass collection_id to see one collection only.
Parameters
| Name | Type | Description |
|---|---|---|
| collection_id | string | Only homes in this collection, from list_collections. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/list_saved_homes \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("hemnet", "list_saved_homes") const result = await cotlet.call('hemnet', 'list_saved_homes'); cotlet call hemnet list_saved_homes Example response
{
"saved_homes": [
{
"listing_id": "l_21730488",
"address": "Karlbergsvägen 120, Vasastan, Stockholm",
"collection": "Flytt 2027",
"status": "for_sale",
"asking_price_sek": 5450000
},
{
"listing_id": "l_21644102",
"address": "Hornsgatan 55, Södermalm, Stockholm",
"collection": "Flytt 2027",
"status": "sold",
"final_price_sek": 6100000
}
]
} List collections
readPOST https://cotlet.dev/api/v1/hemnet/list_collections
Returns your collections with the number of homes in each and the people each is shared with. Use collection_id with list_saved_homes and save_home.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/list_collections \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("hemnet", "list_collections") const result = await cotlet.call('hemnet', 'list_collections'); cotlet call hemnet list_collections Example response
{
"collections": [
{
"collection_id": "col_flytt27",
"name": "Flytt 2027",
"homes": 2,
"shared_with": [
"Maria"
]
},
{
"collection_id": "col_sommar",
"name": "Sommarstuga",
"homes": 0,
"shared_with": []
}
]
} POST https://cotlet.dev/api/v1/hemnet/list_upcoming_viewings
Returns the viewings of your saved homes that have not happened yet, soonest first, with address and broker. It looks 14 days ahead unless you set until.
Parameters
| Name | Type | Description |
|---|---|---|
| until | date | Only viewings up to this date. Default: 14 days ahead. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/list_upcoming_viewings \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"until":"2026-10-18"}' result = client.call("hemnet", "list_upcoming_viewings", {"until":"2026-10-18"}) const result = await cotlet.call('hemnet', 'list_upcoming_viewings', {"until":"2026-10-18"}); cotlet call hemnet list_upcoming_viewings --data '{"until":"2026-10-18"}' Example response
{
"viewings": [
{
"listing_id": "l_21730488",
"address": "Karlbergsvägen 120, Vasastan, Stockholm",
"starts_at": "2026-10-17T12:00:00+02:00",
"broker": "Exempel Mäkleri, Vasastan",
"bidding_started": false
}
]
} List saved searches
readPOST https://cotlet.dev/api/v1/hemnet/list_saved_searches
Returns your saved searches with their filters, how you are notified (email or push) and how often. Use saved_search_id with delete_saved_search.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/list_saved_searches \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("hemnet", "list_saved_searches") const result = await cotlet.call('hemnet', 'list_saved_searches'); cotlet call hemnet list_saved_searches Example response
{
"saved_searches": [
{
"saved_search_id": "ss_48213",
"location": "Täby kommun",
"filters": {
"housing_types": [
"villa"
],
"price_max": 9000000,
"rooms_min": 5
},
"notify_by": "push",
"frequency": "live"
}
]
} List followed homes
readPOST https://cotlet.dev/api/v1/hemnet/list_followed_homes
Returns the homes whose value you follow, your own and others, each with the value Hemnet shows and how it changed over time. The value is Hemnet's estimate. Homes that are not for sale can be followed too.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/list_followed_homes \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("hemnet", "list_followed_homes") const result = await cotlet.call('hemnet', 'list_followed_homes'); cotlet call hemnet list_followed_homes Example response
{
"followed_homes": [
{
"address": "Storgatan 1, Uppsala",
"estimated_value_sek": 3980000,
"change_since_start_pct": 2.4,
"history": [
{
"date": "2026-04-01",
"value_sek": 3890000
},
{
"date": "2026-10-01",
"value_sek": 3980000
}
]
}
]
} POST https://cotlet.dev/api/v1/hemnet/save_home
Saves a listing to your saved homes, and into a collection when collection_id is set. People a collection is shared with see the new home, which is why this asks first. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| listing_id required | string | Listing ID from search_listings or list_saved_homes. |
| collection_id | string | Collection from list_collections. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/save_home \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"listing_id":"listing_8c41d2"}' result = client.call("hemnet", "save_home", {"listing_id":"listing_8c41d2"}) const result = await cotlet.call('hemnet', 'save_home', {"listing_id":"listing_8c41d2"}); cotlet call hemnet save_home --data '{"listing_id":"listing_8c41d2"}' Example response
{
"listing_id": "l_21730488",
"saved": true,
"collection_id": "col_flytt27"
} Remove saved home
writePOST https://cotlet.dev/api/v1/hemnet/remove_saved_home
Removes a listing from your saved homes and from its collection. It runs without asking: nobody is notified and save_home undoes it in one call.
Parameters
| Name | Type | Description |
|---|---|---|
| listing_id required | string | Listing ID from search_listings or list_saved_homes. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/remove_saved_home \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"listing_id":"listing_8c41d2"}' result = client.call("hemnet", "remove_saved_home", {"listing_id":"listing_8c41d2"}) const result = await cotlet.call('hemnet', 'remove_saved_home', {"listing_id":"listing_8c41d2"}); cotlet call hemnet remove_saved_home --data '{"listing_id":"listing_8c41d2"}' Example response
{
"listing_id": "l_21644102",
"saved": false
} Create saved search
writePOST https://cotlet.dev/api/v1/hemnet/create_saved_search
Creates a saved search and returns how many homes match it now. Notifications go to you by email or push, live or as a summary. It runs without asking: it reaches no one else and delete_saved_search undoes it in one call.
Parameters
| Name | Type | Description |
|---|---|---|
| location required | string | Area, municipality or street, e.g. "Vasastan, Stockholm". |
| filters | object | Any of housing_types, price_min, price_max, rooms_min, living_area_min. |
| notify_by | enum | email or push. Default: email. |
| frequency | enum | live or summary. Default: summary. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/create_saved_search \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"location":"Täby","filters":{"housing_types":["villa"],"price_max":9000000,"rooms_min":5},"notify_by":"push","frequency":"live"}' result = client.call("hemnet", "create_saved_search", {"location":"Täby","filters":{"housing_types":["villa"],"price_max":9000000,"rooms_min":5},"notify_by":"push","frequency":"live"}) const result = await cotlet.call('hemnet', 'create_saved_search', {"location":"Täby","filters":{"housing_types":["villa"],"price_max":9000000,"rooms_min":5},"notify_by":"push","frequency":"live"}); cotlet call hemnet create_saved_search --data '{"location":"Täby","filters":{"housing_types":["villa"],"price_max":9000000,"rooms_min":5},"notify_by":"push","frequency":"live"}' Example response
{
"saved_search_id": "ss_48213",
"location": "Täby kommun",
"filters": {
"housing_types": [
"villa"
],
"price_max": 9000000,
"rooms_min": 5
},
"notify_by": "push",
"frequency": "live",
"matching_now": 37
} Delete saved search
writePOST https://cotlet.dev/api/v1/hemnet/delete_saved_search
Deletes one saved search and stops its notifications. It runs without asking: it reaches no one else, and create_saved_search with the same filters brings it back.
Parameters
| Name | Type | Description |
|---|---|---|
| saved_search_id required | string | Saved search ID from list_saved_searches. |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/delete_saved_search \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"saved_search_id":"saved_search_8c41d2"}' result = client.call("hemnet", "delete_saved_search", {"saved_search_id":"saved_search_8c41d2"}) const result = await cotlet.call('hemnet', 'delete_saved_search', {"saved_search_id":"saved_search_8c41d2"}); cotlet call hemnet delete_saved_search --data '{"saved_search_id":"saved_search_8c41d2"}' Example response
{
"saved_search_id": "ss_48213",
"deleted": true
} Follow home
writePOST https://cotlet.dev/api/v1/hemnet/follow_home
Adds a home to the homes whose value you follow, for sale or not. It changes only your own list, so it runs without asking. Unfollowing is done in the Hemnet app.
Parameters
| Name | Type | Description |
|---|---|---|
| address required | string | Street address with town, e.g. "Storgatan 1, Uppsala". |
Request
curl -X POST https://cotlet.dev/api/v1/hemnet/follow_home \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address":"Storgatan 1, Uppsala"}' result = client.call("hemnet", "follow_home", {"address":"Storgatan 1, Uppsala"}) const result = await cotlet.call('hemnet', 'follow_home', {"address":"Storgatan 1, Uppsala"}); cotlet call hemnet follow_home --data '{"address":"Storgatan 1, Uppsala"}' Example response
{
"address": "Storgatan 1, Uppsala",
"following": true,
"estimated_value_sek": 3980000
}