{
  "openapi": "3.0.1",
  "info": {
    "title": "Otodom Scraper: Poland Property Listings & Prices",
    "description": "Scrape Otodom.pl property listings (Poland) by search URL or city, type, price, area and rooms. Prices, price per m2, location, agency, photos; optional full details. No private seller contacts. Unofficial.",
    "version": "0.1",
    "x-build-id": "lsahmFZKe3fSYw0v0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kyungminlee~otodom-listings-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kyungminlee-otodom-listings-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/kyungminlee~otodom-listings-scraper/runs": {
      "post": {
        "operationId": "runs-sync-kyungminlee-otodom-listings-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/kyungminlee~otodom-listings-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-kyungminlee-otodom-listings-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": "Otodom search or offer URLs",
            "type": "array",
            "description": "Otodom pages copied from your browser, one per line, for example `https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa?priceMax=900000`. Search URLs keep all their own filters (district, price, area, rooms, market, and so on). Offer pages (`https://www.otodom.pl/pl/oferta/...-ID4xxxx`) return that one listing with full details. Map views (`map=1`) and other pages Otodom's robots.txt disallows are rejected. Use URLs, the search fields below, or both.",
            "items": {
              "type": "string"
            }
          },
          "transaction": {
            "title": "Buy or rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "Properties for sale or for rent. Used by the search fields below, not by pasted URLs.",
            "default": "sale"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "flat",
              "house",
              "plot",
              "commercial",
              "room",
              "garage",
              "warehouse"
            ],
            "type": "string",
            "description": "Property type for the search fields below.",
            "default": "flat"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "One search per line. Use a large city (`Warszawa`, `Kraków`, `Wrocław`, `Poznań`, `Gdańsk`, `Łódź`, `Katowice` and about 30 more), a voivodeship (`mazowieckie`, `małopolskie`, ...), `Poland` for the whole country, or an Otodom location path such as `mazowieckie/warszawa/warszawa/warszawa`. For other towns or a single district, set the filters on otodom.pl and paste the result URL above. Leave empty (and give no URLs) to search all of Poland.",
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "Minimum price (PLN)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest total price in PLN. For rentals this is the monthly rent."
          },
          "priceMax": {
            "title": "Maximum price (PLN)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest total price in PLN. For rentals this is the monthly rent."
          },
          "areaMin": {
            "title": "Minimum area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest area in square metres."
          },
          "areaMax": {
            "title": "Maximum area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Largest area in square metres."
          },
          "rooms": {
            "title": "Number of rooms",
            "uniqueItems": true,
            "type": "array",
            "description": "Only listings with these room counts. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5",
                "6+"
              ],
              "enumTitles": [
                "1 room",
                "2 rooms",
                "3 rooms",
                "4 rooms",
                "5 rooms",
                "6 or more rooms"
              ]
            }
          },
          "market": {
            "title": "Market",
            "enum": [
              "any",
              "primary",
              "secondary"
            ],
            "type": "string",
            "description": "Primary-market (new build from a developer) or secondary-market (resale) listings.",
            "default": "any"
          },
          "advertiserType": {
            "title": "Advertiser",
            "enum": [
              "any",
              "agency",
              "private"
            ],
            "type": "string",
            "description": "Filter by who advertises. Private owners are returned without any name or contact data, only the `isPrivateOwner` flag.",
            "default": "any"
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "newest",
              "price-asc",
              "price-desc",
              "area-desc",
              "default"
            ],
            "type": "string",
            "description": "Result order. Otodom's own default order shifts while you page through it (bumped listings jump to the top), which can repeat or miss listings, so the default here is newest first by publication date, which pages steadily. Price lowest first also pages steadily but starts with test and placeholder prices. Duplicates are removed by listing ID in any case.",
            "default": "newest"
          },
          "maxListings": {
            "title": "Maximum listings per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "How many listings to save for each search URL and each location. Otodom serves at most about 3,600 listings (50 pages) per search, so split bigger searches with price or area filters. The run's maximum charge can stop it earlier.",
            "default": 100
          },
          "includeDetails": {
            "title": "Include details (opens every listing page)",
            "type": "boolean",
            "description": "Also open each listing page and add the full description, coordinates, building year, heating, ownership, finishing state, energy class, equipment, extras, deposit and floor plans. One extra request per listing at about one request per second (roughly 20 minutes per 1,000 listings), billed as the `listing-detail` event instead of `listing`. Phone numbers and e-mail addresses inside descriptions are masked.",
            "default": false
          },
          "maxPagesPerSearch": {
            "title": "Maximum result pages per search",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Result pages (72 listings each) to read per search. 50 is the most Otodom is known to serve reliably.",
            "default": 50
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Otodom serves the run's own IP, so no proxy is used by default. You can turn on the plain Apify datacenter proxy. Residential proxies are not supported, and the Actor never switches IPs to get around a block: if Otodom refuses requests, it waits once, tries once more and then stops.",
            "default": {
              "useApifyProxy": 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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}