# Qasa Scraper - Nordic Rental Listings (`sian.agency/qasa-property-scraper`) Actor

Scrape qasa.com rental listings across Sweden, Norway and Finland. Rent, monthly cost, rooms, m², move-in dates, amenities, coordinates, landlord response rates and photos.

- **URL**: https://apify.com/sian.agency/qasa-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 rental listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Qasa Scraper — Nordic Rental Listings from Sweden, Norway & Finland 🔑

[![Store SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store Hemnet Scraper](https://img.shields.io/badge/Store-Hemnet%20Scraper-1AE392)](https://apify.com/sian.agency/hemnet-property-scraper?fpr=sian) [![Store FINN.no Property](https://img.shields.io/badge/Store-FINN.no%20Property-0063FB)](https://apify.com/sian.agency/finn-no-property-scraper?fpr=sian) [![Store Apartments.com](https://img.shields.io/badge/Store-Apartments.com-1AE392)](https://apify.com/sian.agency/apartments-com-property-scraper?fpr=sian)

#### 🎉 Every home to rent on Qasa — 23,900 live listings across three countries, 500 to a request

##### Built for rent analysts, relocation teams and anyone who needs Nordic rental data in one schema

### 🔎 What is the Qasa Scraper — and when should you use it?

The **Qasa Scraper** turns every long-term rental listing published on qasa.com across Sweden, Norway and Finland into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** rent, the all-in monthly cost, rooms, floor area in m², move-in and move-out dates, tenancy length, furnished and shared flags, first-hand contract status, coordinates and photos on any Nordic rental listing. Switch on detail expansion and each row also carries build year, floor, energy class, tenure, renovation years, the full amenity list, which bills are included in the rent, the English description and how fast the landlord answers applications.

**Use something else when:** the homes you want are for sale rather than to rent. Use [Hemnet Scraper](https://apify.com/sian.agency/hemnet-property-scraper?fpr=sian) for the Swedish sale market, including the slutpriser archive of what homes actually sold for. Use [FINN.no Property Scraper](https://apify.com/sian.agency/finn-no-property-scraper?fpr=sian) for Norway's largest portal, where the sale listings Qasa does not carry are advertised. Use [Apartments.com Scraper](https://apify.com/sian.agency/apartments-com-property-scraper?fpr=sian) for the same rental questions asked of the United States. This actor reads what qasa.com shows the public. Applications, messages, saved searches and anything behind a Qasa login are out of scope, and so are holiday and short-stay lets, which sit outside the long-term index entirely.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/qasa-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Nordic rental listings from Qasa using the Apify Actor `sian.agency/qasa-property-scraper`.

Use it when I need: rent, the all-in monthly cost, rooms, floor area in m², move-in and move-out dates, tenancy length, furnished and shared flags, first-hand contract status, coordinates and photos on any Nordic rental listing. Switch on detail expansion and each row also carries build year, floor, energy class, tenure, renovation years, the full amenity list, which bills are included in the rent, the English description and how fast the landlord answers applications.

Don't use it when: the homes you want are for sale rather than to rent — use hemnet-property-scraper or finn-no-property-scraper or apartments-com-property-scraper instead.

How to call it: pick a `market` — sweden, norway or finland — and an `operation`. `search` sweeps the index and returns a row per home; put a place in `location` such as Stockholm, Nacka kommun or Södermalm, or leave it empty to take the whole market. `detail` expands qasa.com addresses you already have via `listingUrls`. Narrow with `homeTypes`, `rentMin` and `rentMax`, `roomsMin` and `roomsMax`, `areaMin` and `areaMax`, `moveInFrom`, `minRentalMonths`, `furnished`, `sharedHomes`, `petsAllowed`, `wheelchairAccessible`, `contractTypes` and `householdSize`, then order the result with `sort`. `includeDetails` adds build year, energy class, amenities and landlord response rates to every row for an extra charge. A search you already built on qasa.com can be pasted into `searchUrls` instead.

Start with this input:
{
  "operation": "search",
  "market": "sweden",
  "location": "Stockholm",
  "homeTypes": [
    "apartment"
  ],
  "maxResults": 100
}

Ask me which of the three markets to cover, and which city or district inside it, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Find two-room apartments in Göteborg under 15,000 SEK a month that allow pets and are free from October.*
- *Compare cost per m² for furnished and unfurnished one-room flats in Stockholm, Oslo and Helsinki.*
- *List every first-hand contract published on Qasa in Sweden this week, with the landlord's response rate on each.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/qasa-property-scraper.md](https://apify.com/sian.agency/qasa-property-scraper.md).

### 📋 Overview

**Qasa is where the Nordic rental market moved.** Blocket closed its own property vertical and handed it to Qasa, so the Swedish rows here carry listings that started life on Blocket and HomeQ as well as Qasa itself. This Actor reads that index directly and gives you a flat row per home.

**What you get:**

- ✅ **Three countries, one schema**: Sweden, Norway and Finland, 23,900 live homes, each row in that market's own currency.
- ⚡ **500 listings per request**: a whole-city sweep finishes in seconds, not in a queue of paginated page loads.
- 🎯 **Places by name**: type Södermalm, Bromma, Nacka kommun, Grünerløkka or Kallio. No location ids to look up.
- 💰 **Pay per listing returned**: nothing is charged for a search that matched nothing or an input we could not read.
- 💎 **39 amenity values**: balcony, elevator, dishwasher, communal sauna, bike room, EV charger and more, on the detail expansion.
- ✨ **Landlord responsiveness**: response rate and typical answer time, so you can tell an active landlord from a dormant listing.

### ✨ Features

- 🔍 **Rental Listings search**: sweep a market or an area and get every live home to rent.
- 📄 **Listing Detail**: expand any qasa.com address with build year, floor, energy class, tenure and the full amenity list.
- 🌍 **Market selector**: Sweden, Norway and Finland, each with its own currency and place index.
- 🎚️ **Filters that map to the site's own**: home type, monthly cost, rooms, size, move-in date, minimum rental length, furnished, shared, pets, step-free access, contract type and household size.
- 🌐 **Paste a search address**: copy a find-home URL from your browser and the Actor reads its filters.
- 🧭 **Coordinates on every row**: latitude and longitude, ready for a map or a distance calculation.
- 📸 **Photos and floor plans**: up to 78 images per listing, primary photo first.
- 🇬🇧 **English descriptions**: Qasa's own translations come through on the detail expansion.
- 📊 **Cost per m² computed**: the comparison number, already worked out on every row.
- 🛡️ **Loud on bad input**: an area Qasa does not recognise stops the run instead of quietly returning the whole country.

### 🎬 Quick Start

Pick a market, type a place, press Start. Rows land in your dataset as they are read, and a run report is written to the key-value store with links you can copy.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~qasa-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","market":"sweden","location":"Stockholm","maxResults":100}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your market

Sweden, Norway or Finland. Rent comes back in SEK, NOK or EUR accordingly.

#### Step 2: Name a place

A city, a kommun, a län or a district. Leave it empty to sweep the whole market.

#### Step 3: Press Start

Add filters if you want them, set a row budget, and run.

**That's it! In under a minute, you'll have:**

- Every matching home with rent, size, rooms and move-in dates
- Coordinates and photos on each row
- A dataset you can export to JSON, CSV or Excel

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | `search` for rental listings, `detail` to expand addresses you already have |
| `market` | string | No | `sweden`, `norway` or `finland` |
| `location` | string | No | Place name — a city, kommun, län or district |
| `homeTypes` | array | No | `apartment`, `house`, `terrace_house`, `cottage`, `room`, `corridor`, `duplex`, `loft`, `bedsit`, `own`, `other` |
| `maxResults` | integer | No | Row budget for the whole run |
| `rentMin` / `rentMax` | integer | No | Monthly cost bounds, in the market's currency |
| `roomsMin` / `roomsMax` | integer | No | Room count bounds |
| `areaMin` / `areaMax` | integer | No | Floor area bounds in m² |
| `moveInFrom` | string | No | Earliest move-in date, `YYYY-MM-DD` |
| `minRentalMonths` | integer | No | Shortest acceptable tenancy |
| `furnished` | string | No | `any`, `yes` or `no` |
| `sharedHomes` | string | No | `any`, `only` or `exclude` |
| `petsAllowed` | boolean | No | Only homes where pets are allowed |
| `wheelchairAccessible` | boolean | No | Only step-free homes |
| `contractTypes` | array | No | `firsthand`, `studentHome`, `seniorHome`, `corporateHome` |
| `householdSize` | integer | No | Homes that accept this many people |
| `sort` | string | No | `newest`, `cheapest`, `most_expensive`, `largest`, `most_rooms`, `relevance` |
| `includeDetails` | boolean | No | Add build year, amenities and landlord responsiveness — billed per expanded listing |
| `listingUrls` | array | No | For `detail`: qasa.com addresses or bare listing ids |
| `searchUrls` | array | No | Paste find-home addresses copied from qasa.com |

**Example:**

```json
{
  "operation": "search",
  "market": "sweden",
  "location": "Södermalm",
  "homeTypes": ["apartment"],
  "rentMax": 15000,
  "roomsMin": 2,
  "moveInFrom": "2026-10-01",
  "maxResults": 500
}
```

**Expand listings you already have:**

```json
{
  "operation": "detail",
  "listingUrls": [
    "https://qasa.com/home/1415645",
    "https://qasa.com/se/sv/home/1167263"
  ]
}
```

### 📤 Output

Results are saved to the Apify dataset with **62 fields** including:

| Field | Type | Description |
|---|---|---|
| `listingId` | string | Qasa's own id for the home |
| `listingUrl` | string | Canonical qasa.com address |
| `propertyTitle` | string | Home type, rooms, size and city in one line |
| `monthlyCost` | integer | All-in figure the tenant pays |
| `rent` | integer | Bare rent before the service fee |
| `currency` | string | SEK, NOK or EUR |
| `costPerSqm` | number | Monthly cost divided by floor area |
| `roomCount` | number | Rooms, half rooms included |
| `squareMeters` | integer | Floor area |
| `locality` | string | City or town |
| `latitude` / `longitude` | number | Coordinates |
| `availableFrom` / `availableUntil` | string | Move-in and move-out dates |
| `firstHand` | boolean | First-hand contract rather than a sublet |
| `furnished` / `shared` | boolean | Furnishing and whether the home is shared |
| `sourcePlatform` | string | Where the listing originated — qasa, blocket, homeq |
| `amenities` | array | Up to 39 amenity values (detail expansion) |
| `includedBills` | array | Which of water, heating and electricity are in the rent |
| `landlordResponseRate` | number | Share of applications the landlord answers |

**Example:**

```json
{
  "listingId": "1422775",
  "listingUrl": "https://qasa.com/home/1422775",
  "propertyTitle": "Apartment, 1 room, 15 m² in Stockholm",
  "monthlyCost": 6568,
  "rent": 6200,
  "tenantFee": 368,
  "currency": "SEK",
  "costPerSqm": 437.87,
  "homeType": "apartment",
  "roomCount": 1,
  "squareMeters": 15,
  "locality": "Stockholm",
  "streetAddress": "Doktor Abelins Gata",
  "countryCode": "SE",
  "latitude": 59.3159297,
  "longitude": 18.0546896,
  "availableFrom": "2026-10-01T00:00:00Z",
  "isOpenEnded": true,
  "furnished": true,
  "shared": true,
  "firstHand": false,
  "petsAllowed": false,
  "sourcePlatform": "blocket",
  "publishedAt": "2026-07-26T06:47:01Z",
  "daysOnQasa": 42,
  "amenities": ["balcony", "bike_room", "elevator", "furniture", "internet", "recycling"],
  "includedBills": ["electricity"],
  "landlordName": "Åsa",
  "landlordResponseRate": 0.06,
  "imageCount": 9
}
```

### 💼 Use Cases & Examples

#### 1. Nordic Rent Benchmarking

**Rent analysts and proptech teams pricing the sublet market.**

**Input:** a city, no other filters, `maxResults` set high
**Output:** every live home with cost per m², furnished flag and floor area
**Use:** Sweden publishes no open rental price index for sublets. This is how you see what a two-room flat in Södermalm is actually being asked for this month.

#### 2. Relocation & Corporate Housing Search

**Mobility teams placing staff across the Nordics.**

**Input:** `moveInFrom`, `minRentalMonths`, `householdSize`, run once per market
**Output:** one sheet with rent, size, coordinates and landlord response rate in three currencies
**Use:** replaces three portals, three languages and three currencies with one export.

#### 3. Landlord & Property Manager Prospecting

**Agencies and service providers selling to rental stock owners.**

**Input:** a city, `includeDetails` on
**Output:** landlord first name, company where there is one, professional flag, time on platform and response rate
**Use:** filter for professional landlords and you have a working list of who manages rental stock in that city.

#### 4. Rental Market Monitoring

**Analysts tracking supply and time-to-let.**

**Input:** `sort: newest`, a modest `maxResults`, on a daily schedule
**Output:** what appeared since the last run, with published date, days listed and originating platform
**Use:** track supply, asking-rent drift and how fast homes disappear, week over week.

#### 5. Proptech & Portal Feeds

**Product teams building maps, comparison sites and pricing models.**

**Input:** a whole market, no place filter
**Output:** flat rows with coordinates, size, tenure, amenities and photos
**Use:** drops straight into a map layer, a CRM or a valuation model, with one schema for all three countries.

#### 6. Accessibility & Pet-Friendly Housing Search

**Charities, relocation advisors and anyone with a hard requirement.**

**Input:** `wheelchairAccessible` or `petsAllowed` set true
**Output:** only homes the landlord has marked accordingly
**Use:** the two filters that are hardest to apply by hand across thousands of listings.

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/qasa-property-scraper').call({
  operation: 'search',
  market: 'sweden',
  location: 'Stockholm',
  maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/qasa-property-scraper').call(
    run_input={
        'operation': 'search',
        'market': 'finland',
        'location': 'Helsinki',
        'maxResults': 100,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~qasa-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","market":"norway","location":"Oslo","maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: schedule the run, or fire it from a webhook
2. **HTTP Request**: call the Actor API
3. **Process**: read the JSON rows
4. **Action**: write to a sheet, alert on new listings, or push into your CRM

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run, with every field and every filter
- No credit card required
- Enough to check the schema fits before you commit

#### PAID Tier (Production Ready)

- **Unlimited** listings per run, up to the whole 23,900-home index
- 500 rows per request, so a city sweep takes seconds
- Pay per listing returned: a search that matched nothing costs nothing

💰 Priced at the same level as our Swedish for-sale Actor, so the sale and rental halves of the market cost the same to cover.

🔗 [View current pricing](https://apify.com/sian.agency/qasa-property-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: Does this cover Blocket's rental listings?**
A: Yes. Blocket closed its property vertical and moved it to Qasa. Swedish rows carry the platform each listing originated on, and you will see blocket, homeq and qasa among them.

**Q: Is this for rentals or for homes to buy?**
A: Rentals only. For Swedish homes for sale and sold prices, use our [Hemnet Scraper](https://apify.com/sian.agency/hemnet-property-scraper?fpr=sian).

**Q: Which countries does it cover?**
A: Sweden, Norway and Finland, which is every market Qasa operates. One market per run.

**Q: Can I search a specific neighbourhood?**
A: Yes. Type the district the way the site spells it — Södermalm, Bromma, Majorna, Grünerløkka, Kallio. If a name cannot be matched the run stops and tells you, rather than returning the whole country.

**Q: What does Listing Detail add?**
A: Build year, floor and building height, energy class, tenure, renovation years, the full amenity list, which bills are included, the English description, and the landlord's response rate and typical answer time.

**Q: How fresh is the data?**
A: It is read live on every run. A listing published minutes ago is in the next run.

**Q: Are holiday and short-stay lets included?**
A: No. This is the long-term rental index.

**Q: Do I get the exact street address?**
A: Street name, city and coordinates on every listing. The house number appears only where the landlord chose to publish it, which is Qasa's own privacy setting.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported directly from the Apify dataset.

### 🐛 Troubleshooting

**The run stopped saying Qasa has no area with that name**

- Spell the place the way qasa.com spells it, or use a broader one: the city instead of the district.
- Leave `location` empty to sweep the whole market.

**Fewer rows than I expected**

- Check `maxResults`, which is a whole-run budget rather than a per-place one.
- On the FREE tier every run stops at 25 rows.

**A listing came back as an error row**

- Homes are let and withdrawn constantly. Run a fresh search for the same area to get what is live today.

**No rows at all**

- Your filters may not overlap. Two bounds that contradict each other match nothing, so widen or clear one.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Qasa is a trademark of its respective owner. This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Qasa. It reads only listing pages that Qasa publishes openly, with no login and no personal account data.

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue on the [Actor's issues page](https://apify.com/sian.agency/qasa-property-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/qasa-property-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Rental Listings sweeps Qasa's index for a market and returns a flat row per home. Listing Detail expands specific homes with the fields the index does not carry.

## `market` (type: `string`):

Which Qasa market to search. Sweden is the largest by a wide margin (roughly 16,700 live homes), Finland is second (roughly 6,000) and Norway is smallest (roughly 1,100). Rent comes back in that market's own currency: SEK, NOK or EUR. A place name in the field below is matched inside this market.

## `location` (type: `string`):

Where to search, typed the way you would type it on Qasa: a city (Stockholm, Göteborg, Oslo, Helsinki), a kommun (Nacka kommun), a län (Skåne län) or a district (Södermalm, Bromma, Majorna). The name is matched against Qasa's own area index before the search runs, so nothing has to be looked up by hand. Leave it empty to sweep the whole market. If the name cannot be matched the run stops and tells you, rather than quietly returning the entire country.

## `homeTypes` (type: `array`):

Which kinds of home to include. Pick any combination; leave empty for every type. Apartment is by far the most common. Room and corridor are shared and student housing.

## `maxResults` (type: `integer`):

Stop after this many rows. Each call returns up to 500 rows, so the run stops at the first call that crosses your limit. The whole Swedish market is about 16,700 homes, so a number above that simply returns everything there is.

## `rentMin` (type: `integer`):

Lowest monthly cost to include, in the market's own currency (SEK, NOK or EUR). This is the all-in figure the tenant pays, not the bare rent. 0 means no lower bound.

## `rentMax` (type: `integer`):

Highest monthly cost to include, in the market's own currency. 0 means no upper bound.

## `roomsMin` (type: `integer`):

Fewest rooms to include. Nordic listings count every room, not only bedrooms, and half rooms are normal — a 2.5 rok is two rooms plus a small one. 0 means no lower bound.

## `roomsMax` (type: `integer`):

Most rooms to include. 0 means no upper bound.

## `areaMin` (type: `integer`):

Smallest floor area in square metres. 0 means no lower bound.

## `areaMax` (type: `integer`):

Largest floor area in square metres. 0 means no upper bound.

## `moveInFrom` (type: `string`):

Only return homes available from this date onwards, as YYYY-MM-DD. Leave empty to ignore move-in dates. Useful on a schedule: point it at next month and you see what is opening up rather than what has been sitting.

## `minRentalMonths` (type: `integer`):

Only return homes offered for at least this many months. Nordic sublets are frequently short, so this is the filter that separates a real tenancy from a three-month stopgap. 0 means any length.

## `furnished` (type: `string`):

Whether the home comes furnished. Furnished sublets carry a premium in all three markets, so this is also the switch for comparing the two halves of the market against each other.

## `petsAllowed` (type: `boolean`):

Return only homes where pets are allowed.

## `wheelchairAccessible` (type: `boolean`):

Return only homes the landlord has marked as wheelchair accessible.

## `sharedHomes` (type: `string`):

Shared homes are rooms in a flat or house with other tenants. Whole homes are rented to you alone. Choose which side of that line you want, or take both.

## `contractTypes` (type: `array`):

Restrict to particular contract kinds. Leave empty for all. First-hand contracts are the scarce and sought-after ones in Sweden, so this is a useful filter on its own.

## `householdSize` (type: `integer`):

Only return homes that accept a household of this many people. 0 means no restriction.

## `sort` (type: `string`):

Row order. Newest first is what you want on a schedule — the homes added since your last run come back at the top, so a small Max listings still catches everything new.

## `includeDetails` (type: `boolean`):

Expand every listing with the fields the index does not carry: build year, floor and building height, energy class, tenure, the full amenity list (balcony, elevator, dishwasher, sauna, parking, EV charger and 30 more), which bills are included in the rent, the English translation of the description, and how fast the landlord answers applications. Batched 25 listings to a request and billed as one Listing Detail event per expanded row.

## `listingUrls` (type: `array`):

Used by the Listing Detail operation: Qasa listing addresses to expand, for example https://qasa.com/home/1415645 or https://qasa.com/se/sv/home/1415645. A bare listing id such as 1415645 also works.

## `searchUrls` (type: `array`):

Paste search addresses copied straight from qasa.com instead of filling the fields above, for example https://qasa.com/se/sv/find-home?homeTypes=apartment\&searchAreas=Södermalm~Stockholm~se. Market, area, home type, rent, rooms, size and move-in date are all read off each address.

## Actor input object example

```json
{
  "operation": "search",
  "market": "sweden",
  "location": "Stockholm",
  "homeTypes": [],
  "maxResults": 100,
  "rentMin": 0,
  "rentMax": 0,
  "roomsMin": 0,
  "roomsMax": 0,
  "areaMin": 0,
  "areaMax": 0,
  "moveInFrom": "",
  "minRentalMonths": 0,
  "furnished": "any",
  "petsAllowed": false,
  "wheelchairAccessible": false,
  "sharedHomes": "any",
  "contractTypes": [],
  "householdSize": 0,
  "sort": "newest",
  "includeDetails": false,
  "listingUrls": [],
  "searchUrls": []
}
```

# Actor output Schema

## `qasaListing` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "operation": "search",
    "market": "sweden",
    "location": "Stockholm",
    "homeTypes": [],
    "maxResults": 100,
    "rentMin": 0,
    "rentMax": 0,
    "roomsMin": 0,
    "roomsMax": 0,
    "areaMin": 0,
    "areaMax": 0,
    "moveInFrom": "",
    "minRentalMonths": 0,
    "furnished": "any",
    "petsAllowed": false,
    "wheelchairAccessible": false,
    "sharedHomes": "any",
    "contractTypes": [],
    "householdSize": 0,
    "sort": "newest",
    "includeDetails": false,
    "listingUrls": [],
    "searchUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/qasa-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "operation": "search",
    "market": "sweden",
    "location": "Stockholm",
    "homeTypes": [],
    "maxResults": 100,
    "rentMin": 0,
    "rentMax": 0,
    "roomsMin": 0,
    "roomsMax": 0,
    "areaMin": 0,
    "areaMax": 0,
    "moveInFrom": "",
    "minRentalMonths": 0,
    "furnished": "any",
    "petsAllowed": False,
    "wheelchairAccessible": False,
    "sharedHomes": "any",
    "contractTypes": [],
    "householdSize": 0,
    "sort": "newest",
    "includeDetails": False,
    "listingUrls": [],
    "searchUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/qasa-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "operation": "search",
  "market": "sweden",
  "location": "Stockholm",
  "homeTypes": [],
  "maxResults": 100,
  "rentMin": 0,
  "rentMax": 0,
  "roomsMin": 0,
  "roomsMax": 0,
  "areaMin": 0,
  "areaMax": 0,
  "moveInFrom": "",
  "minRentalMonths": 0,
  "furnished": "any",
  "petsAllowed": false,
  "wheelchairAccessible": false,
  "sharedHomes": "any",
  "contractTypes": [],
  "householdSize": 0,
  "sort": "newest",
  "includeDetails": false,
  "listingUrls": [],
  "searchUrls": []
}' |
apify call sian.agency/qasa-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/qasa-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kIIEAI6nIUwILNH0F/builds/2rTv01FeAoDddVNJH/openapi.json
