# Otodom Property Extractor (`kawsar/otodom-property-extractor`) Actor

Otodom property scraper that extracts detailed real estate listings, prices, and high-resolution images, giving you structured market data without the hassle of manual copying.

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

## Pricing

from $3.40 / 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 Property Extractor: Scrape Real Estate Data from Otodom.pl

The Otodom Property Extractor pulls detailed real estate listings directly from Poland's largest property platform, Otodom.pl. It extracts prices, location details, room counts, agency information, and high-resolution images, giving you structured data without the hassle of manual copying.

This tool automatically navigates site structures and handles pagination, letting you focus on analyzing the Polish housing market rather than managing web crawlers. You can scrape flats, houses, commercial properties, or land by simply providing Otodom search URLs.

**Key features:**
- Extract property details like area, price per square meter, floor, and room counts
- Download full-resolution image URLs for every listing
- Scrape agency details and tags (e.g., balcony, secure building)
- Handle pagination automatically to scrape thousands of results per URL

Good for real estate investors, market analysts, and property agencies who need accurate data on the Polish housing market.

### What data does this actor extract?

The actor extracts the following fields for each property listing and exports them in JSON, CSV, or Excel formats.

#### Output Example

```json
{
    "id": 55325476,
    "title": "MIESZKANIE Z WIDOKIEM NA PARK KASPROWICZA",
    "url": "https://www.otodom.pl/pl/oferta/mieszkanie-z-widokiem-na-park-kasprowicza-ID3K8Go",
    "estateType": "FLAT",
    "transaction": "RENT",
    "price": 3600,
    "currency": "PLN",
    "pricePerSquareMeter": 37,
    "areaInSquareMeters": 96.12,
    "roomsNumber": "THREE",
    "floorNumber": "FOURTH",
    "dateCreated": "2026-05-29 10:41:13",
    "shortDescription": "Oferuję do wynajęcia przestronne mieszkanie o powierzchni 96,12 m². Znajduje się na 4. piętrze w kamienicy z cegły, w bardzo dobrym stanie. Mieszkanie jest w pełni wyposażone: zmywarka, lodówka, pieka...",
    "location": {
      "mapDetails": {
        "radius": 0,
        "__typename": "MapDetails"
      },
      "address": {
        "street": {
          "name": "ul. Juliusza Słowackiego",
          "number": "",
          "__typename": "Street"
        },
        "city": {
          "name": "Szczecin",
          "__typename": "City"
        },
        "province": {
          "name": "zachodniopomorskie",
          "__typename": "Province"
        },
        "__typename": "Address"
      },
      "reverseGeocoding": {
        "locations": [
          {
            "id": "zachodniopomorskie",
            "fullName": "zachodniopomorskie",
            "name": "zachodniopomorskie",
            "locationLevel": "voivodeship",
            "__typename": "BasicLocationObject"
          },
          {
            "id": "zachodniopomorskie/szczecin/szczecin/szczecin",
            "fullName": "Szczecin, zachodniopomorskie",
            "name": "Szczecin",
            "locationLevel": "city_or_village",
            "__typename": "BasicLocationObject"
          },
          {
            "id": "zachodniopomorskie/szczecin/szczecin/szczecin/srodmiescie",
            "fullName": "Śródmieście, Szczecin, zachodniopomorskie",
            "name": "Śródmieście",
            "locationLevel": "district",
            "__typename": "BasicLocationObject"
          },
          {
            "id": "zachodniopomorskie/szczecin/szczecin/szczecin/srodmiescie/niebuszewo--bolinko",
            "fullName": "Niebuszewo-Bolinko, Śródmieście, Szczecin, zachodniopomorskie",
            "name": "Niebuszewo-Bolinko",
            "locationLevel": "residential",
            "__typename": "BasicLocationObject"
          }
        ],
        "__typename": "ReverseGeocoding"
      },
      "__typename": "LocationDetails"
    },
    "images": [
      "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImgxcDA2ZXh0a2lqdzItQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.b14QiCy066BkflLOylnxuBuYyUWKHvG9On9G0qqiUbE/image;s=1280x1024;q=80",
      "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImRyMmVncDF3d2pucjItQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.DncKNMfup6Le6ytJZxOAICcprnPa-JltjVyQk5s7SxI/image;s=1280x1024;q=80",
      "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6Imo2N2R4ZHR6OWFoLUFQTCIsInciOlt7ImZuIjoiZW52ZnFxZTFheTRrMS1BUEwiLCJzIjoiMTQiLCJwIjoiMTAsLTEwIiwiYSI6IjAifV19.jpppl9C-jNY8oyCOnx9k9WeJy3fVsRsEZ_zGa4dSHAo/image;s=1280x1024;q=80"
    ],
    "agencyName": null,
    "tags": [
      "AIR_CONDITIONING",
      "TOP_FLOOR",
      "SECURE_BUILDING"
    ]
}
````

#### Data Fields

| Field | Type | Description |
| ----- | ---- | ----------- |
| `id` | Integer | The unique ID of the listing |
| `title` | String | The title of the listing |
| `url` | String | Direct link to the property page |
| `estateType` | String | Type of property (e.g., FLAT, HOUSE) |
| `transaction` | String | Type of transaction (e.g., RENT, SELL) |
| `price` | Number | Total price of the property |
| `currency` | String | Currency of the price (usually PLN) |
| `pricePerSquareMeter` | Number | Calculated price per square meter |
| `areaInSquareMeters` | Number | Total area of the property in square meters |
| `roomsNumber` | String | Number of rooms |
| `floorNumber` | String | Floor number the property is on |
| `dateCreated` | String | Date and time the listing was posted |
| `shortDescription` | String | A brief summary of the property |
| `location` | Object | Detailed location data (city, province, district) |
| `images` | Array | List of high-resolution image URLs |
| `agencyName` | String | Name of the agency handling the listing |
| `tags` | Array | Extra features like "balcony" or "parking" |

### Input Parameters

You can configure the actor's behavior using these input fields:

#### Input Example

```json
{
    "startUrls": [
        {
            "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska?limit=36"
        }
    ],
    "maxItems": 30,
    "requestTimeoutSecs": 30
}
```

#### Parameter Details

| Field | Description | Default |
| ----- | ----------- | ------- |
| `startUrls` | An array of Otodom search URLs to scrape. You can provide multiple URLs. | `[{ "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska?limit=36" }]` |
| `maxItems` | Maximum number of property listings to extract **per URL**. | `30` |
| `requestTimeoutSecs` | Per-request timeout in seconds. Adjust if network connectivity is slow. | `30` |

### Use cases

- **Market analysis**: track price trends per square meter across different districts in Warsaw, Krakow, or Gdansk
- **Investment sourcing**: build alerts for new listings that meet your exact ROI criteria before they hit the open market
- **Competitor tracking**: monitor other real estate agencies to see their inventory and pricing strategies
- **Database building**: aggregate property images and descriptions to train machine learning models for real estate valuation

### How to use this scraper

1. Go to [Otodom.pl](https://www.otodom.pl/) and perform a search (e.g., flats for rent in Gdynia).
2. Apply any filters you want (price range, number of rooms, area).
3. Copy the URL from your browser's address bar.
4. Paste the URL into the **Start URLs** field of this actor.
5. Set the **Max items per URL** limit if you only want a specific number of results per search link.
6. Click Start and wait for the dataset to populate.

### FAQ

**Can this actor handle multiple search URLs at once?**
Yes. You can paste as many Otodom search URLs as you need into the Start URLs list. The actor will process them sequentially.

**How many listings can it scrape?**
You can scrape up to 5,000 listings per URL. Set the "Max items" input to control the limit per URL. Note that Otodom caps search results at a certain number of pages, so very broad searches (like "all of Poland") might not return every single listing on the site in one go.

**Does it extract contact information like phone numbers?**
No. Otodom protects phone numbers behind a button click on the individual listing pages. This actor scrapes search result data quickly and efficiently, but it does not load individual pages to reveal protected contact details.

# Actor input Schema

## `startUrls` (type: `array`):

List of Otodom.pl search URLs to extract listings from. For example: https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska

## `maxItems` (type: `integer`):

Maximum number of property listings to extract per search URL.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska?limit=36"
    }
  ],
  "maxItems": 30,
  "requestTimeoutSecs": 30
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska?limit=36"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/otodom-property-extractor").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 = { "startUrls": [{ "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska?limit=36" }] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/otodom-property-extractor").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 '{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska?limit=36"
    }
  ]
}' |
apify call kawsar/otodom-property-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Otodom Property Extractor",
        "description": "Otodom property scraper that extracts detailed real estate listings, prices, and high-resolution images, giving you structured market data without the hassle of manual copying.",
        "version": "0.0",
        "x-build-id": "XkMFis6NQZmwlOaYz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~otodom-property-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-otodom-property-extractor",
                "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/kawsar~otodom-property-extractor/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-otodom-property-extractor",
                "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/kawsar~otodom-property-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-otodom-property-extractor",
                "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": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "List of Otodom.pl search URLs to extract listings from. For example: https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/cala-polska",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items per URL",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of property listings to extract per search URL.",
                        "default": 30
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-request timeout in seconds.",
                        "default": 30
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
