# Otodom Poland Property Scraper (`fetchfinch/otodom-property-scraper`) Actor

\[ 💰 $1.20 / 1K] Otodom.pl scraper for sales, rentals, land, warehouses, and development projects across Poland. Search by URL and optionally collect full listing details.

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

## Pricing

from $1.20 / 1,000 otodom listing delivereds

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

### Search Poland’s property market with one powerful Actor

![No Otodom API key](https://img.shields.io/badge/Otodom%20API%20key-not%20needed-43A047)
![No login required](https://img.shields.io/badge/Otodom%20login-not%20required-3178C6)
![Coverage](https://img.shields.io/badge/Coverage-All%20Poland-00897B)
![Property types](https://img.shields.io/badge/Property%20types-8-7E57C2)
![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F39C12)

Collect current Otodom.pl property listings for sale or rent without an Otodom API key or login. Search by location and property type, paste a filtered Otodom search URL, or provide a direct listing URL. Each result goes into an Apify dataset ready to export or use in an automation.

### What you can collect

| Property category | Otodom path | Typical uses |
| --- | --- | --- |
| Apartments | `mieszkanie` | Sale and rental listings, price comparisons |
| Houses | `dom` | Houses for sale or rent |
| Development projects | `inwestycja` | Available units, size ranges, project details |
| Rooms | `pokoj` | Room rentals |
| Land plots | `dzialka` | Plot prices, areas, and locations |
| Commercial premises | `lokal` | Shops, offices, and other commercial space |
| Garages | `garaz` | Garages and parking offers |
| Warehouses and industrial halls | `haleimagazyny` | Industrial sale and rental offers |

Search all of Poland with `cala-polska`, or use any location path copied from an Otodom URL. The Actor follows result pages, removes duplicate listing IDs, and stops at your item or page limit.

### Choose your search

| Method | Best for | Example |
| --- | --- | --- |
| Deal, property type, and location | A quick search you can configure in the form | Apartments for sale in Warsaw |
| Otodom search URL | Keeping the site's price, area, room, market, seller, and sorting filters | Kraków rentals under 5,000 PLN |
| Direct listing URL | Getting one specific property's full details | An apartment or development project |

For a location-based search, enter:

```json
{
  "dealType": "sprzedaz",
  "propertyType": "mieszkanie",
  "location": "mazowieckie/warszawa/warszawa/warszawa",
  "maxItems": 100,
  "includeDetails": true
}
```

To preserve filters set on Otodom, paste the search URL:

```json
{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/wynajem/mieszkanie/malopolskie/krakow/krakow/krakow?priceMax=5000"
    }
  ],
  "maxItems": 100
}
```

You can put several search or direct listing URLs in `startUrls`. When you supply them, they take precedence over `dealType`, `propertyType`, and `location`.

### Input options

| Field | Default | What it controls |
| --- | --- | --- |
| `startUrls` | Empty | Otodom search or direct property and development URLs |
| `dealType` | `sprzedaz` | Sale (`sprzedaz`) or rent (`wynajem`) when no start URL is given |
| `propertyType` | `mieszkanie` | One of the eight property categories above |
| `location` | `cala-polska` | Otodom location path |
| `maxItems` | 100 | Maximum unique records across all inputs |
| `maxPages` | 10 | Maximum result pages per search |
| `includeDetails` | `false` | Fetch full descriptions, coordinates, all photos, floor plans, and property attributes |
| `includePhoneNumbers` | `false` | Include phone numbers already present in public detail-page data |
| `proxyConfiguration` | No proxy | Add a proxy if your runs encounter access blocks or rate limits |

Full details use an additional request for each listing. Phone numbers are included only when `includePhoneNumbers` is enabled; the Actor does not use a contact reveal endpoint.

### Five proven use cases

These configurations have each produced a successful Apify dataset. Paste the key values into the input form and choose a result limit that suits your project.

| Use case | Configuration | What the verified run returned |
| --- | --- | --- |
| Warsaw apartments for sale | `sprzedaz` + `mieszkanie` + `mazowieckie/warszawa/warszawa/warszawa`; full details on | 5 apartments with descriptions, coordinates, and photos |
| Kraków rentals under 5,000 PLN | Kraków rental search URL with `?priceMax=5000` | 5 rentals, all within the price cap |
| Land plots across Poland | `sprzedaz` + `dzialka` + `cala-polska` | 5 plots with prices and areas |
| Warehouse rentals | `wynajem` + `haleimagazyny` + `cala-polska` | 5 industrial listings with monthly prices and areas |
| Poznań development project | Direct `/pl/inwestycja/` URL; full details on | Available units, area and room ranges, completion date, and coordinates |

Otodom listings change over time, so a new run may return different records or prices.

### Output

Each dataset item represents one listing or one development project.

| Field | Meaning |
| --- | --- |
| `id`, `url`, `title` | Otodom listing identity and direct link |
| `record_type`, `deal_type`, `property_type` | Listing or project; sale or rent; Otodom property classification |
| `price`, `currency`, `price_per_sqm` | Advertised sale or monthly rental price and price per square metre |
| `maintenance_fee` | Additional fee published separately from the advertised price |
| `area_sqm`, `rooms`, `floor` | Property size and layout, when published |
| `location`, `city`, `district`, `province` | Most specific available location |
| `posted_date`, `seller_name`, `agency` | Listing date and seller information |
| `images` | Photo URLs; the Actor does not download image files |
| `description_text`, `latitude`, `longitude`, `attributes` | Extra fields when full details are enabled |
| `investment_units`, `investment_area_from_sqm`, `investment_area_to_sqm` | Development-project availability and size range |

For example, a detailed apartment record includes:

```json
{
  "id": "68464741",
  "url": "https://www.otodom.pl/pl/oferta/3-pokoje-w-markach-super-rozklad-idealne-dla-rodziny-sloneczne-ID4DgO1",
  "record_type": "listing",
  "deal_type": "sale",
  "property_type": "FLAT",
  "price": 799977,
  "currency": "PLN",
  "area_sqm": 55,
  "rooms": 3,
  "city": "Marki",
  "latitude": 52.330074,
  "longitude": 21.105923
}
```

Some fields are `null` when Otodom does not publish them. Search results do not usually include exact coordinates; enable `includeDetails` for coordinates and full attributes. A development project's `price` can be `null` when it advertises multiple units at different prices.

### Export and access

Download results from the Apify dataset as JSON, CSV, or Excel, or connect the Actor to an Apify schedule, API call, or webhook. If your environment receives an access block or rate limit from Otodom, configure an Apify or custom proxy in the input.

# Actor input Schema

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

Optional. Search URLs keep their Otodom filters and sorting. Direct /pl/oferta/ and /pl/inwestycja/ URLs are also accepted.

## `dealType` (type: `string`):

Used when no start URLs are supplied.

## `propertyType` (type: `string`):

Used when no start URLs are supplied. For other Otodom categories, paste a search URL.

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

Otodom path such as mazowieckie/warszawa/warszawa/warszawa, or cala-polska for all Poland.

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

Stop after this many unique listing records across all inputs.

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

Maximum result pages to read from each search URL.

## `includeDetails` (type: `boolean`):

Adds full description, coordinates, attributes, all photos, seller and agency details. Requires one more HTTP request per listing.

## `includePhoneNumbers` (type: `boolean`):

Only when full details are enabled, and only when a number is already present in public page data. No contact reveal endpoint is called.

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

Direct HTTP access is the default. Enable a proxy if your run receives access blocks or rate limits.

## Actor input object example

```json
{
  "startUrls": [],
  "dealType": "sprzedaz",
  "propertyType": "mieszkanie",
  "location": "cala-polska",
  "maxItems": 100,
  "maxPages": 10,
  "includeDetails": false,
  "includePhoneNumbers": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized Otodom listings and development projects.

# 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": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetchfinch/otodom-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 = { "startUrls": [] }

# Run the Actor and wait for it to finish
run = client.actor("fetchfinch/otodom-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 '{
  "startUrls": []
}' |
apify call fetchfinch/otodom-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetchfinch/otodom-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/FsLDEVqYpwmh6CJlk/builds/SQr4kCQkSST8XB5Ab/openapi.json
