# Otodom.pl Property Scraper 🏠 (`shahidirfan/otodom-pl-property-scraper`) Actor

Extract live property listings from Otodom instantly. Get prices, locations, property types, descriptions & seller contacts. Perfect for real estate market analysis, price tracking, investment research & lead generation. Poland's premier property data source.

- **URL**: https://apify.com/shahidirfan/otodom-pl-property-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

Extract Otodom property listing data at scale from search results pages or single advert URLs. Collect pricing, location, seller, property characteristics, media links, and other structured fields for real estate research, monitoring, and analysis.

### Features

- **Search results scraping** — Collect adverts from Otodom search result URLs with pagination support.
- **Keyword and location input** — Build a search from a keyword and a free-text location when you do not want to provide a full URL.
- **Rich advert fields** — Capture pricing, rooms, area, seller details, coordinates, floor plans, media, and structured property metadata.
- **Single advert support** — Scrape one Otodom advert directly by providing an advert URL.
- **Clean datasets** — Empty and always-null values are removed from the final dataset output.

### Use Cases

#### Market Monitoring
Track asking prices, inventory, and listing freshness across Otodom locations. Build recurring datasets for local market intelligence and pricing comparisons.

#### Lead Generation
Collect seller, agency, and listing details for prospecting or outreach workflows. Use the dataset to filter by location, price, rooms, or property size.

#### Real Estate Research
Create structured property datasets for deeper analysis in spreadsheets, BI tools, or internal dashboards. Compare neighborhoods, districts, and cities using consistent advert fields.

#### Content and Editorial Planning
Find current property examples, feature patterns, and pricing benchmarks for articles, newsletters, and market reports focused on Otodom listings.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `url` | String | No | `https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/cala-polska` | Otodom search results URL or single advert URL. When provided, this takes priority over `keyword` and `location`. |
| `keyword` | String | No | `"penthouse"` | Optional keyword applied when `url` is not provided. |
| `location` | String | No | `"Warszawa"` | Optional location name or Otodom location slug applied when `url` is not provided. |
| `results_wanted` | Integer | No | `20` | Maximum number of adverts to collect. |
| `max_pages` | Integer | No | `5` | Maximum number of search result pages to visit. |
| `proxyConfiguration` | Object | No | `{"useApifyProxy": false}` | Optional proxy configuration for higher reliability. |

---

### Output Data

Each dataset item can include the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `id` | String | Otodom advert identifier. |
| `public_id` | String | Public advert identifier. |
| `title` | String | Advert title. |
| `url` | String | Absolute advert URL. |
| `price` | Number | Advert price value. |
| `currency` | String | Price currency. |
| `rent_price` | Number | Additional rent or fee value when available. |
| `price_per_square_meter` | Number | Price per square meter. |
| `area_m2` | Number | Property area in square meters. |
| `rooms_number` | String | Number of rooms. |
| `floor_number` | String | Floor information. |
| `location_full_name` | String | Full resolved location name. |
| `location_city` | String | City or village. |
| `location_district` | String | District when available. |
| `location_province` | String | Province or voivodeship. |
| `latitude` | Number | Latitude coordinate. |
| `longitude` | Number | Longitude coordinate. |
| `agency_name` | String | Agency name when available. |
| `owner_name` | String | Owner or seller name when available. |
| `description` | String | Full listing description. |
| `image_url` | String | Primary image URL. |
| `image_urls` | Array | Media gallery image URLs. |
| `floor_plan_urls` | Array | Floor plan image URLs. |
| `contact_phones` | Array | Listing contact phone numbers. |
| `characteristics` | Object | Structured property characteristics. |
| `features` | Array | Listing feature labels. |

---

### Usage Examples

#### Scrape a Default Search URL

```json
{
    "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/cala-polska",
    "results_wanted": 20,
    "max_pages": 2
}
````

#### Search by Keyword and Location

```json
{
    "keyword": "penthouse",
    "location": "Warszawa",
    "results_wanted": 15,
    "max_pages": 3
}
```

#### Scrape a Single Advert

```json
{
    "url": "https://www.otodom.pl/pl/oferta/mieszkanie-25-47-m-warszawa-ID4tOkS"
}
```

***

### Sample Output

```json
{
    "id": "66210350",
    "public_id": "4tOkS",
    "title": "Mieszkanie, 25,47 m², Warszawa",
    "url": "https://www.otodom.pl/pl/oferta/mieszkanie-25-47-m-warszawa-ID4tOkS",
    "price": 565000,
    "currency": "PLN",
    "rent_price": 450,
    "price_per_square_meter": 22183,
    "area_m2": 25.47,
    "rooms_number": "1 pokój",
    "floor_number": "9 piętro",
    "location_full_name": "Mirów, Wola, Warszawa, mazowieckie",
    "location_city": "Warszawa",
    "location_district": "Wola",
    "location_province": "mazowieckie",
    "latitude": 52.23208,
    "longitude": 20.996782,
    "agency_name": "Maciej Smoręda Agencja Nieruchomości",
    "owner_name": "Maciej Smoręda Agencja Nieruchomości",
    "image_url": "https://ireland.apollo.olxcdn.com/.../image;s=1280x1024;q=80",
    "contact_phones": [
        "+48604642773"
    ]
}
```

***

### Tips for Best Results

#### Prefer Direct Search URLs

- Use an Otodom search URL when you already know the exact filters you want.
- This keeps your run aligned with the exact search view shown on the site.

#### Start Small

- Start with `results_wanted` between `10` and `20` for quick validation.
- Increase `max_pages` only when you need deeper pagination coverage.

#### Use Specific Keywords

- Keywords such as `penthouse`, `taras`, or `loft` help narrow broad result sets.
- Combine a keyword with a city or district for tighter output.

#### Use a Proxy When Needed

- Add a proxy configuration if you plan frequent or larger runs.
- This can improve stability across repeated requests.

***

### Integrations

Connect your data with:

- **Google Sheets** — Export listings for sorting and review.
- **Airtable** — Build searchable property databases.
- **Looker Studio** — Visualize pricing and listing trends.
- **Make** — Route fresh dataset items into automations.
- **Zapier** — Trigger downstream workflows from completed runs.
- **Webhooks** — Push structured results to your own systems.

#### Export Formats

- **JSON** — For developers and APIs
- **CSV** — For spreadsheet analysis
- **Excel** — For business reporting
- **XML** — For system integrations

***

### Frequently Asked Questions

#### Does the actor support both search URLs and advert URLs?

Yes. You can provide either an Otodom search results URL or a single advert URL.

#### What happens if I provide both `url` and `keyword`?

The `url` input wins. Keyword and location are only used when no URL is provided.

#### Can I search by city without building the Otodom path myself?

Yes. You can pass a free-text `location` such as `Warszawa`, and the actor resolves it automatically.

#### Will empty fields appear in the dataset?

No. Empty and always-null values are removed before records are saved.

#### Can I collect more than one page of results?

Yes. Use `max_pages` and `results_wanted` together to control pagination depth and total output size.

#### Does the actor include seller and media data?

Yes. When available, the actor returns seller details, phone numbers, images, floor plans, and other structured fields.

***

### Support

For issues or feature requests, contact support through the Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/platform/schedules)

***

### Legal Notice

This actor is designed for legitimate data collection purposes. Users are responsible for ensuring compliance with Otodom terms of service and applicable laws. Use collected data responsibly and respect platform limits.

# Actor input Schema

## `url` (type: `string`):

Paste an Otodom search results URL or a single advert URL. If provided, this input has priority over keyword and location.

## `keyword` (type: `string`):

Optional keyword to apply when URL is not provided. Example: penthouse, loft, taras.

## `location` (type: `string`):

Optional city, district, or Otodom location slug when URL is not provided. Example: Warszawa.

## `results_wanted` (type: `integer`):

Maximum number of adverts to collect.

## `max_pages` (type: `integer`):

Safety cap for paginated search results.

## `proxyConfiguration` (type: `object`):

Optional proxy configuration for higher reliability.

## Actor input object example

```json
{
  "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/cala-polska",
  "keyword": "penthouse",
  "location": "Warszawa",
  "results_wanted": 20,
  "max_pages": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/cala-polska",
    "keyword": "penthouse",
    "location": "Warszawa",
    "results_wanted": 20,
    "max_pages": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/otodom-pl-property-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 = {
    "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/cala-polska",
    "keyword": "penthouse",
    "location": "Warszawa",
    "results_wanted": 20,
    "max_pages": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/otodom-pl-property-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 '{
  "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/cala-polska",
  "keyword": "penthouse",
  "location": "Warszawa",
  "results_wanted": 20,
  "max_pages": 2
}' |
apify call shahidirfan/otodom-pl-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Otodom.pl Property Scraper 🏠",
        "description": "Extract live property listings from Otodom instantly. Get prices, locations, property types, descriptions & seller contacts. Perfect for real estate market analysis, price tracking, investment research & lead generation. Poland's premier property data source.",
        "version": "0.0",
        "x-build-id": "TKAfgeMbX3zgNRZnK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~otodom-pl-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-otodom-pl-property-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/shahidirfan~otodom-pl-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-otodom-pl-property-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/shahidirfan~otodom-pl-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-otodom-pl-property-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": {
                    "url": {
                        "title": "Otodom URL",
                        "type": "string",
                        "description": "Paste an Otodom search results URL or a single advert URL. If provided, this input has priority over keyword and location."
                    },
                    "keyword": {
                        "title": "Keyword",
                        "type": "string",
                        "description": "Optional keyword to apply when URL is not provided. Example: penthouse, loft, taras."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Optional city, district, or Otodom location slug when URL is not provided. Example: Warszawa."
                    },
                    "results_wanted": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of adverts to collect.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Safety cap for paginated search results.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy configuration for higher reliability.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
