{
  "openapi": "3.0.1",
  "info": {
    "title": "Boliga Denmark Real Estate Scraper",
    "description": "Scrape property listings from Boliga.dk (Denmark). Search by zip code, free text, or result URLs. Optionally fetch full listing details including agent contact, BBR building data, sales history, and price analytics.",
    "version": "1.0",
    "x-build-id": "UheONwHK1F0OzBd6a"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rigelbytes~boliga-dk-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rigelbytes-boliga-dk-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/rigelbytes~boliga-dk-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rigelbytes-boliga-dk-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/rigelbytes~boliga-dk-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rigelbytes-boliga-dk-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": {
          "startUrls": {
            "title": "Boliga Search or Listing URLs",
            "type": "array",
            "description": "Paste Boliga search result URLs (e.g. https://www.boliga.dk/resultat?searchTab=0&zipCodes=9500) or listing URLs (e.g. https://www.boliga.dk/adresse/thostruphovgaardsvej-4-9500-hobro-995530789). Query parameters from search URLs are used as filters. Listing URLs scrape those specific properties.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "description": "Danish zip codes (e.g. 9500) or free-text location queries (e.g. Hobro, København). Zip codes use the zipCodes filter; other text uses Boliga's q search.",
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "Property Types",
            "uniqueItems": true,
            "type": "array",
            "description": "Leave empty for all property types.",
            "items": {
              "type": "string",
              "enum": [
                "villa",
                "raekkehus",
                "ejerlejlighed",
                "fritidshus",
                "andelsbolig",
                "landejendom",
                "helaarsgrund",
                "fritidsgrund"
              ],
              "enumTitles": [
                "Villa",
                "Rækkehus (terraced)",
                "Ejerlejlighed (apartment)",
                "Fritidshus (holiday home)",
                "Andelsbolig (cooperative)",
                "Landejendom (farm)",
                "Helårsgrund (plot)",
                "Fritidsgrund (holiday plot)"
              ]
            }
          },
          "priceMin": {
            "title": "Minimum Price (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum asking price in Danish kroner."
          },
          "priceMax": {
            "title": "Maximum Price (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum asking price in Danish kroner."
          },
          "roomsMin": {
            "title": "Minimum Rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of rooms."
          },
          "roomsMax": {
            "title": "Maximum Rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of rooms."
          },
          "sizeMin": {
            "title": "Minimum Living Area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum living area in square meters."
          },
          "sizeMax": {
            "title": "Maximum Living Area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum living area in square meters."
          },
          "lotSizeMin": {
            "title": "Minimum Lot Size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum plot/lot size in square meters."
          },
          "lotSizeMax": {
            "title": "Maximum Lot Size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum plot/lot size in square meters."
          },
          "buildYearMin": {
            "title": "Minimum Build Year",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum construction year."
          },
          "buildYearMax": {
            "title": "Maximum Build Year",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum construction year."
          },
          "daysForSaleMin": {
            "title": "Minimum Days for Sale",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum days the listing has been on the market."
          },
          "daysForSaleMax": {
            "title": "Maximum Days for Sale",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum days the listing has been on the market."
          },
          "energyClassMin": {
            "title": "Minimum Energy Class",
            "type": "string",
            "description": "Minimum energy label (e.g. A, B, C)."
          },
          "energyClassMax": {
            "title": "Maximum Energy Class",
            "type": "string",
            "description": "Maximum energy label (e.g. C, D)."
          },
          "zipCodes": {
            "title": "Zip Codes",
            "type": "string",
            "description": "Comma-separated Danish zip codes applied to all search queries (e.g. 2100,2200,9500)."
          },
          "municipality": {
            "title": "Municipality Code",
            "minimum": 0,
            "type": "integer",
            "description": "Danish municipality code (kommunekode), e.g. 846 for Mariagerfjord."
          },
          "sort": {
            "title": "Sort Order",
            "enum": [
              "daysForSale-a",
              "daysForSale-d",
              "price-a",
              "price-d",
              "views-d",
              "squaremeterPrice-a",
              "squaremeterPrice-d",
              "rooms-d",
              "size-d",
              "buildYear-d"
            ],
            "type": "string",
            "description": "How to sort search results.",
            "default": "daysForSale-a"
          },
          "hideBrokerListings": {
            "title": "Hide Broker Listings",
            "type": "boolean",
            "description": "Exclude standard broker listings from results.",
            "default": false
          },
          "hideSelfSale": {
            "title": "Hide Self-Sale Listings",
            "type": "boolean",
            "description": "Exclude private / self-sale listings.",
            "default": false
          },
          "hideForeclosure": {
            "title": "Hide Foreclosures",
            "type": "boolean",
            "description": "Exclude foreclosure listings.",
            "default": false
          },
          "extractDetails": {
            "title": "Extract Listing Details",
            "type": "boolean",
            "description": "When enabled, fetches full listing details for each result (agent contact, BBR building data, sales history, price analytics, full photo gallery). Charges an extra listing-details event per enriched listing.",
            "default": false
          },
          "detailConcurrency": {
            "title": "Detail Request Concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of listings processed in parallel when detail extraction is enabled.",
            "default": 10
          },
          "maxItems": {
            "title": "Max Items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of listings to scrape (0 = unlimited).",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy settings. Residential proxy is recommended for reliable runs on Apify Cloud.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}