{
  "openapi": "3.0.1",
  "info": {
    "title": "Otodom.pl Scraper — Polish Real Estate Listings + GPS",
    "description": "Drop-in compatible with trev0n/otodom-scraper — cheaper, reliable, no residential proxy. Otodom.pl listings as JSON: price, price/m2, area, rooms, floor, market, full location + GPS, building type/year, heating, ownership, features, images, agency. Sale and rent; flats, houses, plots.",
    "version": "1.0",
    "x-build-id": "nI8ER7GTVwPC6Awoq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/diopside~otodom-listings/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-diopside-otodom-listings",
        "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/diopside~otodom-listings/runs": {
      "post": {
        "operationId": "runs-sync-diopside-otodom-listings",
        "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/diopside~otodom-listings/run-sync": {
      "post": {
        "operationId": "run-sync-diopside-otodom-listings",
        "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": "Start URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Otodom.pl URLs — search result pages (`/pl/wyniki/...`) or single offers (`/pl/oferta/...`). Filters already in the URL are preserved. When set, `searchType` / `propertyType` / `location` are ignored.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchType": {
            "title": "Search Type",
            "enum": [
              "sprzedaz",
              "wynajem"
            ],
            "type": "string",
            "description": "Sale or rent.",
            "default": "sprzedaz"
          },
          "propertyType": {
            "title": "Property Type",
            "enum": [
              "mieszkanie",
              "dom",
              "dzialka",
              "lokal",
              "haleimagazyny",
              "garaz"
            ],
            "type": "string",
            "description": "Type of property to search for.",
            "default": "mieszkanie"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "The location path from an Otodom search URL — everything after `/wyniki/<searchType>/<propertyType>/`. Examples: `mazowieckie/warszawa/warszawa/warszawa` (Warsaw), `malopolskie/krakow/krakow/krakow` (Kraków), `mazowieckie` (whole voivodeship), `cala-polska` (all of Poland). A bare city name such as `warszawa` is not a valid path — if unsure, run the search on otodom.pl and paste the whole URL into `startUrls` instead.",
            "default": "cala-polska"
          },
          "priceMin": {
            "title": "Price Min (PLN)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price in PLN. For rentals this is the monthly rent."
          },
          "priceMax": {
            "title": "Price Max (PLN)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price in PLN. For rentals this is the monthly rent."
          },
          "areaMin": {
            "title": "Area Min (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum floor area in square metres."
          },
          "areaMax": {
            "title": "Area Max (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum floor area in square metres."
          },
          "roomsMin": {
            "title": "Rooms Min",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Minimum number of rooms."
          },
          "roomsMax": {
            "title": "Rooms Max",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of rooms."
          },
          "buildYear": {
            "title": "Build Year From",
            "minimum": 1900,
            "maximum": 2030,
            "type": "integer",
            "description": "Minimum construction year."
          },
          "market": {
            "title": "Market",
            "enum": [
              "ALL",
              "PRIMARY",
              "SECONDARY"
            ],
            "type": "string",
            "description": "Primary (new-build, sold by a developer) or secondary (resale).",
            "default": "ALL"
          },
          "postedDate": {
            "title": "Posted Date",
            "enum": [
              "",
              "1",
              "3",
              "7",
              "14"
            ],
            "type": "string",
            "description": "Only listings created within the last N days. Combine with `sortBy: LATEST` to poll for new listings on a schedule.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "DEFAULT",
              "LATEST",
              "PRICE_ASC",
              "PRICE_DESC",
              "AREA_ASC",
              "AREA_DESC",
              "PRICE_PER_M_ASC",
              "PRICE_PER_M_DESC"
            ],
            "type": "string",
            "description": "Result order. `LATEST` puts the newest listings first, which is what you want for a scheduled run with a small `maxItems`. Not offered by the incumbent.",
            "default": "DEFAULT"
          },
          "maxItems": {
            "title": "Max Items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum listings per start URL. `0` = every listing Otodom returns (deep pagination is verified — a Warsaw apartment search is ~20 000 listings over ~277 pages).",
            "default": 50
          },
          "extractDetails": {
            "title": "Extract Full Details",
            "type": "boolean",
            "description": "Visit each offer page for GPS coordinates, full description, building type/material/year, heating, ownership, features and all image URLs. Off is ~30x less traffic and gives listing-level fields only.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests.",
            "default": 8
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retries per request. Each retry rotates to a fresh proxy session.",
            "default": 3
          },
          "maxRequestsPerMinute": {
            "title": "Max Requests Per Minute",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "Request rate ceiling, to stay a polite guest on Otodom.",
            "default": 120
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Otodom blocks on the TLS fingerprint, not on IP reputation, so no proxy is needed — and measured over four runs each, the direct connection passed 4/4 in ~3s while the Apify datacenter pool passed 2/4 in ~40s. Leave this empty unless you have a reason not to; `residentialFallback` covers the case where the direct IP is ever blocked.",
            "default": {
              "useApifyProxy": false
            }
          },
          "residentialFallback": {
            "title": "Escalate to residential if blocked",
            "type": "boolean",
            "description": "If Otodom ever blocks the connection this run is using, retry once on Apify RESIDENTIAL proxy in Poland rather than failing. Costs nothing unless it fires. Ignored when you already selected residential or supplied your own proxy URLs.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}