{
  "openapi": "3.0.1",
  "info": {
    "title": "Immowelt Scraper - Germany Real Estate & Agent Leads",
    "description": "Scrape Immowelt.de property listings: rent and purchase price, service charges, rooms, living space, year built, energy class, address, coordinates and photos, plus each listing agency and its contact details. Independent tool, not affiliated with Immowelt.",
    "version": "0.1",
    "x-build-id": "5z2ypig8K2SpXvJal"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~immowelt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~immowelt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-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/scrapesage~immowelt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-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": {
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "German city or district slugs as Immowelt writes them, for example <code>berlin</code>, <code>muenchen</code>, <code>koeln</code>, <code>berlin-lichtenberg</code>. Each location is combined with every property type below. Narrower places give you a much larger share of that market - see \"How deep does a search go?\" in the README.",
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Which kinds of property to search for. Every value here was verified live against Immowelt.",
            "items": {
              "type": "string",
              "enum": [
                "wohnungen",
                "haeuser",
                "grundstuecke",
                "wohnen-auf-zeit",
                "ladenflaechen"
              ],
              "enumTitles": [
                "Apartments (wohnungen)",
                "Houses (haeuser)",
                "Plots of land (grundstuecke)",
                "Temporary / furnished living (wohnen-auf-zeit) - rent only",
                "Retail units (ladenflaechen)"
              ]
            }
          },
          "dealType": {
            "title": "Deal type",
            "enum": [
              "mieten",
              "kaufen"
            ],
            "type": "string",
            "description": "Rent or buy. Temporary / furnished living is published for rent only; that combination is skipped before the request and nothing is charged for it."
          },
          "searchUrls": {
            "title": "Search URLs",
            "type": "array",
            "description": "Immowelt search pages to scrape, instead of (or as well as) the Locations above. Paste them, link a text file, or upload one. A single listing URL (<code>/expose/...</code>) also works. Only <code>/liste/</code>, <code>/suche/</code> and <code>/expose/</code> pages are requested - URLs that Immowelt's robots.txt disallows are skipped and reported.",
            "items": {
              "type": "object"
            }
          },
          "urlsFromFile": {
            "title": "Search URLs from a file or pasted list",
            "type": "string",
            "description": "Paste a block of Immowelt search URLs (one per line), or give ONE link to a .txt/.csv file, a Google Sheet, a Drive file or an Apify key-value-store record holding them. Blank lines, quotes, # comments and extra CSV columns are tolerated."
          },
          "scrapeDetails": {
            "title": "Scrape full listing details",
            "type": "boolean",
            "description": "Open each listing's own page for the complete record - full cost breakdown, deposit, year built, heating, energy certificate, exact street address, coordinates, every photo, floor plans, and the agency's phone, website and imprint. OFF by default because it costs more per listing: Immowelt protects listing pages with DataDome, so each one is fetched over a residential IP (retried on a fresh IP if it is refused). No API key is needed. With it off you still get everything the results page shows, at the cheaper per-listing price.",
            "default": false
          },
          "maxListingsPerSearch": {
            "title": "Max listings per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Cap on how many listings to take from each search page. Immowelt serves 25-42 listings on a search page; see the README for how to go deeper.",
            "default": 50
          },
          "maxResults": {
            "title": "Max listings in total",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Overall cap across every search. 0 means no cap - the run stops when the searches are exhausted or the run time budget is reached.",
            "default": 0
          },
          "expandSeoLinks": {
            "title": "Follow Immowelt's related searches (go deeper)",
            "type": "boolean",
            "description": "Each Immowelt results page publishes up to ~66 narrower searches of its own - top neighbourhoods, nearby towns, room counts, property sub-types and feature searches. Turn this on to follow them, which is how you get well beyond one page of results for a city. Bounded by \"Max search pages\".",
            "default": false
          },
          "maxSearchPages": {
            "title": "Max search pages",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Hard ceiling on how many search pages one run may request, including any followed from \"Follow Immowelt's related searches\".",
            "default": 25
          },
          "minPrice": {
            "title": "Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings at or above this price, in EUR. Rent listings are matched on the cold rent (Kaltmiete), sale listings on the purchase price. Filtered listings are not charged."
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings at or below this price, in EUR. Filtered listings are not charged."
          },
          "minRooms": {
            "title": "Min rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with at least this many rooms. Filtered listings are not charged."
          },
          "maxRooms": {
            "title": "Max rooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with at most this many rooms. Filtered listings are not charged."
          },
          "minLivingSpaceSqm": {
            "title": "Min living space (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with at least this much living space. Filtered listings are not charged."
          },
          "maxLivingSpaceSqm": {
            "title": "Max living space (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with at most this much living space. Filtered listings are not charged."
          },
          "onlyPrivateOwners": {
            "title": "Only private owners",
            "type": "boolean",
            "description": "Keep only listings published by a private owner rather than an estate agency. Needs \"Scrape full listing details\" on, because the owner flag comes from the listing page. Filtered listings are not charged.",
            "default": false
          },
          "onlyWithFloorplan": {
            "title": "Only listings with a floor plan",
            "type": "boolean",
            "description": "Keep only listings that publish at least one floor plan. Needs \"Scrape full listing details\" on. Filtered listings are not charged.",
            "default": false
          },
          "outputFields": {
            "title": "Output fields",
            "type": "array",
            "description": "Pick exactly the columns you want. Leave empty for every field. The list is generated from the Actor's own record builder, so it can never drift from what the run emits.",
            "items": {
              "type": "string",
              "enum": [
                "type",
                "classifiedId",
                "listingId",
                "url",
                "detailScraped",
                "title",
                "headline",
                "dealType",
                "propertyType",
                "propertySubType",
                "isNewBuildProject",
                "priceText",
                "priceLabel",
                "price",
                "pricePerSqm",
                "currency",
                "costs",
                "deposit",
                "commissionText",
                "hasBrokerageFee",
                "priceNote",
                "rooms",
                "livingSpaceSqm",
                "plotAreaSqm",
                "availability",
                "floor",
                "yearOfConstruction",
                "condition",
                "heatingSystem",
                "energySource",
                "energyCertificateType",
                "energyCertificateValidity",
                "energyEfficiencyClass",
                "energyDemand",
                "street",
                "district",
                "city",
                "zipCode",
                "region",
                "country",
                "addressText",
                "isAddressPublished",
                "latitude",
                "longitude",
                "locationIsApproximate",
                "description",
                "locationDescription",
                "additionalInformation",
                "amenities",
                "aiDetectedFeatures",
                "agencyName",
                "contactPerson",
                "agencyId",
                "phone",
                "website",
                "agencyAddress",
                "profileUrl",
                "imprintUrl",
                "publisherType",
                "isPrivateOwner",
                "agencyLogoUrl",
                "images",
                "imageCount",
                "imageScenes",
                "floorplans",
                "videos",
                "hasVirtualTour",
                "documents",
                "referenceNumber",
                "onlineId",
                "isNew",
                "createdAt",
                "updatedAt",
                "searchUrl",
                "scrapedAt"
              ],
              "enumTitles": [
                "Record type (type)",
                "Immowelt classified ID (classifiedId)",
                "Listing UUID (listingId)",
                "Listing URL (url)",
                "Detail page scraped (detailScraped)",
                "Title (title)",
                "Headline (headline)",
                "Deal type (RENT/SALE) (dealType)",
                "Property type (propertyType)",
                "Property sub-type (propertySubType)",
                "New-build project (isNewBuildProject)",
                "Price (as shown) (priceText)",
                "Price label (priceLabel)",
                "Price (number) (price)",
                "Price per m² (pricePerSqm)",
                "Currency (currency)",
                "Cost breakdown (costs)",
                "Deposit (deposit)",
                "Commission text (commissionText)",
                "Has brokerage fee (hasBrokerageFee)",
                "Price note (priceNote)",
                "Rooms (rooms)",
                "Living space m² (livingSpaceSqm)",
                "Plot area m² (plotAreaSqm)",
                "Availability (availability)",
                "Floor (floor)",
                "Year built (yearOfConstruction)",
                "Condition (condition)",
                "Heating system (heatingSystem)",
                "Energy source (energySource)",
                "Energy certificate type (energyCertificateType)",
                "Energy certificate validity (energyCertificateValidity)",
                "Energy efficiency class (energyEfficiencyClass)",
                "Energy demand (energyDemand)",
                "Street (street)",
                "District (district)",
                "City (city)",
                "Postcode (zipCode)",
                "Federal state (region)",
                "Country (country)",
                "Address (as shown) (addressText)",
                "Address published (isAddressPublished)",
                "Latitude (latitude)",
                "Longitude (longitude)",
                "Location is an approximate area (locationIsApproximate)",
                "Description (description)",
                "Location description (locationDescription)",
                "Additional information (additionalInformation)",
                "Amenities (amenities)",
                "AI-detected features (aiDetectedFeatures)",
                "Agency name (agencyName)",
                "Contact person (contactPerson)",
                "Agency ID (agencyId)",
                "Phone (phone)",
                "Website (website)",
                "Agency address (agencyAddress)",
                "Agency profile URL (profileUrl)",
                "Imprint URL (imprintUrl)",
                "Publisher type (publisherType)",
                "Private owner (isPrivateOwner)",
                "Agency logo URL (agencyLogoUrl)",
                "Photos (images)",
                "Photo count (imageCount)",
                "Photo scene tags (imageScenes)",
                "Floor plans (floorplans)",
                "Videos (videos)",
                "Has 3D/virtual tour (hasVirtualTour)",
                "Documents (documents)",
                "Reference number (referenceNumber)",
                "Online ID (onlineId)",
                "Newly listed (isNew)",
                "Listed at (createdAt)",
                "Updated at (updatedAt)",
                "Source search URL (searchUrl)",
                "Scraped at (scrapedAt)"
              ]
            }
          },
          "monitorMode": {
            "title": "Monitor mode - only new listings",
            "type": "boolean",
            "description": "Remember which listings this Actor has already returned and emit only listings it has not seen before. Ideal on a schedule for new-listing alerts. Already-seen listings are skipped and never charged.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store that holds the monitor's memory. Use different names to track different searches independently.",
            "default": "immowelt-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many listing detail pages to fetch at once.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy used for Immowelt search pages. Apify Proxy (datacenter) is enough - search pages are not anti-bot protected. Listing detail pages always go through Bright Data Web Unlocker and ignore this setting.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}