{
  "openapi": "3.0.1",
  "info": {
    "title": "Immowelt Scraper — German Real Estate Listings",
    "description": "Scrape immowelt.de — one of Germany's largest residential property portals — and pull every active sale or rental listing for any city you choose, narrowed by price, size, rooms, year, and features. Results come back as clean, structured records ready for analysis.",
    "version": "0.2",
    "x-build-id": "nWTQzKINhAcNknQUo"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~immowelt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-immowelt-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/blackfalcondata~immowelt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-immowelt-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/blackfalcondata~immowelt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-immowelt-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": {
          "query": {
            "title": "🔍 Search Term",
            "type": "string",
            "description": "City, region, or postal area to search (e.g. \"Berlin\", \"München\", \"Charlottenburg\"). Use a JSON array for several. Equivalent to the City field — use whichever you prefer."
          },
          "city": {
            "title": "🏙️ City / Location",
            "type": "string",
            "description": "City or region to search in (e.g. \"Berlin\", \"München\", \"Hamburg\"). Use a JSON array for multiple locations. Same effect as the Search Term field."
          },
          "country": {
            "title": "🌍 Country",
            "enum": [
              "DE"
            ],
            "type": "string",
            "description": "Which Immowelt market to search.",
            "default": "DE"
          },
          "radiusKm": {
            "title": "📏 Search Radius (km)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Extend the search beyond the city boundary by this many kilometres. Requires a city. 0 = city boundary only.",
            "default": 0
          },
          "location": {
            "title": "📍 Location (legacy)",
            "type": "string",
            "description": "Legacy field. Use 'City / Location' instead."
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Immowelt listing URLs (e.g. https://www.immowelt.de/expose/2pg5u5z). Scrapes those specific listings directly. For broad searches use a city + filters instead.",
            "items": {
              "type": "string"
            }
          },
          "distributionType": {
            "title": "Buy or Rent",
            "enum": [
              "buy",
              "rent",
              "buy_and_rent"
            ],
            "type": "string",
            "description": "Filter by sale, rent, or both.",
            "default": "buy"
          },
          "estateType": {
            "title": "Property Type",
            "enum": [
              "apartment",
              "house",
              "apartment_and_house"
            ],
            "type": "string",
            "description": "Filter by property type.",
            "default": "apartment_and_house"
          },
          "estateSubtypes": {
            "title": "Property Subtypes",
            "type": "array",
            "description": "Optional finer property subtypes (e.g. MAISONETTE, PENTHOUSE, TERRACED_HOUSE). Leave empty for all subtypes.",
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "💰 Min Price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings priced at or above this amount."
          },
          "priceMax": {
            "title": "💰 Max Price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings priced at or below this amount."
          },
          "areaMin": {
            "title": "Min Living Area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with living area at or above this size."
          },
          "areaMax": {
            "title": "Max Living Area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with living area at or below this size."
          },
          "roomsMin": {
            "title": "Min Rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at least this many rooms."
          },
          "roomsMax": {
            "title": "Max Rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at most this many rooms."
          },
          "constructionYearMin": {
            "title": "Built After (year)",
            "minimum": 1800,
            "maximum": 2100,
            "type": "integer",
            "description": "Only listings built in or after this year."
          },
          "constructionYearMax": {
            "title": "Built Before (year)",
            "minimum": 1800,
            "maximum": 2100,
            "type": "integer",
            "description": "Only listings built in or before this year."
          },
          "features": {
            "title": "Must Have Features",
            "type": "array",
            "description": "Only listings that have ALL of the selected features.",
            "items": {
              "type": "string",
              "enum": [
                "BALCONY_OR_TERRACE",
                "GARDEN",
                "CELLAR",
                "FITTED_KITCHEN",
                "GARAGE_OR_PARKING_AREA",
                "PASSENGER_LIFT",
                "BARRIER_FREE",
                "GROUND_FLOOR",
                "FURNISHED",
                "PETS_ALLOWED",
                "SENIOR_FRIENDLY",
                "ATTIC",
                "NEW_BUILDING",
                "OLD_BUILDING",
                "RENOVATED_OR_RESTRUCTURED",
                "FREE_OF_COMMISSION"
              ]
            }
          },
          "excludeFeatures": {
            "title": "Exclude Features",
            "type": "array",
            "description": "Exclude listings that have ANY of the selected features.",
            "items": {
              "type": "string",
              "enum": [
                "BALCONY_OR_TERRACE",
                "GARDEN",
                "CELLAR",
                "FITTED_KITCHEN",
                "GARAGE_OR_PARKING_AREA",
                "PASSENGER_LIFT",
                "BARRIER_FREE",
                "GROUND_FLOOR",
                "FURNISHED",
                "PETS_ALLOWED",
                "SENIOR_FRIENDLY",
                "ATTIC",
                "NEW_BUILDING",
                "OLD_BUILDING",
                "RENOVATED_OR_RESTRUCTURED",
                "FREE_OF_COMMISSION"
              ]
            }
          },
          "sort": {
            "title": "🔀 Sort By",
            "enum": [
              "relevance",
              "newest",
              "price_asc",
              "price_desc",
              "area_desc"
            ],
            "type": "string",
            "description": "Ordering of results.",
            "default": "relevance"
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum total listings to return after dedupe and filters (0 = unlimited). You are charged per emitted record, so this is your primary cost control. When both `maxResults` and `maxPages` are set, the run stops at whichever cap is reached first.",
            "default": 25
          },
          "maxPages": {
            "title": "📄 Max Pages",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum result pages to fetch per location. Defensive safety bound — `maxResults` is the primary record cap.",
            "default": 5
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch each listing's detail page for the full description, energy certificate, exact address, and contact. Slightly slower.",
            "default": true
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to this many characters. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Output only core fields (for AI-agent / MCP workflows).",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "all",
              "text"
            ],
            "type": "string",
            "description": "Keep all description fields, or only the plain-text `description`.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Compare against previous run state. Only new / changed listings are emitted. State is keyed automatically from your search inputs. Tip: to reliably detect removed listings (see `emitExpired`), set `maxResults` to 0 — a capped run only sees part of the search, so removals can't be confirmed and are left untouched.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional stable identifier for the tracked search universe. Leave empty to auto-derive a stable identifier from your search inputs — different location/filter combinations get isolated state automatically."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged Records",
            "type": "boolean",
            "description": "When incremental, also emit listings that haven't changed.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired Records",
            "type": "boolean",
            "description": "When incremental, also emit listings no longer found. Requires full coverage to be accurate: set `maxResults` to 0, otherwise a capped run can't tell \"removed\" from \"not fetched this run\" and emits nothing as expired.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "Exclude listings detected as reposts of previously seen listings.",
            "default": false
          },
          "telegramToken": {
            "title": "📱 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token from @BotFather. Pairs with Telegram Chat ID. Pair with Incremental Mode for real-time alerts on new/updated listings only."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat / Channel ID",
            "type": "string",
            "description": "Chat ID (from @userinfobot) or channel ID (starts with -100 for channels). Required when Telegram Bot Token is set."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Incoming Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL (Slack App → Incoming Webhooks → Add New Webhook). Formats listings as Slack blocks."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord channel webhook URL (Server Settings → Integrations → Webhooks → New Webhook). Sends rich embeds colour-coded by change type (green=NEW, amber=UPDATED)."
          },
          "whatsappAccessToken": {
            "title": "📲 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API permanent System User token from Meta Business. Pairs with WhatsApp Phone Number ID and recipient phone."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Numeric WhatsApp Business phone-number ID from Meta dashboard."
          },
          "whatsappTo": {
            "title": "📨 WhatsApp Recipient (E.164)",
            "type": "string",
            "description": "Recipient phone in E.164 format (e.g. \"15551234567\"). Recipient must have messaged the business number within the last 24h, otherwise Meta rejects free-form text."
          },
          "webhookUrl": {
            "title": "🔗 Generic Webhook URL",
            "type": "string",
            "description": "POSTs a JSON payload `{metadata, items}` to your endpoint. Universal hook for n8n / Make / Zapier / custom backends."
          },
          "webhookHeaders": {
            "title": "📑 Webhook Headers (JSON)",
            "type": "object",
            "description": "Optional headers (e.g. `{\"Authorization\": \"Bearer ...\"}`) sent with the webhook POST."
          },
          "notificationLimit": {
            "title": "🔢 Notification Limit",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of listings included per notification batch (1–20). Prevents spam on large result sets.",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🆕 Notify Only on Changes",
            "type": "boolean",
            "description": "When ON together with Incremental Mode, send notifications only for NEW and UPDATED listings. Has no effect outside incremental mode.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}