# Otodom Listings Scraper (`piotrv1001/otodom-listings-scraper`) Actor

The Otodom Listings Scraper extracts real estate listings from Otodom.pl, capturing prices, price per m², areas, rooms, locations, agencies, photos, and full property details with GPS coordinates and contact phone numbers — ideal for market analysis, price monitoring and real estate lead generation.

- **URL**: https://apify.com/piotrv1001/otodom-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 search listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Listings Scraper

Easily extract real estate listings from [Otodom.pl](https://www.otodom.pl) — Poland's largest property portal. The **Otodom Listings Scraper** lets you gather structured data about apartments, houses, rooms, plots, and commercial properties for sale or rent, ready for market analysis, price monitoring, lead generation, or building your own real estate datasets.

### ✨ Features

- 🏷️ **Rich listing data**: Title, price, price per m², area, number of rooms, floor, street, district, city, province, agency info, photos, and listing dates.
- 🔍 **Search-based extraction**: Paste any Otodom search URL with your filters applied — location, price range, area, rooms, market type, and more.
- 📋 **Optional full details**: Turn on `scrapeDetails` to visit each listing and get the complete description, GPS coordinates, all property characteristics (heating, building type, year built, …), contact phone numbers, and full agency profiles.
- ⚡ **Fast & efficient**: Collects dozens of listings per request, so even large searches finish in minutes.
- 💰 **Pay only for results**: Transparent per-item pricing — cheap shallow listings, full details only when you ask for them.

### 🛠️ How It Works

1. **Enter search URLs** – Go to [otodom.pl](https://www.otodom.pl), set up your search (e.g., flats for sale in Warsaw under 800,000 zł), and copy the URL from your browser.
2. **Set your limits** – Choose how many listings you want (`maxItems`) and whether to fetch full details (`scrapeDetails`).
3. **Run the scraper** – Start the Actor and download structured data in JSON, CSV, Excel, or HTML.

You can also paste individual listing URLs (`https://www.otodom.pl/pl/oferta/...`) to scrape specific properties directly.

### ⚙️ Input

```json
{
    "startUrls": [
        { "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa" }
    ],
    "maxItems": 50,
    "scrapeDetails": false
}
````

| Field | Type | Description |
| --- | --- | --- |
| `startUrls` | array | Otodom search URLs (any filters) or individual listing URLs |
| `maxItems` | integer | Maximum number of listings to scrape (default: 50) |
| `scrapeDetails` | boolean | Visit each listing page for full details — description, GPS, phone numbers (default: false) |
| `proxyConfiguration` | object | Proxy settings; the default works well for most runs |

### 📊 Sample Output Data

A search result item (default mode):

```json
{
    "id": 68034504,
    "url": "https://www.otodom.pl/pl/oferta/2-poziomowe-75-m-poddasze-91-m-balkon-8-m2-ID4BsSI",
    "title": "2-poziomowe | 75 m + poddasze 91 m | balkon 8 m2",
    "estate": "FLAT",
    "transaction": "SELL",
    "price": { "value": 942125, "currency": "PLN" },
    "pricePerSquareMeter": { "value": 5658, "currency": "PLN" },
    "areaInSquareMeters": 166.5,
    "roomsNumber": 3,
    "floorNumber": 1,
    "city": "Warszawa",
    "district": "Białołęka",
    "province": "mazowieckie",
    "isPrivateOwner": false,
    "agency": { "id": 10358460, "name": "MADISON Nieruchomości" },
    "shortDescription": "Białołęka ul. Konik Polny. Inwestycja zlokalizowana w dynamicznie rozwijającej się dzielnicy Warszawy…",
    "dateCreated": "2026-05-22 12:30:41",
    "image": "https://ireland.apollo.olxcdn.com/v1/files/…/image;s=1280x1024;q=80",
    "images": ["…"]
}
```

With `scrapeDetails` enabled, each record additionally includes the full text description, GPS `latitude`/`longitude`, a `characteristics` map (heating, building type, construction year, rent, …), contact `phones`, agent name, and the complete agency profile.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### 💰 Pricing

You pay per result, so costs stay predictable:

| Event | Price | What you get |
| --- | --- | --- |
| Search listing | $1.00 / 1,000 items | All fields shown in the sample above |
| Full listing detail | $4.00 / 1,000 items | Everything, incl. description, GPS, phone numbers |

Example: scraping 1,000 Warsaw apartments from search results costs about **$1**. Adding full details for all of them costs about **$4**.

### 💡 Tips

- Apply filters directly on otodom.pl before copying the URL — price ranges, area, rooms, market type, and radius all carry over automatically.
- Keep `scrapeDetails` off when you only need prices and locations — it's 4× cheaper and much faster.
- Use multiple start URLs in one run to cover several cities or property types at once; duplicates are removed automatically.
- Schedule the Actor on Apify to monitor new listings and price changes over time, and connect integrations (Google Sheets, webhooks, Make, Zapier) to act on fresh data.

### ❓ FAQ, Disclaimers & Support

**Is it legal to scrape Otodom?** This Actor extracts only publicly available data. Scraping public data is generally considered legal; however, you are responsible for how you use the data and for compliance with local laws and Otodom's terms. Listing contact details may constitute personal data under GDPR — only collect them when you have a legitimate purpose.

**A listing I scraped has disappeared.** Listings expire or get withdrawn; expired listings are skipped automatically.

**Need a custom solution or hit an issue?** Open an issue in the Issues tab of this Actor — feedback and feature requests are welcome.

# Actor input Schema

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

One or more otodom.pl search URLs (with any filters applied — location, price, area, rooms, etc.). You can also paste individual listing URLs.

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

Maximum number of listings to scrape across all start URLs.

## `scrapeDetails` (type: `boolean`):

Visit each listing page to extract complete details: full description, GPS coordinates, all property characteristics, contact phone numbers, and agency info. Slower and more expensive than search results only.

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

Proxy settings used for scraping. The default automatic proxy works well for most runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
    }
  ],
  "maxItems": 50,
  "scrapeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/otodom-listings-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 = {
    "startUrls": [{ "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/otodom-listings-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 '{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/otodom-listings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Otodom Listings Scraper",
        "description": "The Otodom Listings Scraper extracts real estate listings from Otodom.pl, capturing prices, price per m², areas, rooms, locations, agencies, photos, and full property details with GPS coordinates and contact phone numbers — ideal for market analysis, price monitoring and real estate lead generation.",
        "version": "0.0",
        "x-build-id": "xd2OuidWn1ilAhTJr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/piotrv1001~otodom-listings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-piotrv1001-otodom-listings-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/piotrv1001~otodom-listings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-piotrv1001-otodom-listings-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/piotrv1001~otodom-listings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-piotrv1001-otodom-listings-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": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "One or more otodom.pl search URLs (with any filters applied — location, price, area, rooms, etc.). You can also paste individual listing URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of listings to scrape across all start URLs.",
                        "default": 50
                    },
                    "scrapeDetails": {
                        "title": "Scrape full listing details",
                        "type": "boolean",
                        "description": "Visit each listing page to extract complete details: full description, GPS coordinates, all property characteristics, contact phone numbers, and agency info. Slower and more expensive than search results only.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings used for scraping. The default automatic proxy works well for most runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
