{
  "openapi": "3.0.1",
  "info": {
    "title": "Otodom.pl Property Scraper — Poland Sale & Rent",
    "description": "Otodom.pl scraper for analysts, agents and AI agents: flats, studios, houses, plots, commercial, rooms and new developments for sale or rent anywhere in Poland.",
    "version": "0.1",
    "x-build-id": "vljpftnrenO3lEqb9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~otodom-pl/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-otodom-pl",
        "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/yadroo~otodom-pl/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-otodom-pl",
        "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/yadroo~otodom-pl/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-otodom-pl",
        "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": "Transaction",
            "enum": [
              "sprzedaz",
              "wynajem"
            ],
            "type": "string",
            "description": "sprzedaz = for sale, wynajem = for rent (monthly).",
            "default": "sprzedaz"
          },
          "estate": {
            "title": "Estate type",
            "enum": [
              "mieszkanie",
              "kawalerka",
              "dom",
              "inwestycja",
              "pokoj",
              "dzialka",
              "lokal",
              "haleimagazyny",
              "garaz"
            ],
            "type": "string",
            "description": "otodom estate slug. pokoj exists only for rent, inwestycja (new development projects) only for sale.",
            "default": "mieszkanie"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Empty = all of Poland. A city name (Warszawa, Kraków, Wrocław, Łódź, Poznań, Gdańsk, Gdynia, Szczecin, Katowice, Lublin, Białystok… — 47 cities built in, diacritics optional), a voivodeship (mazowieckie, malopolskie, slaskie…), \"cala-polska\" for all Poland, or any raw otodom location path copied from a URL (e.g. mazowieckie/warszawa/warszawa/warszawa/mokotow). Full list: README → Reference."
          },
          "district": {
            "title": "District",
            "type": "string",
            "description": "Optional district of the city, e.g. mokotow, srodmiescie, praga-poludnie (Warsaw), stare-miasto, podgorze (Kraków). Appended to the city path."
          },
          "distanceRadius": {
            "title": "Radius around location, km",
            "minimum": 0,
            "maximum": 75,
            "type": "integer",
            "description": "Extend the search around the location by N km. otodom accepts 0, 5, 10, 15, 25, 50 or 75."
          },
          "priceMin": {
            "title": "Price min, zł",
            "minimum": 0,
            "type": "integer",
            "description": "Total price (sale) or monthly rent (rent)."
          },
          "priceMax": {
            "title": "Price max, zł",
            "minimum": 0,
            "type": "integer",
            "description": "Total price (sale) or monthly rent (rent)."
          },
          "pricePerMeterMin": {
            "title": "Price per m² min, zł",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price per m² in zł/m² (otodom's own price-per-m² filter)."
          },
          "pricePerMeterMax": {
            "title": "Price per m² max, zł",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price per m² in zł/m²."
          },
          "areaMin": {
            "title": "Area min, m²",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum area in m² (the area otodom shows on the listing)."
          },
          "areaMax": {
            "title": "Area max, m²",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum area in m²."
          },
          "terrainAreaMin": {
            "title": "Plot area min, m²",
            "minimum": 0,
            "type": "integer",
            "description": "Houses and plots only."
          },
          "terrainAreaMax": {
            "title": "Plot area max, m²",
            "minimum": 0,
            "type": "integer",
            "description": "Houses and plots only."
          },
          "roomsNumber": {
            "title": "Rooms",
            "type": "array",
            "description": "Room counts to include (any of): flats, studios, houses and new developments; ignored for other estate types.",
            "items": {
              "type": "string",
              "enum": [
                "ONE",
                "TWO",
                "THREE",
                "FOUR",
                "FIVE",
                "SIX_OR_MORE"
              ],
              "enumTitles": [
                "1",
                "2",
                "3",
                "4",
                "5",
                "6+"
              ]
            }
          },
          "market": {
            "title": "Market",
            "enum": [
              "ALL",
              "PRIMARY",
              "SECONDARY"
            ],
            "type": "string",
            "description": "Primary vs secondary market (flats and houses).",
            "default": "ALL"
          },
          "ownerType": {
            "title": "Advertiser",
            "enum": [
              "ALL",
              "PRIVATE",
              "AGENCY",
              "DEVELOPER"
            ],
            "type": "string",
            "description": "Who posted the ad.",
            "default": "ALL"
          },
          "buildYearMin": {
            "title": "Build year from",
            "minimum": 1800,
            "maximum": 2100,
            "type": "integer",
            "description": "Oldest build year to include, e.g. 2000 (flats, studios, houses and new developments; ignored for other estate types)."
          },
          "buildYearMax": {
            "title": "Build year to",
            "minimum": 1800,
            "maximum": 2100,
            "type": "integer",
            "description": "Newest build year to include, e.g. 2025 (flats, studios, houses and new developments; ignored for other estate types)."
          },
          "floors": {
            "title": "Floor",
            "type": "array",
            "description": "Floors of the flat to include (any of): flats, studios, houses and new developments; ignored for other estate types.",
            "items": {
              "type": "string",
              "enum": [
                "CELLAR",
                "GROUND",
                "FIRST",
                "SECOND",
                "THIRD",
                "FOURTH",
                "FIFTH",
                "SIXTH",
                "SEVENTH",
                "EIGHTH",
                "NINTH",
                "TENTH",
                "ABOVE_TENTH",
                "GARRET"
              ],
              "enumTitles": [
                "Cellar / suterena",
                "Ground floor (parter)",
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10",
                "Above 10",
                "Attic (poddasze)"
              ]
            }
          },
          "floorsNumberMin": {
            "title": "Building floors from",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of floors in the building (flats, studios, houses and new developments; ignored for other estate types)."
          },
          "floorsNumberMax": {
            "title": "Building floors to",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of floors in the building (flats, studios, houses and new developments; ignored for other estate types)."
          },
          "buildingType": {
            "title": "Building type",
            "type": "array",
            "description": "Building types to include (any of): flats, studios, houses and new developments; ignored for other estate types.",
            "items": {
              "type": "string",
              "enum": [
                "BLOCK",
                "TENEMENT",
                "HOUSE",
                "INFILL",
                "RIBBON",
                "APARTMENT",
                "LOFT"
              ],
              "enumTitles": [
                "Block (blok)",
                "Tenement (kamienica)",
                "Detached house",
                "Infill (plomba)",
                "Terraced (szeregowiec)",
                "Apartment building (apartamentowiec)",
                "Loft"
              ]
            }
          },
          "buildingMaterial": {
            "title": "Building material",
            "type": "array",
            "description": "Building materials to include (any of): flats, studios, houses and new developments; ignored for other estate types.",
            "items": {
              "type": "string",
              "enum": [
                "BRICK",
                "WOOD",
                "BREEZEBLOCK",
                "HYDROTON",
                "CONCRETE_PLATE",
                "CONCRETE",
                "SILIKAT",
                "CELLULAR_CONCRETE",
                "REINFORCED_CONCRETE",
                "OTHER"
              ],
              "enumTitles": [
                "Brick (cegła)",
                "Wood",
                "Breeze block (pustak)",
                "Hydroton",
                "Large panel (wielka płyta)",
                "Concrete",
                "Silicate (silikat)",
                "Cellular concrete",
                "Reinforced concrete",
                "Other"
              ]
            }
          },
          "extras": {
            "title": "Extras",
            "type": "array",
            "description": "Extras that must all be present. Only extras otodom's search really filters by are listed.",
            "items": {
              "type": "string",
              "enum": [
                "BALCONY",
                "TERRACE",
                "GARDEN",
                "GARAGE",
                "BASEMENT",
                "LIFT",
                "SEPARATE_KITCHEN",
                "TWO_STOREY"
              ],
              "enumTitles": [
                "Balcony",
                "Terrace",
                "Garden",
                "Garage / parking",
                "Basement (piwnica)",
                "Lift",
                "Separate kitchen",
                "Two-storey (dwupoziomowe)"
              ]
            }
          },
          "keyword": {
            "title": "Keyword in description",
            "type": "string",
            "description": "Free text searched in the ad description, e.g. \"metro\", \"widok\", \"pompa ciepła\"."
          },
          "hasPhotos": {
            "title": "With photos only",
            "type": "boolean",
            "description": "Only ads with at least one photo.",
            "default": false
          },
          "hasMovie": {
            "title": "With video only",
            "type": "boolean",
            "description": "Only ads with a video.",
            "default": false
          },
          "hasOpenDay": {
            "title": "Open day only",
            "type": "boolean",
            "description": "Only ads that announce an open day (dzień otwarty).",
            "default": false
          },
          "hasRemoteServices": {
            "title": "Remote viewing available",
            "type": "boolean",
            "description": "Only ads that offer remote viewing (e.g. a virtual tour or a video call).",
            "default": false
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "relevance",
              "newest",
              "price_asc",
              "price_desc",
              "area_asc",
              "area_desc"
            ],
            "type": "string",
            "description": "Sort order. otodom offers no price-per-m² sort; sort the dataset by pricePerM2 instead.",
            "default": "relevance"
          },
          "sinceHours": {
            "title": "Added within (hours)",
            "minimum": 1,
            "maximum": 8760,
            "type": "integer",
            "description": "Only ads added or refreshed in the last N hours. Up to 720 h (30 days) it is sent to otodom as its day filter (1, 2, 3, 7, 14, 30 days) and re-checked on the exact time; above 720 h the actor reads all ads and checks the time itself. firstPublishedAt tells you when the ad first appeared."
          },
          "excludeInvestments": {
            "title": "Exclude development tiles",
            "type": "boolean",
            "description": "Flat searches also return one row per new-build project (listingType \"investment\": no price, but units count, area/rooms/floor ranges, delivery date). The flats inside a project are always returned as normal listings. Enable to drop the project rows and keep only the flats.",
            "default": false
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many listings (rows). Without detail about 1,000 listings take a minute; with detail: true each listing takes about 1.7 s, so about 2,000 fit into the default 1-hour run timeout. A run near its timeout stops, keeps every listing saved so far and says so in the status.",
            "default": 50
          },
          "maxPages": {
            "title": "Max pages",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Optional safety cap on search pages (72 listings each, 36 when maxItems ≤ 36). Empty = as many pages as maxItems needs (up to 200). When this cap ends paging early, the status says so."
          },
          "detail": {
            "title": "Open offer pages",
            "type": "boolean",
            "description": "+1 request per listing, about 1.7 s each (about 2,000 listings per hour): full description, GPS coordinates, market (primary/secondary), build year, building floors/type/material, heating, windows, ownership, construction status, extras, equipment, security, media, deposit, extra rent, available-from date, advertiser name, all photos. Phone/address only for agencies and developers. Listings are saved in small batches as they are ready. If otodom blocks offer pages, the run keeps the list data, marks items with detailError and says so in the status.",
            "default": false
          },
          "dedupe": {
            "title": "Dedupe",
            "type": "boolean",
            "description": "Kept for older inputs; it has no effect. Each listing id is saved (and charged) at most once per run, whatever this is set to.",
            "default": true
          },
          "fields": {
            "title": "Output fields",
            "type": "array",
            "description": "Keep only these fields per item, in this order, e.g. [\"price\",\"pricePerM2\",\"area\",\"rooms\",\"district\",\"url\"]; id always comes first unless you place it. A wrong letter case or a small typo (\"pricePerm2\") is corrected and reported in the status; unknown names are left out with a warning, and if none is valid the run fails with the list of names. Empty = all fields.",
            "items": {
              "type": "string"
            }
          },
          "extraParams": {
            "title": "Extra URL parameters",
            "type": "object",
            "description": "Other otodom query parameters copied from a search URL, e.g. {\"isExclusiveOffer\": 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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}