# Poland Apartment Deal Checker: RCN Deed Prices vs Otodom (`donzely/rcn-transaction-prices`) Actor

Check if Otodom apartments are good deals: compare asking prices with real notarial-deed sale prices nearby from Poland's official RCN register. Fair value, % vs market, verdict, comparables. Also exports raw RCN transaction prices.

- **URL**: https://apify.com/donzely/rcn-transaction-prices.md
- **Developed by:** [Grzegorz Pryjma](https://apify.com/donzely) (community)
- **Categories:** Real estate, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 valued 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/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

## Poland Apartment Deal Checker: RCN Deed Prices vs Otodom

**Is that Otodom apartment a good deal?** This Actor compares asking prices on **Otodom.pl** with what apartments nearby **actually sold for**, using Poland's official **Real Estate Price Register (RCN, Rejestr Cen Nieruchomości)** built from notarial deeds. For every listing you get a fair value, the percentage above or below real transaction prices, a verdict and the nearest comparable sales.

It also works as a plain **RCN transaction prices scraper**: real apartment sale prices with date, price, area, price per m², rooms, floor, market type, address and GPS for any city, district or point in Poland.

🇵🇱 *Sprawdź, czy ogłoszenie z Otodom to okazja: porównanie ceny ofertowej z prawdziwymi cenami transakcyjnymi z aktów notarialnych (RCN) w promieniu 1 km. Albo pobierz same ceny transakcyjne mieszkań dla dowolnej lokalizacji.*

### Two modes

#### 1. Deal check (default)

1. Scrapes apartments for sale on Otodom for your locations (or the listing URLs you give), newest first.
2. Reads the exact coordinates of each listing.
3. Finds notarial-deed sales within the radius (default 1 km), of similar size (±35%) and the same market (primary or secondary), from the last 24 months. If there are too few, it widens the radius and relaxes size and market matching, and says so in `comparablesBasis`.
4. Returns per listing:
   - median, 25th and 75th percentile of transaction prices per m²
   - estimated value and value range
   - `askingVsTransactionsPct`: how much the asking price per m² is above (+) or below (−) the deeds
   - `verdict`: `BELOW_MARKET` (≤ −10%), `FAIR`, `ABOVE_MARKET` (+5…15%), `OVERPRICED` (> +15%) or `INSUFFICIENT_DATA`
   - `confidence` (high, medium, low) from sample size and location accuracy
   - the 5 nearest comparable deeds with date, price, area, floor and distance

#### 2. Transactions

Real apartment sale prices from RCN for a city, district, Otodom search URL or a `lat,lon` point with a radius. Filters: period, market, area, rooms, price. The key-value store record `AREA_SUMMARY` holds the median, quartiles and the newest deed published for each area.

### Who is it for

- Buyers and investors checking whether a listing is priced fairly before negotiating
- Agents and brokers preparing price arguments with real deeds
- Analysts tracking real (not asking) apartment prices by district
- Developers and banks benchmarking projects

### Input examples

```json
{ "locations": ["Kraków"], "maxItems": 50 }
```

```json
{ "mode": "transactions", "locations": ["Warszawa Mokotów", "52.2297,21.0122"], "monthsBack": 12, "radiusM": 500 }
```

```json
{ "listingUrls": ["https://www.otodom.pl/pl/oferta/..."], "radiusM": 800 }
```

### Output example (deal check)

```json
{
  "title": "Mokotów Wyględów ul. Malawskiego, 1 pokój",
  "askingPricePln": 459000, "areaM2": 28.28, "askingPricePerM2": 16231,
  "transactionMedianPricePerM2": 19409, "askingVsTransactionsPct": -16.4,
  "verdict": "BELOW_MARKET", "confidence": "high",
  "estimatedValuePln": 549000, "comparablesCount": 48,
  "comparablesBasis": "1000 m radius, similar size (±35%), same market (secondary)",
  "comparables": [{ "date": "2025-11-26", "pricePln": 675000, "areaM2": 42.93, "pricePerM2": 15723, "floor": 12, "address": "Bukowińska 8, Warszawa", "distanceM": 210 }]
}
```

### Pricing

Pay per result, no start fee:

- **$0.008 per valued listing** (deal check)
- **$0.0015 per transaction** (transactions mode)

### Data source and legal basis

- RCN data comes from the official national WFS service of the Head Office of Geodesy and Cartography at `mapy.geoportal.gov.pl/wss/service/rcn`. The service declares no fees and no access constraints.
- Since **13 February 2026** access to RCN data is free of charge, after the amendment of the Geodetic and Cartographic Law (Dz.U. 2025 poz. 1542). Sources: [prawo.pl](https://www.prawo.pl/biznes/rejestr-cen-nieruchomosci-juz-bezplatny,1538708.html), [rp.pl](https://www.rp.pl/nieruchomosci/art43810951-ceny-transakcyjne-nieruchomosci-juz-jawne-rcn-otwarty-dla-wszystkich).
- RCN records contain no personal data of buyers or sellers. This Actor also leaves out the notary's name.
- Area boundaries come from OpenStreetMap Nominatim (© OpenStreetMap contributors), used within its 1 request/second policy.
- Listings come from public Otodom pages.

### Accuracy and limits

- Asking prices are usually a few percent above final transaction prices, so `FAIR` covers up to +5%.
- Counties publish the register with different delays. Warsaw, for example, may lag by a few months. In transactions mode the Actor warns when the newest published deed in an area is older than 60 days, and `AREA_SUMMARY` shows `newestDeedInArea`.
- Some counties may not publish on geoportal.gov.pl. Listings there get `INSUFFICIENT_DATA` with an explanation.
- Deeds are matched by distance, size and market, not by building standard, so treat the verdict as a strong hint, not an appraisal.
- Listings whose Otodom location is approximate get `confidence: low`.

### FAQ

**Can I value a specific apartment?** Paste its Otodom URL into `listingUrls`, or use transactions mode with its coordinates and a 300–500 m radius.

**Why are there fewer deeds for the last months?** Notarial deeds reach the register with a delay that differs by county.

# Actor input Schema

## `mode` (type: `string`):

Deal check scrapes apartments for sale on Otodom and compares each asking price with nearby notarial-deed prices. Transactions returns the deeds themselves.

## `locations` (type: `array`):

City or district names as on Otodom ("Kraków", "Warszawa Mokotów", "Gdańsk Wrzeszcz"), Otodom location paths or search URLs, or a point "lat,lon" (uses the radius below).

## `listingUrls` (type: `array`):

Specific Otodom offers to value, e.g. https://www.otodom.pl/pl/oferta/... Used in deal-check mode, in addition to locations.

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

Maximum listings valued (deal check) or transactions returned.

## `monthsBack` (type: `integer`):

How far back deeds are taken. Ignored when Date from is set.

## `dateFrom` (type: `string`):

Optional start of the deed date range.

## `dateTo` (type: `string`):

Optional end of the deed date range. Default: today.

## `market` (type: `string`):

Filter listings and transactions by market.

## `minAreaM2` (type: `integer`):

Minimum apartment area.

## `maxAreaM2` (type: `integer`):

Maximum apartment area.

## `minRooms` (type: `integer`):

Minimum number of rooms.

## `maxRooms` (type: `integer`):

Maximum number of rooms.

## `minPricePln` (type: `integer`):

Minimum price.

## `maxPricePln` (type: `integer`):

Maximum price.

## `radiusM` (type: `integer`):

Deal check: deeds within this distance of the listing are compared first. Widened automatically when there are too few.

## `minComparables` (type: `integer`):

Minimum number of deeds needed for a valuation.

## `includeComparables` (type: `boolean`):

Adds the 5 nearest comparable transactions to each valuation.

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

Optional Apify Proxy.

## Actor input object example

```json
{
  "mode": "dealCheck",
  "locations": [
    "Warszawa Mokotów"
  ],
  "maxItems": 20,
  "monthsBack": 24,
  "market": "ALL",
  "radiusM": 1000,
  "minComparables": 5,
  "includeComparables": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `transactions` (type: `string`):

No description

## `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 = {
    "locations": [
        "Warszawa Mokotów"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("donzely/rcn-transaction-prices").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 = {
    "locations": ["Warszawa Mokotów"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("donzely/rcn-transaction-prices").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 '{
  "locations": [
    "Warszawa Mokotów"
  ],
  "maxItems": 20
}' |
apify call donzely/rcn-transaction-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,donzely/rcn-transaction-prices"
        }
    }
}
```

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/btCtLgSrtbL331YkN/builds/PfIzB0U9P5itnLsi4/openapi.json
