{
  "openapi": "3.0.1",
  "info": {
    "title": "Boligsiden Scraper - Denmark Property, Sold Prices & Agents",
    "description": "Scrape boligsiden.dk: boliger til salg, salgspriser, lejeboliger and every Danish ejendomsmaegler. Price, m2-pris, ejerudgift, energimaerke, BBR data and full agency contacts.",
    "version": "1.0",
    "x-build-id": "cHeYljsZBWNiRhtZa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~boligsiden-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-boligsiden-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~boligsiden-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-boligsiden-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~boligsiden-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-boligsiden-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",
              "rentals",
              "agents"
            ],
            "type": "string",
            "description": "Pick one per run. Homes for Sale returns every active listing that matches your filters, each one carrying the estate agency that is selling it. Sold Prices returns Denmark's salgspriser register with the amount, the date and the sale type. Rentals returns the lejebolig market with rent, deposit and prepaid rent split out. Estate Agents returns every ejendomsmaegler in a place with contact details, CVR number, customer ratings and local market share.",
            "default": "search"
          },
          "location": {
            "title": "📍 Place in Denmark",
            "type": "string",
            "description": "Where to search. A kommune (Aarhus, Odense, Aalborg, Gentofte), a by (Aarhus C, Hellerup), a postcode (8000, 2100) or a landsdel (Oestjylland, Koebenhavn By) all work, with or without Danish letters. The best match is used and the run log prints which place it resolved to. Leave it as it is for a quick first run.",
            "default": "Aarhus"
          },
          "areaLevel": {
            "title": "🗺️ Match the place as",
            "enum": [
              "auto",
              "municipality",
              "city",
              "zip_code",
              "province"
            ],
            "type": "string",
            "description": "Boligsiden knows several places by the same name - Aarhus is a kommune, Aarhus C is a by and 8000 is its postcode. Best match picks the widest one that matched, which is what you almost always want. Pin it to a level when you need exactly that scope, for example a single postcode rather than the whole kommune.",
            "default": "auto"
          },
          "locations": {
            "title": "📍 More places (optional)",
            "type": "array",
            "description": "Extra Danish places to cover in the same run, one per line — for example Odense, Aalborg, 5000. Each place is searched separately and gets its own share of the row limit, which is how you build a national dataset without hitting Boligsiden's 10,000-row-per-search ceiling. Leave empty to search only the place above.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "🏘️ Property types",
            "uniqueItems": true,
            "type": "array",
            "description": "Which kinds of home to include. Leave empty for every type. A villa is a detached house, a condo is an ejerlejlighed and a cooperative is an andelsbolig. Homes: villa, terraced house, condo, cooperative, villa apartment, double house, multiple family house, room. Holiday and land: holiday house, holiday plot, full year plot, allotment, houseboat. Rural: farm, hobby farm, cattle farm, pig farm, plant farm, forest. Other: garage, parking, business, special.",
            "items": {
              "type": "string",
              "enum": [
                "villa",
                "terraced house",
                "condo",
                "cooperative",
                "villa apartment",
                "double house",
                "multiple family house",
                "room",
                "holiday house",
                "holiday plot",
                "full year plot",
                "allotment",
                "houseboat",
                "farm",
                "hobby farm",
                "cattle farm",
                "pig farm",
                "plant farm",
                "forest",
                "garage",
                "parking",
                "business",
                "special"
              ],
              "enumTitles": [
                "🏠 Villa (detached house)",
                "🏘️ Rækkehus (terraced)",
                "🏢 Ejerlejlighed (condo)",
                "🤝 Andelsbolig (co-operative)",
                "🏡 Villalejlighed",
                "🏚️ Dobbelthus",
                "🏬 Flerfamiliehus",
                "🚪 Værelse",
                "🏖️ Sommerhus",
                "🏕️ Sommerhusgrund",
                "🟩 Helårsgrund",
                "🌱 Kolonihave",
                "⛵ Husbåd",
                "🚜 Landbrug",
                "🐴 Hobbylandbrug",
                "🐄 Kvægbrug",
                "🐖 Svinebrug",
                "🌾 Planteavl",
                "🌲 Skov",
                "🚗 Garage",
                "🅿️ Parkering",
                "🏭 Erhverv",
                "✨ Særlig ejendom"
              ]
            },
            "default": []
          },
          "maxResults": {
            "title": "🔢 Max rows",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Stop after this many rows. Each call returns up to 250 rows, so the run stops at the first call that crosses your limit. Boligsiden itself will not page past 10,000 rows in one search, so ask for more than that only by splitting the run across several places, price bands or sold periods. The Estate Agents option ignores this - one call returns every agency in the place.",
            "default": 100
          },
          "priceMin": {
            "title": "💵 Min price (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest price to include, in Danish kroner. On the Rentals option this is read as the lowest monthly rent instead. 0 means no lower bound.",
            "default": 0
          },
          "priceMax": {
            "title": "💰 Max price (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest price to include, in Danish kroner. On the Rentals option this is read as the highest monthly rent instead. 0 means no upper bound.",
            "default": 0
          },
          "roomsMin": {
            "title": "🛏️ Min rooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Fewest vaerelser to include. Danish listings count every room, not only bedrooms. 0 means no lower bound. Not applied by the Sold Prices or Estate Agents options.",
            "default": 0
          },
          "roomsMax": {
            "title": "🛏️ Max rooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Most vaerelser to include. 0 means no upper bound. Not applied by the Sold Prices or Estate Agents options.",
            "default": 0
          },
          "areaMin": {
            "title": "📐 Min living area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest boligareal in square metres. 0 means no lower bound. Not applied by the Estate Agents option.",
            "default": 0
          },
          "areaMax": {
            "title": "📐 Max living area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Largest boligareal in square metres. 0 means no upper bound. Not applied by the Estate Agents option.",
            "default": 0
          },
          "lotAreaMin": {
            "title": "🟩 Min plot area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest grundareal in square metres. Houses and holiday homes carry one; flats normally do not, so a plot filter quietly excludes them. 0 means no lower bound. Homes for Sale only.",
            "default": 0
          },
          "yearBuiltFrom": {
            "title": "🏗️ Built from year",
            "minimum": 0,
            "maximum": 2100,
            "type": "integer",
            "description": "Skip anything built before this year. 0 means no lower bound. Homes for Sale only.",
            "default": 0
          },
          "energyLabels": {
            "title": "⚡ Energy labels",
            "uniqueItems": true,
            "type": "array",
            "description": "Only keep homes carrying one of these energimaerker. Accepted values: A2020, A2015, A2010, A1, A2, A, B, C, D, E, F, G. Leave empty for every label, including homes with none. Homes for Sale only.",
            "items": {
              "type": "string",
              "enum": [
                "A2020",
                "A2015",
                "A2010",
                "A1",
                "A2",
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ],
              "enumTitles": [
                "⚡ A2020",
                "⚡ A2015",
                "⚡ A2010",
                "⚡ A1",
                "⚡ A2",
                "🟢 A",
                "🟢 B",
                "🟡 C",
                "🟡 D",
                "🟠 E",
                "🔴 F",
                "🔴 G"
              ]
            },
            "default": []
          },
          "monthlyExpenseMax": {
            "title": "🧾 Max monthly cost (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest ejerudgift per month - the running cost an owner pays on top of the mortgage. 0 means no upper bound. Homes for Sale only.",
            "default": 0
          },
          "onlyOpenHouse": {
            "title": "🚪 Only homes with an open house",
            "type": "boolean",
            "description": "Keep only listings with an aabent hus scheduled. Each kept row carries the date and, where the agency requires one, the sign-up link. Homes for Sale only.",
            "default": false
          },
          "onlyPriceDrop": {
            "title": "📉 Only homes that cut their price",
            "type": "boolean",
            "description": "Keep only listings whose asking price has come down since it was published. The percentage is on every row either way. Homes for Sale only.",
            "default": false
          },
          "soldMonthsBack": {
            "title": "🗓️ Sold within",
            "enum": [
              "3",
              "6",
              "12",
              "24",
              "60",
              "all"
            ],
            "type": "string",
            "description": "How far back to reach into Denmark's salgspriser register. Shorter windows are what you want on a schedule - you pay for the sales that are new since your last run instead of re-buying the same history. The whole register goes back to the 1990s and is large enough that the 10,000-row ceiling will bite on a big kommune.",
            "default": "12"
          },
          "saleTypes": {
            "title": "📜 Sale types",
            "uniqueItems": true,
            "type": "array",
            "description": "Which registered sales to include. Accepted values: normal, family, auction, other. Leave empty for all of them. Family transfers and auctions clear well below market, so a valuation model usually wants normal only.",
            "items": {
              "type": "string",
              "enum": [
                "normal",
                "family",
                "auction",
                "other"
              ],
              "enumTitles": [
                "🤝 Normal sale (fri handel)",
                "👪 Family transfer",
                "⚖️ Auction",
                "❓ Other"
              ]
            },
            "default": []
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "newest",
              "priceLowToHigh",
              "priceHighToLow",
              "largestFirst",
              "sqmPriceLowToHigh"
            ],
            "type": "string",
            "description": "Newest first is what you want for monitoring a market on a schedule - the rows that arrive are the ones that were not there last time. Price per m² is the ordering Danish buyers and analysts actually compare on, and Rentals has no such ordering, so on that option it falls back to newest and the run log says so. Estate Agents is always ordered by customer rating.",
            "default": "newest"
          },
          "agentAddressType": {
            "title": "🏘️ Rank agents on this property type",
            "enum": [
              "all",
              "villa",
              "condo",
              "terraced house",
              "cooperative",
              "holiday house"
            ],
            "type": "string",
            "description": "Which property type the agency's local market share is measured on. All property types gives each agency's overall share of sales in the place; picking one narrows it to that type, which is what you want when you are looking for whoever actually sells sommerhuse or andelsboliger there.",
            "default": "all"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}