{
  "openapi": "3.0.1",
  "info": {
    "title": "Immowelt DE $0.8💰 Powerful Filters + Deep Search",
    "description": "Extract property listings from immowelt.de. Get fully-detailed listings including price, GPS coordinates, rooms, area, images, energy class, agent contacts, and more.",
    "version": "1.0",
    "x-build-id": "4mLgDMdOPNmm3wDsI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~immowelt-de-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-immowelt-de-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/abotapi~immowelt-de-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-immowelt-de-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/abotapi~immowelt-de-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-immowelt-de-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": {
          "mode": {
            "title": "1. Search mode",
            "enum": [
              "filter",
              "url"
            ],
            "type": "string",
            "description": "Filter mode = pick state + city from dropdowns. URL mode = paste any immowelt.de search URL with your filters already applied (great for re-using a search you already refined in a browser).",
            "default": "filter"
          },
          "locations": {
            "title": "Locations to search (Filter mode)",
            "type": "array",
            "description": "Pick a German federal state, then enter the city name. Any town in the state works (we resolve it automatically). Add multiple entries to scrape several cities in one run. Filter mode only.",
            "items": {
              "type": "object",
              "properties": {
                "state": {
                  "title": "State (Bundesland)",
                  "type": "string",
                  "description": "German federal state where the city is located.",
                  "editor": "select",
                  "enum": [
                    "baden-wuerttemberg",
                    "bayern",
                    "berlin",
                    "brandenburg",
                    "bremen",
                    "hamburg",
                    "hessen",
                    "mecklenburg-vorpommern",
                    "niedersachsen",
                    "nordrhein-westfalen",
                    "rheinland-pfalz",
                    "saarland",
                    "sachsen",
                    "sachsen-anhalt",
                    "schleswig-holstein",
                    "thueringen"
                  ],
                  "enumTitles": [
                    "Baden-Württemberg",
                    "Bayern (Bavaria)",
                    "Berlin",
                    "Brandenburg",
                    "Bremen",
                    "Hamburg",
                    "Hessen",
                    "Mecklenburg-Vorpommern",
                    "Niedersachsen (Lower Saxony)",
                    "Nordrhein-Westfalen (NRW)",
                    "Rheinland-Pfalz",
                    "Saarland",
                    "Sachsen (Saxony)",
                    "Sachsen-Anhalt",
                    "Schleswig-Holstein",
                    "Thüringen"
                  ]
                },
                "city": {
                  "title": "City",
                  "type": "string",
                  "description": "City name, e.g. München, Köln, Frankfurt am Main. Any town in the selected state works. The state above is what tells same-named towns apart (a \"Neustadt\" in Bayern is not the one in Sachsen); if several towns in that state match, the closest one is used and its full name is written to the run log.",
                  "editor": "textfield"
                }
              }
            }
          },
          "listingType": {
            "title": "Buy or rent? (Filter mode)",
            "enum": [
              "Buy",
              "Rent"
            ],
            "type": "string",
            "description": "Pick Buy (Kauf) or Rent (Miete). In Filter mode this builds the search. In URL mode it never filters: the listing type is read from each pasted URL when the URL states one, and this field is the fallback label for URLs that do not.",
            "default": "Buy"
          },
          "propertyType": {
            "title": "Property type (Filter mode)",
            "enum": [
              "Apartment",
              "House",
              "Plot",
              "Office"
            ],
            "type": "string",
            "description": "What kind of property to search for. Filter mode only.",
            "default": "Apartment"
          },
          "priceMin": {
            "title": "Min price, € (Filter mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price in euros. Filter mode only. Leave empty for no minimum."
          },
          "priceMax": {
            "title": "Max price, € (Filter mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price in euros. Filter mode only. Leave empty for no maximum."
          },
          "roomsMin": {
            "title": "Min rooms (Filter mode)",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of rooms. Filter mode only."
          },
          "roomsMax": {
            "title": "Max rooms (Filter mode)",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of rooms. Filter mode only."
          },
          "livingSpaceMin": {
            "title": "Min living space, m² (Filter mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum living area in square meters. Filter mode only."
          },
          "livingSpaceMax": {
            "title": "Max living space, m² (Filter mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum living area in square meters. Filter mode only."
          },
          "constructionYearMin": {
            "title": "Built from year (Filter mode)",
            "minimum": 1800,
            "type": "integer",
            "description": "Earliest construction year. Filter mode only."
          },
          "constructionYearMax": {
            "title": "Built until year (Filter mode)",
            "minimum": 1800,
            "type": "integer",
            "description": "Latest construction year. Filter mode only."
          },
          "sortBy": {
            "title": "Sort order (Filter mode)",
            "enum": [
              "Default",
              "MostRecent",
              "PriceAsc",
              "PriceDesc"
            ],
            "type": "string",
            "description": "How to order results. Filter mode only — in URL mode the sort is taken from your URL.",
            "default": "Default"
          },
          "urls": {
            "title": "Search URLs (URL mode)",
            "type": "array",
            "description": "One or more full Immowelt search URLs. Tip: refine a search in your browser, copy the URL, paste it here. If the URL contains page=N, scraping starts at page N and walks forward.",
            "items": {
              "type": "string"
            }
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "How many result pages to walk per location / URL (30 listings per page). Leave empty to walk every result page."
          },
          "maxListings": {
            "title": "Max total listings",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap across the whole run. 0 = unlimited (bounded only by Max pages).",
            "default": 20
          },
          "includeCoordinates": {
            "title": "Add GPS coordinates",
            "type": "boolean",
            "description": "Enrich each listing with latitude/longitude. Adds ~1 extra request per search page. Fast, no extra cost beyond proxy.",
            "default": true
          },
          "fetchDetails": {
            "title": "Visit each listing's detail page",
            "type": "boolean",
            "description": "Fetch the full expose page for each listing — adds the long description and extra attributes, but multiplies your proxy bandwidth by roughly 10×. The search page already includes price, address, agent, images, and energy class, so leave this OFF unless you need the long description.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "A residential proxy based in Germany gives the cleanest data. The default Apify RESIDENTIAL + country DE works well."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (optional)",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. Distinct from Incremental mode below — this continues one specific interrupted run, not recurring monitoring."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "When ON, this actor remembers the previous run of the SAME search (see State key) and classifies each listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. UNCHANGED and EXPIRED rows are not saved to the dataset unless enabled below — this is what keeps a scheduled recurring run cheap. Default OFF (every run returns every listing, as today). Combining with Resume from a previous run above is only safe on the very first incremental run (no baseline yet) — once a baseline exists, remove Resume from a previous run or set a different State key.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Manually name the incremental baseline for this search, e.g. \"berlin-apartments\". Leave empty to auto-derive one from mode + locations/urls + the filters + Visit each listing's detail page + Add GPS coordinates — two runs with the exact same search settings then share a baseline automatically. Set this explicitly if you want to run several DIFFERENT search configs against the SAME named baseline, or keep configs that happen to match fully separate."
          },
          "emitUnchanged": {
            "title": "Include unchanged listings in output (incremental mode only)",
            "type": "boolean",
            "description": "When ON, incremental mode also saves listings with no detected change (changeType=\"UNCHANGED\") to the dataset, instead of only NEW/UPDATED/REAPPEARED. This returns — and bills for — every listing every run, defeating the point of incremental mode for most use cases. Default OFF.",
            "default": false
          },
          "emitExpired": {
            "title": "Include expired listings in output (incremental mode only)",
            "type": "boolean",
            "description": "When ON, incremental mode also saves a row (changeType=\"EXPIRED\") for each previously-tracked listing that no longer appears, once this run reaches the natural end of the search results (skipped on a capped, resumed, or otherwise incomplete run — those cannot tell \"gone\" apart from \"not reached yet\"). This returns — and bills for — an extra row per disappeared listing. Default OFF.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}