{
  "openapi": "3.0.1",
  "info": {
    "title": "Booli Scraper - Sweden Property Listings & Sold Prices",
    "description": "Scrape Booli.se: homes for sale plus the full slutpriser archive — asking and sold prices, area, rooms, fee, agency and price changes, in Swedish.",
    "version": "1.0",
    "x-build-id": "1xyXgsCeARG7rrQH6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~booli-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-booli-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~booli-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-booli-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~booli-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-booli-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",
              "sold"
            ],
            "type": "string",
            "description": "Pick one per run. Property Search walks Booli.se's own listing pages for any Swedish area and returns 35 homes per page with asking price, area, rooms, fee, agency and Booli's own price estimate; Sold Prices reads the slutpriser archive the same way and returns 35 final sale prices per page, each with the asking price and the percentage between the two.",
            "default": "search"
          },
          "locations": {
            "title": "📍 Areas in Sweden",
            "type": "array",
            "description": "Where to search, one area per line. All 290 Swedish municipalities and all 21 counties resolve by name, in Swedish or English (Motala kommun, Stockholm), plus Booli's own numeric area id (77104 = all Sweden). Leave empty to read all of Sweden. For a finer area than a municipality, or to control the search exactly, paste the Booli search address into Search URLs instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "🌐 Booli search URLs",
            "type": "array",
            "description": "Paste Booli search addresses instead of filling the form, e.g. https://www.booli.se/sok/till-salu?areaIds=880 or https://www.booli.se/sok/slutpriser?areaIds=77104&objectType=Villa. Build the search on booli.se, copy the address bar, and the area, property type and sale-or-sold surface in it are read straight off the URL. A page number in the address is ignored; the run starts at page one and pages forward on its own.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "objectTypes": {
            "title": "🏠 Property types",
            "type": "array",
            "description": "Which kinds of home to keep. Leave empty to take every type. The values are Booli's own property-type filter, so the list is exactly what the site offers: apartments, houses, terraced and linked houses, holiday homes, farms and plots/land.",
            "items": {
              "type": "string",
              "enum": [
                "Lägenhet",
                "Villa",
                "Kedjehus-Parhus-Radhus",
                "Fritidshus",
                "Gård",
                "Tomt/Mark"
              ],
              "enumTitles": [
                "🏢 Lägenhet — apartments",
                "🏡 Villa — detached houses",
                "🏘️ Kedjehus-Parhus-Radhus — terraced & linked",
                "🌲 Fritidshus — holiday homes",
                "🚜 Gård — farms",
                "🌳 Tomt/Mark — plots & land"
              ]
            },
            "default": []
          },
          "maxResults": {
            "title": "🔢 Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many results across the whole run, not per area. One page carries 35 results, so a run ends on the first page that crosses your limit.",
            "default": 100
          },
          "minPrice": {
            "title": "💵 Min price (kr)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only results priced at or above this, in kronor. 0 means no lower bound. On Sold Prices this is the final registered price.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Max price (kr)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only results priced at or below this, in kronor. 0 means no upper bound.",
            "default": 0
          },
          "minRooms": {
            "title": "🛏️ Min rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only homes with at least this many rooms. 0 means no minimum. Results that state no room count are dropped while this bound is set — Booli does not publish rooms for every object type.",
            "default": 0
          },
          "maxRooms": {
            "title": "🚪 Max rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only homes with at most this many rooms. 0 means no maximum.",
            "default": 0
          },
          "minLivingArea": {
            "title": "📐 Min living area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only homes with a living area of at least this many square metres. 0 means no minimum. Plots and homes that state no living area are dropped while this bound is set.",
            "default": 0
          },
          "maxLivingArea": {
            "title": "📏 Max living area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only homes with a living area of at most this many square metres. 0 means no maximum.",
            "default": 0
          },
          "onlyNewConstruction": {
            "title": "🏗️ Only new construction",
            "type": "boolean",
            "description": "Keep only homes Booli itself flags as new construction (nyproduktion).",
            "default": false
          },
          "onlyUpcomingSale": {
            "title": "⏳ Only coming to market",
            "type": "boolean",
            "description": "Keep only listings marked snart till salu — homes that are coming to market but not formally for sale yet. Sweden's largest such backlog sits on Booli, and this is the only surface that exposes it as a filter.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}