{
  "openapi": "3.0.1",
  "info": {
    "title": "Otodom Property Scraper (Poland)",
    "description": "Scrapes apartments, houses, land and commercial property from Otodom — Poland's #1 real-estate portal, with 150,000+ apartments for sale. Filter by city, price, area and rooms; returns price, area, floor, full description, features, photos and agency. No pagination ceiling.",
    "version": "0.1",
    "x-build-id": "LKlEQM1nKRElDdO31"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~otodom-properties-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-otodom-properties-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/scrapyx~otodom-properties-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-otodom-properties-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/scrapyx~otodom-properties-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-otodom-properties-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": {
          "transaction": {
            "title": "For sale or for rent",
            "enum": [
              "sprzedaz",
              "wynajem"
            ],
            "type": "string",
            "description": "Which side of the market to search.",
            "default": "sprzedaz"
          },
          "estate": {
            "title": "Property type",
            "enum": [
              "mieszkanie",
              "dom",
              "dzialka",
              "lokal",
              "haleimagazyny",
              "garaz",
              "pokoj",
              "inwestycja"
            ],
            "type": "string",
            "description": "Only these values are real Otodom path segments. An unrecognised one is answered with HTTP 200 and silently returns the unfiltered apartment results, so anything else is refused rather than run. Note 'Room' has no for-sale listings — use it with For rent.",
            "default": "mieszkanie"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Otodom location slugs — one search per entry, each with its own SEARCH_SUMMARY row. Use 'cala-polska' for the whole country, a city name like 'krakow', or a full administrative path such as 'mazowieckie/warszawa/warszawa/warszawa'. A human spelling is slugified automatically. An unknown location returns a clean 404 reported as not_found, never silently-wrong nationwide results.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (PLN)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (PLN)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for no maximum.",
            "default": 0
          },
          "minArea": {
            "title": "Minimum area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for any.",
            "default": 0
          },
          "maxArea": {
            "title": "Maximum area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for any.",
            "default": 0
          },
          "rooms": {
            "title": "Number of rooms",
            "type": "array",
            "description": "Select one or more room counts. Values are unioned (choosing TWO and THREE returns both). Any value outside this list is silently ignored by Otodom — widening your search without saying so — so unknown values are refused here instead.",
            "items": {
              "type": "string",
              "enum": [
                "ONE",
                "TWO",
                "THREE",
                "FOUR",
                "FIVE",
                "SIX",
                "SEVEN",
                "EIGHT",
                "NINE",
                "TEN",
                "MORE"
              ],
              "enumTitles": [
                "1 room",
                "2 rooms",
                "3 rooms",
                "4 rooms",
                "5 rooms",
                "6 rooms",
                "7 rooms",
                "8 rooms",
                "9 rooms",
                "10 rooms",
                "More than 10"
              ]
            },
            "default": []
          },
          "sortField": {
            "title": "Sort by",
            "enum": [
              "",
              "LATEST",
              "PRICE",
              "AREA",
              "PRICE_PER_METER"
            ],
            "type": "string",
            "description": "Leave as default unless you need a specific order. Only these values work — Otodom silently ignores an unrecognised sort, returning results in a different order than you asked for, so anything else is refused before the run starts.",
            "default": ""
          },
          "sortDirection": {
            "title": "Sort direction",
            "enum": [
              "",
              "ASC",
              "DESC"
            ],
            "type": "string",
            "description": "Only applies when a sort field is chosen. Defaults to descending.",
            "default": ""
          },
          "offerUrls": {
            "title": "Offer URLs (direct mode)",
            "type": "array",
            "description": "Scrape specific listings directly, skipping search. Accepts a full URL (https://www.otodom.pl/pl/oferta/...-ID4wn7p) or a bare offer slug. Can be combined with a location search in the same run.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "pageSize": {
            "title": "Results per request",
            "minimum": 24,
            "maximum": 72,
            "type": "integer",
            "description": "How many listings to pull per request. Must be 24, 36, 48 or 72 — those are the only values Otodom honours, and 100 or 200 silently fall back to 36. Anything else is refused before the run starts. 72 is the default because it halves the request count versus Otodom's own 36.",
            "default": 72
          },
          "maxItems": {
            "title": "Max properties per location",
            "minimum": 0,
            "type": "integer",
            "description": "Stop paginating a location after this many properties. Set to 0 for unlimited — unlike most portals Otodom has NO pagination ceiling, so unlimited really does mean the whole result set (over 150,000 apartments for sale nationwide). Set a bound unless you mean it.",
            "default": 100
          },
          "includePropertyDetails": {
            "title": "Fetch full property details",
            "type": "boolean",
            "description": "Fetch the complete listing (full description, all features by category, floor plans, agency and owner details, exact location, characteristics) for each result via one extra request per property. Turn this off for a fast listing-only crawl — search rows already carry price, area, rooms, floor, location and photos.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Upper bound on requests in flight at once, across location pagination and detail fetches.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential is the default and is recommended here: Otodom ships a DataDome tag. No challenge was served on any direct test, but datacenter egress is the likeliest place for one to appear.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}