# Poland Real Estate Transaction Prices (RCN) (`delfielectronics/poland-transaction-prices`) Actor

Real notarial sale prices of Polish flats, houses and land from the public RCN register: price, PLN/m², area, rooms, floor, date, address, GPS. No personal data.

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

## Pricing

Pay per event

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 Real Estate Transaction Prices (RCN)

Get **real sale prices of Polish real estate**, not asking prices: every notarial transaction published in the
public **Rejestr Cen Nieruchomości (RCN)** of the Polish land surveying service (GUGiK). Flats and premises,
buildings and land, per powiat (county), with the **gross price, price per m², usable area, rooms, floor, deed
date, market (primary / secondary), address and GPS point**.

Every transaction becomes one record: price, VAT, deed date, kind of property and right, seller and buyer
**category** (natural person, company, municipality, State Treasury ...), and the list of objects it covers
(units, buildings, parcels) with their details.

### What you can use it for

- **Valuation and appraisal**: comparable sales (comps) for a flat, house or plot, by street and date.
- **Investors and analysts**: real PLN/m² per city or district over time, primary vs secondary market.
- **Developers and agents**: what sold, where, for how much, next to your project.
- **Banks, proptech and AI agents**: structured, geocoded transactions via the Apify API or MCP.
- Combine with **Poland Developer Prices** (asking prices of new flats) to compare asking and transaction prices.

### How it works

1. For each powiat you choose, the actor reads the official public RCN web feature service (WFS) of GUGiK,
   layer by layer (units, buildings, parcels), politely: one request at a time, with pauses.
2. Rows of one notarial transaction are merged into one record; the price is the price of the whole transaction.
3. Positions are converted from the Polish grid (EPSG:2180) to GPS (WGS84).
4. Your filters are applied: deed date window, market, price range.
5. A run summary per powiat (layers read, rows, transactions, saved items, deed dates seen) is stored as
   `SUMMARY` in the run's key-value store.

### Input

| Field | What it does |
|---|---|
| Powiats | TERYT codes (`1465` Warszawa, `1261` Kraków, `1020` zgierski) or names (`zgierski`, `Gdańsk`); Polish letters optional |
| Property kinds | `units` (flats, premises) by default; `buildings`; `parcels` (land). All three give the full picture of transactions covering several objects |
| Deed date from / to | 12 months before the "to" date (today) by default; an empty "from" means full history |
| Markets | `primary` (from developers), `secondary` (resale); empty = all |
| Min / max price | Gross price of the transaction in PLN |
| Max transactions | Stop after this many |

### Output example

```json
{
  "powiat": {"teryt": "1020", "name": "zgierski"},
  "transactionId": "PL.PZGiK.2934.RCiWN/71b233a1-75a7-488c-b9c4-934339ae682e",
  "transactionType": "wolnyRynek",
  "market": "secondary",
  "sellerType": "osobaFizyczna",
  "buyerType": "osobaFizyczna",
  "priceGross": 275500,
  "vat": null,
  "currency": "PLN",
  "pricePerM2": 4443.55,
  "deedDate": "2026-04-28",
  "recordVersion": "2026-05-20T15:00:12Z",
  "propertyKind": "nieruchomoscLokalowa",
  "right": "wlasnoscLokaluWrazZPrawemZwiazanym",
  "share": null,
  "landArea": 144,
  "point": {"lat": 51.8566387, "lon": 19.4239037},
  "objects": [
    {
      "kind": "unit",
      "id": "102004_5.0014.224/10.1_BUD",
      "function": "mieszkalna",
      "rooms": 3,
      "floor": 1,
      "usableArea": 62,
      "ancillaryArea": null,
      "price": null,
      "address": {"town": "Zgierz", "street": "Długa", "number": "18A"},
      "point": {"lat": 51.8566387, "lon": 19.4239037}
    }
  ],
  "source": "Główny Urząd Geodezji i Kartografii, Rejestr Cen Nieruchomości"
}
```

Values such as `wolnyRynek`, `osobaFizyczna` or `nieruchomoscLokalowa` are the official RCN code lists, kept as
published. `pricePerM2` is given only when the transaction covers exactly one unit with a usable area.

### Pricing

Pay per event, no subscription. The prices are on the **Pricing** tab; you are charged for two events:

| Event | When |
|---|---|
| Area (`area`) | once per powiat whose requested layers were all read; a powiat whose service is down is not charged |
| Transaction (`transaction`) | once per transaction saved to the dataset |

- A powiat that publishes no data in RCN is still charged as an area (the read was done); the summary says
  "no records".
- An area is charged only when your remaining budget also covers at least one transaction.
- The form starts with **Max transactions** = 100 for a cheap first run; the API default is 100000.
- Set a maximum cost per run in Apify and the actor stops cleanly when it is reached.

### Data and privacy

RCN data is public and free of charge by law (Prawo geodezyjne i kartograficzne as amended by Dz.U. 2025
poz. 1542); source: **Główny Urząd Geodezji i Kartografii, Rejestr Cen Nieruchomości**. Deeds often concern
natural persons, so the actor returns only the **category** of seller and buyer and never names, the notary, deed
numbers, flat numbers or free-text notes. The address goes down to the building number, as on the public
geoportal map. Use the records in line with the GDPR.

### Known limits

- Coverage varies by powiat: GUGiK publishes about 320 of 380 powiats, and some only for recent years.
- GUGiK describes the service as temporary, until the regulation on the register is amended.
- The service filters deeds up to your "to" date; the actor reads a layer newest deed first and stops once it
  passes your "from" date, so a range in the past (e.g. 2014 in Warszawa) reads only that range. A full history
  (empty "from") reads the whole layer: for Warszawa flats that is too large (over 500,000 records) and the powiat
  is reported as unavailable, not charged; choose a date range there.
- The run summary counts the rows actually read (a layer stops once it passes your "from" date).
- Deeds without a date are not returned by the service once a "to" date is filtered, so the summary's
  "rows without a deed date" is normally 0; it does not mean the register has no undated deeds.
- A transaction that covers objects of a layer you did not request lists only the requested objects.
- Positions are the centre of the object (unit point, middle of a building or parcel).

# Actor input Schema

## `powiats` (type: `array`):

4-digit TERYT codes (e.g. 1465 = Warszawa, 1261 = Kraków, 1020 = zgierski) or powiat names (zgierski, Gdańsk; Polish letters optional). Each powiat is one charged area.

## `propertyKinds` (type: `array`):

units = flats and premises; buildings = houses and other buildings; parcels = land. Choose all three for the full picture of transactions that cover several objects.

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

YYYY-MM-DD. Leave out for the 12 months before dateTo (today by default); an empty text means no lower bound (full history).

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

YYYY-MM-DD. Leave out for today.

## `markets` (type: `array`):

primary = from developers; secondary = resale. Empty = all, including transactions without a market.

## `minPrice` (type: `integer`):

Keep transactions with a gross price of at least this amount.

## `maxPrice` (type: `integer`):

Keep transactions with a gross price of at most this amount.

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

Stop after saving this many transactions. The form starts at 100 for a cheap first run; the API default is 100000.

## Actor input object example

```json
{
  "powiats": [
    "1020"
  ],
  "propertyKinds": [
    "units"
  ],
  "markets": [],
  "maxItems": 100
}
```

# Actor output Schema

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

The run's transactions in the Store table view.

## `results` (type: `string`):

Every field of every transaction, with its objects.

## `summary` (type: `string`):

Layers read or failed, rows, transactions, items saved and deed dates seen, per powiat.

# 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 = {
    "powiats": [
        "1020"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("delfielectronics/poland-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 = {
    "powiats": ["1020"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("delfielectronics/poland-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 '{
  "powiats": [
    "1020"
  ],
  "maxItems": 100
}' |
apify call delfielectronics/poland-transaction-prices --silent --output-dataset

```

## MCP server setup

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