# 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:** 4 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 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.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# 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(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/otodom-pl-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/rAWMnNEW40wPI9Asz/builds/TKAfgeMbX3zgNRZnK/openapi.json
