{
  "openapi": "3.0.1",
  "info": {
    "title": "Qasa Scraper - Nordic Rental Listings",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "2rTv01FeAoDddVNJH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~qasa-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-qasa-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sian.agency~qasa-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-qasa-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sian.agency~qasa-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-qasa-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "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.",
            "default": "search"
          },
          "market": {
            "title": "🌍 Market",
            "enum": [
              "sweden",
              "norway",
              "finland"
            ],
            "type": "string",
            "description": "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.",
            "default": "sweden"
          },
          "location": {
            "title": "📍 Place",
            "type": "string",
            "description": "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.",
            "default": ""
          },
          "homeTypes": {
            "title": "🏠 Home types",
            "uniqueItems": true,
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string",
              "enum": [
                "apartment",
                "house",
                "terrace_house",
                "cottage",
                "room",
                "corridor",
                "duplex",
                "loft",
                "bedsit",
                "own",
                "other"
              ],
              "enumTitles": [
                "🏢 Apartment",
                "🏡 House",
                "🏘️ Terraced house",
                "🌲 Cottage",
                "🚪 Room",
                "🎓 Corridor room",
                "🪜 Duplex",
                "🪟 Loft",
                "🛏️ Bedsit",
                "🔑 Own home",
                "📦 Other"
              ]
            },
            "default": []
          },
          "maxResults": {
            "title": "🔢 Max listings",
            "minimum": 1,
            "maximum": 25000,
            "type": "integer",
            "description": "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.",
            "default": 100
          },
          "rentMin": {
            "title": "💵 Min monthly cost",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "rentMax": {
            "title": "💰 Max monthly cost",
            "minimum": 0,
            "type": "integer",
            "description": "Highest monthly cost to include, in the market's own currency. 0 means no upper bound.",
            "default": 0
          },
          "roomsMin": {
            "title": "🛏️ Min rooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "roomsMax": {
            "title": "🛏️ Max rooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Most rooms to include. 0 means no upper bound.",
            "default": 0
          },
          "areaMin": {
            "title": "📐 Min size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest floor area in square metres. 0 means no lower bound.",
            "default": 0
          },
          "areaMax": {
            "title": "📐 Max size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Largest floor area in square metres. 0 means no upper bound.",
            "default": 0
          },
          "moveInFrom": {
            "title": "🗓️ Move-in from",
            "type": "string",
            "description": "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.",
            "default": ""
          },
          "minRentalMonths": {
            "title": "⏳ Min rental length (months)",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "furnished": {
            "title": "🛋️ Furnished",
            "enum": [
              "any",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "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.",
            "default": "any"
          },
          "petsAllowed": {
            "title": "🐾 Pets allowed only",
            "type": "boolean",
            "description": "Return only homes where pets are allowed.",
            "default": false
          },
          "wheelchairAccessible": {
            "title": "♿ Step-free only",
            "type": "boolean",
            "description": "Return only homes the landlord has marked as wheelchair accessible.",
            "default": false
          },
          "sharedHomes": {
            "title": "🧑‍🤝‍🧑 Shared homes",
            "enum": [
              "any",
              "only",
              "exclude"
            ],
            "type": "string",
            "description": "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.",
            "default": "any"
          },
          "contractTypes": {
            "title": "📜 Contract types",
            "uniqueItems": true,
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string",
              "enum": [
                "firsthand",
                "studentHome",
                "seniorHome",
                "corporateHome"
              ],
              "enumTitles": [
                "📜 First-hand contract",
                "🎓 Student home",
                "🧓 Senior home",
                "🏢 Corporate home"
              ]
            },
            "default": []
          },
          "householdSize": {
            "title": "👪 Household size",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "Only return homes that accept a household of this many people. 0 means no restriction.",
            "default": 0
          },
          "sort": {
            "title": "↕️ Sort by",
            "enum": [
              "newest",
              "cheapest",
              "most_expensive",
              "largest",
              "most_rooms",
              "relevance"
            ],
            "type": "string",
            "description": "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.",
            "default": "newest"
          },
          "includeDetails": {
            "title": "📄 Add build year, amenities and landlord responsiveness",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "listingUrls": {
            "title": "🔗 Listing URLs or IDs",
            "type": "array",
            "description": "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.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchUrls": {
            "title": "🌐 Qasa search URLs",
            "type": "array",
            "description": "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.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}