# Hemnet API

> Every Hemnet endpoint on Cotlet: inputs, JSON Schema, cURL, Python and Node.js examples and an example response for each call.

Source: https://cotlet.dev/docs/api/hemnet

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

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: https://cotlet.dev/integrations/hemnet-api-mcp-server

## Endpoints

| 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

`POST https://cotlet.dev/api/v1/hemnet/search_listings`

Access: read.

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 | Required | Description |
|---|---|---|---|
| `location` | string | yes | Area, municipality or street, e.g. "Vasastan, Stockholm". |
| `housing_types` | string[] | no | Any of apartment, villa, townhouse, holiday_home, plot, farm. Default: all. |
| `price_min` | integer | no | Minimum asking price in SEK. |
| `price_max` | integer | no | Maximum asking price in SEK. |
| `rooms_min` | integer | no | Minimum number of rooms. |
| `living_area_min` | integer | no | Minimum living area in m². |
| `include_upcoming` | boolean | no | Include homes coming to market. Default: true. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "search_listings", {"location":"Vasastan, Stockholm"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'search_listings', {"location":"Vasastan, Stockholm"});
```

**CLI**

```bash
cotlet call hemnet search_listings --data '{"location":"Vasastan, Stockholm"}'
```

### Example response

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/get_listing`

Access: read.

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 | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID from search_listings or list_saved_homes. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "get_listing", {"listing_id":"listing_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'get_listing', {"listing_id":"listing_8c41d2"});
```

**CLI**

```bash
cotlet call hemnet get_listing --data '{"listing_id":"listing_8c41d2"}'
```

### Example response

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/search_sold_prices`

Access: read.

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 | Required | Description |
|---|---|---|---|
| `location` | string | yes | Area, municipality or street, e.g. "Vasastan, Stockholm". |
| `housing_types` | string[] | no | Any of apartment, villa, townhouse, holiday_home, plot, farm. |
| `sold_since` | date | no | Only homes sold on or after this date. |
| `rooms_min` | integer | no | Minimum number of rooms. |
| `limit` | integer | no | 1 to 100. Default: 50. |

### Request

**cURL**

```bash
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}'
```

**Python**

```python
result = client.call("hemnet", "search_sold_prices", {"location":"Vasastan, Stockholm","housing_types":["apartment"],"rooms_min":3,"sold_since":"2026-01-01","limit":100})
```

**Node.js**

```js
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});
```

**CLI**

```bash
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

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/list_saved_homes`

Access: read.

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 | Required | Description |
|---|---|---|---|
| `collection_id` | string | no | Only homes in this collection, from list_collections. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/hemnet/list_saved_homes \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("hemnet", "list_saved_homes")
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'list_saved_homes');
```

**CLI**

```bash
cotlet call hemnet list_saved_homes
```

### Example response

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/list_collections`

Access: read.

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**

```bash
curl -X POST https://cotlet.dev/api/v1/hemnet/list_collections \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("hemnet", "list_collections")
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'list_collections');
```

**CLI**

```bash
cotlet call hemnet list_collections
```

### Example response

```json
{
  "collections": [
    {
      "collection_id": "col_flytt27",
      "name": "Flytt 2027",
      "homes": 2,
      "shared_with": [
        "Maria"
      ]
    },
    {
      "collection_id": "col_sommar",
      "name": "Sommarstuga",
      "homes": 0,
      "shared_with": []
    }
  ]
}
```

## List upcoming viewings

`POST https://cotlet.dev/api/v1/hemnet/list_upcoming_viewings`

Access: read.

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 | Required | Description |
|---|---|---|---|
| `until` | date | no | Only viewings up to this date. Default: 14 days ahead. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "list_upcoming_viewings", {"until":"2026-10-18"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'list_upcoming_viewings', {"until":"2026-10-18"});
```

**CLI**

```bash
cotlet call hemnet list_upcoming_viewings --data '{"until":"2026-10-18"}'
```

### Example response

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/list_saved_searches`

Access: read.

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**

```bash
curl -X POST https://cotlet.dev/api/v1/hemnet/list_saved_searches \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("hemnet", "list_saved_searches")
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'list_saved_searches');
```

**CLI**

```bash
cotlet call hemnet list_saved_searches
```

### Example response

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/list_followed_homes`

Access: read.

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**

```bash
curl -X POST https://cotlet.dev/api/v1/hemnet/list_followed_homes \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("hemnet", "list_followed_homes")
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'list_followed_homes');
```

**CLI**

```bash
cotlet call hemnet list_followed_homes
```

### Example response

```json
{
  "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
        }
      ]
    }
  ]
}
```

## Save home

`POST https://cotlet.dev/api/v1/hemnet/save_home`

Access: write. Confirm: waits for the user's OK before it runs.

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 | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID from search_listings or list_saved_homes. |
| `collection_id` | string | no | Collection from list_collections. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "save_home", {"listing_id":"listing_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'save_home', {"listing_id":"listing_8c41d2"});
```

**CLI**

```bash
cotlet call hemnet save_home --data '{"listing_id":"listing_8c41d2"}'
```

### Example response

```json
{
  "listing_id": "l_21730488",
  "saved": true,
  "collection_id": "col_flytt27"
}
```

## Remove saved home

`POST https://cotlet.dev/api/v1/hemnet/remove_saved_home`

Access: write.

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 | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID from search_listings or list_saved_homes. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "remove_saved_home", {"listing_id":"listing_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'remove_saved_home', {"listing_id":"listing_8c41d2"});
```

**CLI**

```bash
cotlet call hemnet remove_saved_home --data '{"listing_id":"listing_8c41d2"}'
```

### Example response

```json
{
  "listing_id": "l_21644102",
  "saved": false
}
```

## Create saved search

`POST https://cotlet.dev/api/v1/hemnet/create_saved_search`

Access: write.

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 | Required | Description |
|---|---|---|---|
| `location` | string | yes | Area, municipality or street, e.g. "Vasastan, Stockholm". |
| `filters` | object | no | Any of housing_types, price_min, price_max, rooms_min, living_area_min. |
| `notify_by` | enum | no | email or push. Default: email. |
| `frequency` | enum | no | live or summary. Default: summary. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
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"})
```

**Node.js**

```js
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"});
```

**CLI**

```bash
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

```json
{
  "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

`POST https://cotlet.dev/api/v1/hemnet/delete_saved_search`

Access: write.

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 | Required | Description |
|---|---|---|---|
| `saved_search_id` | string | yes | Saved search ID from list_saved_searches. |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "delete_saved_search", {"saved_search_id":"saved_search_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'delete_saved_search', {"saved_search_id":"saved_search_8c41d2"});
```

**CLI**

```bash
cotlet call hemnet delete_saved_search --data '{"saved_search_id":"saved_search_8c41d2"}'
```

### Example response

```json
{
  "saved_search_id": "ss_48213",
  "deleted": true
}
```

## Follow home

`POST https://cotlet.dev/api/v1/hemnet/follow_home`

Access: write.

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 | Required | Description |
|---|---|---|---|
| `address` | string | yes | Street address with town, e.g. "Storgatan 1, Uppsala". |

### Request

**cURL**

```bash
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"}'
```

**Python**

```python
result = client.call("hemnet", "follow_home", {"address":"Storgatan 1, Uppsala"})
```

**Node.js**

```js
const result = await cotlet.call('hemnet', 'follow_home', {"address":"Storgatan 1, Uppsala"});
```

**CLI**

```bash
cotlet call hemnet follow_home --data '{"address":"Storgatan 1, Uppsala"}'
```

### Example response

```json
{
  "address": "Storgatan 1, Uppsala",
  "following": true,
  "estimated_value_sek": 3980000
}
```
