# Otodom Pl $0.8💰 URL Search | Location Filters | Rich Output (`abotapi/otodom-pl-scraper`) Actor

Pull property listings from Otodom.pl. Apartments, houses, plots, commercial, garages, new developments, rooms; sale and rent. Search builder (city + transaction + property type + filters) and URL-paste modes.

- **URL**: https://apify.com/abotapi/otodom-pl-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Otodom.pl Property Scraper

Pull property listings from Otodom.pl, the largest property portal in Poland (OLX Group). Apartments, houses, plots, commercial, garages, new developments, rooms; sale and rent. Search builder (city + transaction + property type + filters) and URL-paste modes, with auto forward pagination across SERP pages.

Output is one flat JSON record per listing: id, title, price, area, rooms, full address, GPS coordinates, description, agent contact, building year, ownership, market type, and full feature list.

### Why This Scraper?

- **Polish portal coverage**: top-80 cities + all 16 voivodeships recognized by name (Warszawa, Kraków, Wrocław, Gdańsk, Łódź, Sopot, ...). For unknown cities, drop a URL into URL mode.
- **30 fields per listing**: SERP fields (price, area, rooms, city, agency, photo) plus detail-page enrichment (lat/lng, description, full feature list, build year, ownership, market type, agent phone).
- **Two input modes**: structured search (transaction, property type, price/area/rooms ranges, market type, sort) or paste any otodom.pl URL refined in your browser.
- **Forward pagination by default**: configurable `maxPages` per search; per-search budget cap so multi-city searches return balanced results.
- **HTTP-only**: no headless browser. ~80 MB peak memory, ~36 listings/page.
- **Resilient session management**: automatic 3-tier proxy preflight (chosen proxy → default Apify proxy → no proxy), so free-tier accounts get a graceful fallback instead of a hard fail.

### Data You Get

> Sample shape, values are illustrative placeholders, not from a live listing.

| Field | Example |
|---|---|
| `id` | `"00000001"` |
| `url` | `"https://www.otodom.pl/pl/oferta/sample-listing-ID00000"` |
| `title` | `"Sample Apartment Title"` |
| `transaction` | `"sprzedaz"` |
| `estate` | `"mieszkanie"` |
| `priceTotal` | `750000` |
| `priceCurrency` | `"PLN"` |
| `pricePerSquareMeter` | `15000` |
| `rentPrice` | `null` |
| `rentAdditional` | `null` |
| `deposit` | `null` |
| `areaInSquareMeters` | `50.0` |
| `rooms` | `2` |
| `floor` | `"3"` |
| `buildingFloors` | `5` |
| `buildYear` | `2010` |
| `marketType` | `"secondary"` |
| `ownership` | `"full_ownership"` |
| `buildingType` | `"block"` |
| `buildingMaterial` | `"concrete"` |
| `heating` | `"urban"` |
| `windowsType` | `"plastic"` |
| `city` | `"Warszawa"` |
| `province` | `"mazowieckie"` |
| `district` | `"Mokotów"` |
| `street` | `"ul. Sample"` |
| `postalCode` | `"00-000"` |
| `latitude` | `52.0000` |
| `longitude` | `21.0000` |
| `agencyName` | `"Sample Agency"` |
| `advertiserType` | `"agency"` |
| `contactName` | `"Agent Name"` |
| `phone` | `"+48000000000"` |
| `referenceId` | `"REF-0001"` |
| `description` | `"Full seller description text appears here when fetchDetails=true."` |
| `features` | `["meble", "balkon", "winda"]` |
| `isPromoted` | `false` |
| `isExclusive` | `false` |
| `isPrivateOwner` | `false` |
| `imageCount` | `12` |
| `imageUrl` | `"https://ireland.apollo.olxcdn.com/v1/files/000000000-OTODOM/image"` |
| `dateCreated` | `"2026-01-01T00:00:00.000Z"` |
| `investmentEstimatedDelivery` | `null` |
| `scrapedAt` | `"2026-04-28T00:00:00.000Z"` |

### How to Use

#### Search mode, basic Warsaw apartments for sale

```json
{
  "mode": "search",
  "transaction": "sprzedaz",
  "estate": "mieszkanie",
  "locations": ["Warszawa"],
  "maxPages": 3,
  "maxListings": 50,
  "fetchDetails": true,
  "proxy": { "useApifyProxy": true }
}
````

#### Search mode, rentals in three cities, filtered

```json
{
  "mode": "search",
  "transaction": "wynajem",
  "estate": "mieszkanie",
  "locations": ["Warszawa", "Krakow", "Wroclaw"],
  "minPrice": 2000,
  "maxPrice": 4500,
  "minRooms": 2,
  "maxRooms": 3,
  "sortBy": "PRICE_ASC",
  "maxPages": 2,
  "maxListings": 60,
  "fetchDetails": true,
  "proxy": { "useApifyProxy": true }
}
```

#### Search mode, new developments only (primary market)

```json
{
  "mode": "search",
  "transaction": "sprzedaz",
  "estate": "mieszkanie",
  "locations": ["Warszawa"],
  "marketType": "primary",
  "maxPages": 2,
  "maxListings": 30,
  "fetchDetails": true,
  "proxy": { "useApifyProxy": true }
}
```

#### URL mode, paste any otodom.pl search URL

```json
{
  "mode": "url",
  "urls": [
    "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa/mokotow",
    "https://www.otodom.pl/pl/wyniki/wynajem/dom/malopolskie/krakow/krakow/krakow"
  ],
  "maxPages": 5,
  "maxListings": 100,
  "fetchDetails": true,
  "proxy": { "useApifyProxy": true }
}
```

URL mode is the recommended path when you need filters not exposed above (district, neighborhood, building type), or for cities outside the built-in lookup table. Open Otodom.pl, refine your search in the browser, copy the URL.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `"search"` | `"search"` (use filters below) or `"url"` (paste URLs) |
| `transaction` | string | `"sprzedaz"` | `"sprzedaz"` (sale) or `"wynajem"` (rent) |
| `estate` | string | `"mieszkanie"` | `mieszkanie`, `dom`, `dzialka`, `lokal`, `garaz`, `inwestycja`, `pokoj` |
| `locations` | string\[] | `["Warszawa"]` | Polish city names (built-in lookup for top 80 cities + 16 voivodeships) |
| `marketType` | string | `"all"` | `all`, `primary` (rynek pierwotny), `secondary` (rynek wtórny) |
| `minPrice`, `maxPrice` | integer | none | PLN range on totalPrice |
| `minArea`, `maxArea` | integer | none | m² range on areaInSquareMeters |
| `minRooms`, `maxRooms` | integer | none | Room count range, 1 to 10 |
| `sortBy` | string | `"DEFAULT"` | `DEFAULT`, `LATEST`, `PRICE_ASC`, `PRICE_DESC`, `AREA_ASC`, `AREA_DESC` |
| `urls` | string\[] | example | Full otodom.pl URLs (URL mode only) |
| `maxPages` | integer | `3` | Pages to walk per search (each page ~36 listings) |
| `maxListings` | integer | `0` | Stop after N total. `0` = no cap |
| `fetchDetails` | boolean | `true` | Fetch detail page for GPS, description, agent phone, features |
| `proxy` | object | datacenter | Apify proxy config |

### Output Example

> Sample shape, values are illustrative placeholders, not from a live listing.

```json
{
  "id": "00000001",
  "url": "https://www.otodom.pl/pl/oferta/sample-listing-ID00000",
  "title": "Sample Apartment Title",
  "transaction": "sprzedaz",
  "estate": "mieszkanie",
  "priceTotal": 750000,
  "priceCurrency": "PLN",
  "pricePerSquareMeter": 15000,
  "rentPrice": null,
  "rentAdditional": null,
  "deposit": null,
  "areaInSquareMeters": 50.0,
  "rooms": 2,
  "floor": "3",
  "buildingFloors": 5,
  "buildYear": 2010,
  "marketType": "secondary",
  "ownership": "full_ownership",
  "buildingType": "block",
  "buildingMaterial": "concrete",
  "heating": "urban",
  "windowsType": "plastic",
  "city": "Warszawa",
  "province": "mazowieckie",
  "district": "Mokotów",
  "street": "ul. Sample",
  "postalCode": "00-000",
  "latitude": 52.0000,
  "longitude": 21.0000,
  "agencyName": "Sample Agency",
  "advertiserType": "agency",
  "contactName": "Agent Name",
  "phone": "+48000000000",
  "referenceId": "REF-0001",
  "description": "Full seller description text appears here when fetchDetails=true.",
  "features": ["meble", "balkon", "winda"],
  "isPromoted": false,
  "isExclusive": false,
  "isPrivateOwner": false,
  "imageCount": 12,
  "imageUrl": "https://ireland.apollo.olxcdn.com/v1/files/000000000-OTODOM/image",
  "dateCreated": "2026-01-01T00:00:00.000Z",
  "investmentEstimatedDelivery": null,
  "scrapedAt": "2026-04-28T00:00:00.000Z"
}
```

### Plan Requirement

- **Default proxy is Apify residential with country=PL**. Gives clean first-try fetches and the fastest end-to-end wall time.
- **Bring your own proxy URLs**: paste them into the proxy field instead. Make sure they reach Poland for stable routing.
- **fetchDetails ON**: roughly 1 extra HTTP request per listing. Latitude / longitude, full description, agent phone, build year, and the full feature list only appear on the detail page; turn it OFF only if you do not need any of these.

# Actor input Schema

## `mode` (type: `string`):

Search mode = pick transaction + property type + cities + filters below. URL mode = paste any Otodom search URL refined in a browser (recommended for filters not exposed below, like district/neighborhood).

## `transaction` (type: `string`):

Sale (sprzedaż) or rent (wynajem). Used to build the canonical Otodom URL.

## `estate` (type: `string`):

Otodom property type segment. Apartment (mieszkanie), house (dom), plot (działka), commercial (lokal), garage (garaż), investment / new development (inwestycja), room (pokój).

## `locations` (type: `array`):

Polish city names. Recognized: Warszawa, Kraków, Wrocław, Gdańsk, Łódź, Poznań, Szczecin, Bydgoszcz, Lublin, Białystok, Katowice, Gdynia, Sopot, Gliwice, Zabrze, Rzeszów, Olsztyn, Toruń, Kielce, Radom, Częstochowa, Bytom, Tychy, Opole, Sosnowiec, plus all 16 voivodeship names. For unknown / smaller cities, leave empty (Poland-wide search) or use URL mode. The cartesian product of property type × city is searched.

## `marketType` (type: `string`):

Filter by primary (rynek pierwotny, new from developer) or secondary (rynek wtórny, resale). Default = both.

## `minPrice` (type: `integer`):

Lower bound on totalPrice (PLN). Optional.

## `maxPrice` (type: `integer`):

Upper bound on totalPrice (PLN). Optional.

## `minArea` (type: `integer`):

Lower bound on areaInSquareMeters. Optional.

## `maxArea` (type: `integer`):

Upper bound on areaInSquareMeters. Optional.

## `minRooms` (type: `integer`):

Minimum number of rooms (1-10).

## `maxRooms` (type: `integer`):

Maximum number of rooms (1-10).

## `sortBy` (type: `string`):

Default = newest. Otodom inserts promoted listings ahead of organic order regardless of sort, so sort is best-effort.

## `urls` (type: `array`):

One or more full otodom.pl URLs. Tip: open otodom.pl in your browser, refine your search (city, district, filters), copy the URL from the address bar. Multi-URL supported. Filter fields above are ignored. Pagination starts at the page in the URL and walks forward.

## `maxPages` (type: `integer`):

Hard cap on how many SERP pages to walk per city × property type combination (or per pasted URL). Each page returns ~36 listings.

## `maxListings` (type: `integer`):

Stop after this many listings across all searches. 0 = no cap.

## `fetchDetails` (type: `boolean`):

When ON, also fetch each listing's detail page for GPS coordinates, full description, agent phone, building year, ownership type, full feature list. SERP cards already carry id, title, price, area, rooms, city, province, agency, image. Latitude/longitude only appear on detail pages. Default ON.

## `proxy` (type: `object`):

Default = Apify residential with country=PL. Gives clean first-try fetches and the fastest end-to-end wall time.

## Actor input object example

```json
{
  "mode": "search",
  "transaction": "sprzedaz",
  "estate": "mieszkanie",
  "locations": [
    "Warszawa"
  ],
  "marketType": "all",
  "sortBy": "DEFAULT",
  "urls": [
    "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
  ],
  "maxPages": 2,
  "maxListings": 0,
  "fetchDetails": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Warszawa"
    ],
    "urls": [
        "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/otodom-pl-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Warszawa"],
    "urls": ["https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/otodom-pl-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Warszawa"
  ],
  "urls": [
    "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}' |
apify call abotapi/otodom-pl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=abotapi/otodom-pl-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Otodom Pl $0.8💰 URL Search | Location Filters | Rich Output",
        "description": "Pull property listings from Otodom.pl. Apartments, houses, plots, commercial, garages, new developments, rooms; sale and rent. Search builder (city + transaction + property type + filters) and URL-paste modes.",
        "version": "1.0",
        "x-build-id": "PNRoh0FXtmCjHrzfR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~otodom-pl-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-otodom-pl-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/abotapi~otodom-pl-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-otodom-pl-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/abotapi~otodom-pl-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-otodom-pl-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "1. Search mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "Search mode = pick transaction + property type + cities + filters below. URL mode = paste any Otodom search URL refined in a browser (recommended for filters not exposed below, like district/neighborhood).",
                        "default": "search"
                    },
                    "transaction": {
                        "title": "Transaction",
                        "enum": [
                            "sprzedaz",
                            "wynajem"
                        ],
                        "type": "string",
                        "description": "Sale (sprzedaż) or rent (wynajem). Used to build the canonical Otodom URL.",
                        "default": "sprzedaz"
                    },
                    "estate": {
                        "title": "Property type",
                        "enum": [
                            "mieszkanie",
                            "dom",
                            "dzialka",
                            "lokal",
                            "garaz",
                            "inwestycja",
                            "pokoj"
                        ],
                        "type": "string",
                        "description": "Otodom property type segment. Apartment (mieszkanie), house (dom), plot (działka), commercial (lokal), garage (garaż), investment / new development (inwestycja), room (pokój).",
                        "default": "mieszkanie"
                    },
                    "locations": {
                        "title": "Cities",
                        "type": "array",
                        "description": "Polish city names. Recognized: Warszawa, Kraków, Wrocław, Gdańsk, Łódź, Poznań, Szczecin, Bydgoszcz, Lublin, Białystok, Katowice, Gdynia, Sopot, Gliwice, Zabrze, Rzeszów, Olsztyn, Toruń, Kielce, Radom, Częstochowa, Bytom, Tychy, Opole, Sosnowiec, plus all 16 voivodeship names. For unknown / smaller cities, leave empty (Poland-wide search) or use URL mode. The cartesian product of property type × city is searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "marketType": {
                        "title": "Market type",
                        "enum": [
                            "all",
                            "primary",
                            "secondary"
                        ],
                        "type": "string",
                        "description": "Filter by primary (rynek pierwotny, new from developer) or secondary (rynek wtórny, resale). Default = both.",
                        "default": "all"
                    },
                    "minPrice": {
                        "title": "Min price (PLN)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Lower bound on totalPrice (PLN). Optional."
                    },
                    "maxPrice": {
                        "title": "Max price (PLN)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Upper bound on totalPrice (PLN). Optional."
                    },
                    "minArea": {
                        "title": "Min area (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Lower bound on areaInSquareMeters. Optional."
                    },
                    "maxArea": {
                        "title": "Max area (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Upper bound on areaInSquareMeters. Optional."
                    },
                    "minRooms": {
                        "title": "Min rooms",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Minimum number of rooms (1-10)."
                    },
                    "maxRooms": {
                        "title": "Max rooms",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of rooms (1-10)."
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "DEFAULT",
                            "LATEST",
                            "PRICE_ASC",
                            "PRICE_DESC",
                            "AREA_ASC",
                            "AREA_DESC"
                        ],
                        "type": "string",
                        "description": "Default = newest. Otodom inserts promoted listings ahead of organic order regardless of sort, so sort is best-effort.",
                        "default": "DEFAULT"
                    },
                    "urls": {
                        "title": "Search URLs (URL mode)",
                        "type": "array",
                        "description": "One or more full otodom.pl URLs. Tip: open otodom.pl in your browser, refine your search (city, district, filters), copy the URL from the address bar. Multi-URL supported. Filter fields above are ignored. Pagination starts at the page in the URL and walks forward.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPages": {
                        "title": "Max pages per search",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on how many SERP pages to walk per city × property type combination (or per pasted URL). Each page returns ~36 listings.",
                        "default": 2
                    },
                    "maxListings": {
                        "title": "Max listings (total)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many listings across all searches. 0 = no cap.",
                        "default": 0
                    },
                    "fetchDetails": {
                        "title": "Fetch detail pages (richer data, slower)",
                        "type": "boolean",
                        "description": "When ON, also fetch each listing's detail page for GPS coordinates, full description, agent phone, building year, ownership type, full feature list. SERP cards already carry id, title, price, area, rooms, city, province, agency, image. Latitude/longitude only appear on detail pages. Default ON.",
                        "default": true
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Default = Apify residential with country=PL. Gives clean first-try fetches and the fastest end-to-end wall time."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
