# Rynek Pierwotny Scraper - Poland New-Build Developments (`studio-amba/rynekpierwotny-pl-scraper`) Actor

Scrape new construction developments from rynekpierwotny.pl, Poland's leading primary-market real estate portal. Extract developer, project name, price and price/m2 ranges, unit counts, completion dates, address, area and room ranges, and images. No login needed.

- **URL**: https://apify.com/studio-amba/rynekpierwotny-pl-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (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 result scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Rynek Pierwotny Scraper

Extract new-build development data from [rynekpierwotny.pl](https://rynekpierwotny.pl), Poland's leading primary-market real estate portal. Unlike resale portals, rynekpierwotny.pl lists new construction developments sold directly by developers — the primary market, not agent-brokered resale.

### Why use this actor?

Otodom, Morizon, and Nieruchomosci-online mix primary-market listings into a general resale feed. rynekpierwotny.pl is a specialist: every listing is a development ("inwestycja") from a named developer, with the whole project's price range, unit count, and completion date in one record — exactly the data an investor or market analyst needs, without wading through hundreds of individual unit ads for the same building.

Use cases include new-build market research, developer pipeline tracking, price-per-m² benchmarking by city and district, investment timing (completion-date monitoring), competitor analysis for developers and agencies, and feeding property-market dashboards.

### How to scrape Rynek Pierwotny data

1. Go to the actor's page on the Apify Store
2. Select a property type: apartments or houses
3. Enter a city (e.g. "Warszawa", "Krakow", "Wroclaw") or leave empty for all of Poland
4. Set `maxResults` for the number of development projects to collect
5. Click "Start" to run the scraper
6. Download results as JSON, CSV, or Excel when complete

The actor reads the `window.__INITIAL_STATE__` JSON state block that rynekpierwotny.pl server-renders into every listing page — no browser rendering needed, so it's fast and cheap to run.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `propertyType` | String | No | `apartment` (default) or `house` |
| `location` | String | No | Polish city, e.g. "Warszawa", "Krakow", "Wroclaw", "Gdansk". Defaults to "Warszawa". Empty = all Poland. |
| `maxResults` | Integer | No | Maximum development projects to return (default: 50) |
| `proxyConfiguration` | Object | No | Proxy settings. Automatic Apify proxy by default — recon found no active Cloudflare challenge. |

### Output

Each record is one development project (not one unit) — prices, areas, and room counts are given as ranges across every unit currently for sale in that project.

| Field | Type | Example |
|-------|------|---------|
| `projectId` | String | `"17196"` |
| `projectName` | String | `"Osiedle Juu"` |
| `url` | String | Full project detail page URL |
| `developer` | String | `"Marvipol Development"` |
| `developerSlug` | String | `"marvipol-development"` |
| `developerUrl` | String | Link to the developer's profile page |
| `propertyType` | String | `"apartment"` |
| `address` | String | `"Warszawa, Białołęka, Grodzisk, ul. Skarbka z Gór 47"` |
| `city` | String | `"Warszawa"` |
| `district` | String | `"Białołęka"` |
| `voivodeship` | String | `"mazowieckie"` |
| `latitude` / `longitude` | Number | Development location |
| `priceMin` / `priceMax` | Number | Lowest/highest unit price in the project, PLN |
| `pricePerM2Min` / `pricePerM2Max` | Number | Lowest/highest price per m², PLN |
| `currency` | String | `"PLN"` |
| `areaMin` / `areaMax` | Number | Smallest/largest unit area, m² |
| `roomsMin` / `roomsMax` | Number | Room-count range across units |
| `unitsTotal` | Number | Total units planned in the project |
| `unitsForSale` | Number | Units currently available for sale |
| `completionDateFrom` / `completionDateTo` | String | Handover window (ISO 8601 date) |
| `imageUrl` | String | Primary project photo URL |
| `description` | String | Project description (truncated to 5000 chars) |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "projectId": "17196",
    "projectName": "Osiedle Juu",
    "url": "https://rynekpierwotny.pl/oferty/marvipol-development/osiedle-juu-warszawa-grodzisk-17196/",
    "scrapedAt": "2026-08-28T19:42:27.715Z",
    "developer": "Marvipol Development",
    "developerSlug": "marvipol-development",
    "developerUrl": "https://rynekpierwotny.pl/deweloperzy/marvipol-development-844/",
    "propertyType": "apartment",
    "address": "Warszawa, Białołęka, Grodzisk, ul. Skarbka z Gór 47",
    "city": "Warszawa",
    "district": "Białołęka",
    "voivodeship": "mazowieckie",
    "latitude": 52.319856762022155,
    "longitude": 21.05699660865891,
    "priceMin": 487500,
    "priceMax": 1092414,
    "pricePerM2Min": 13300,
    "pricePerM2Max": 17700,
    "currency": "PLN",
    "areaMin": 30,
    "areaMax": 75,
    "roomsMin": 1,
    "roomsMax": 4,
    "unitsTotal": 129,
    "unitsForSale": 53,
    "completionDateFrom": "2024-05-31",
    "completionDateTo": "2026-07-26",
    "imageUrl": "https://thumbs.propertygroup.pl/rp/offers/offer/None/main_image/osiedle-juu_b0305a.jpg",
    "searchQuery": "Warszawa"
}
```

### Cost estimate

This actor uses a lightweight HTTP crawler (no browser rendering) with the automatic Apify proxy pool. Approximate costs:

- **~50 results**: $0.02-0.05 in platform credits
- **~500 results**: $0.10-0.30 in platform credits
- **~2,000 results**: $0.30-0.80 in platform credits

24 projects load per page request, so a typical city-wide run needs very few requests. Usage cost only settles once the run reports SUCCEEDED — a mid-run dataset read will undercount the final charge.

### Tips for best results

- **Start small** — test with `maxResults: 20` before running large scrapes.
- **Use specific cities** — searching for "Warszawa" returns more focused results than searching all of Poland; Warsaw alone carries 250+ active apartment developments.
- **Property types** — use `apartment` for flats, `house` for standalone/terraced houses.
- **City names** — use the plain Polish city name without diacritics required (e.g. "Warszawa", "Krakow", "Wroclaw", "Gdansk", "Poznan", "Lodz") — the actor normalizes it into the site's URL slug.
- **Unrecognized cities** — if a city name isn't on rynekpierwotny.pl, the site redirects to a nationwide results page; the actor logs a warning when this happens so you know the results aren't city-scoped.

### Limitations

- One record per development project, not per individual unit — price, area, and room fields are the RANGE across all units currently for sale, not a single unit's data. This matches how the site itself presents the primary market.
- The actor scrapes the public website. No login or authentication is used. No cookies required.
- Price data reflects the developer's current asking price, not the final transaction price.
- `completionDateFrom`/`completionDateTo` reflect the site's published construction window and can be `null` for projects already completed and ready for handover.
- 24 projects load per search-results page; very large nationwide scrapes may take a little longer due to pagination.

### Supported property types

| Polish | English | Input value |
|--------|---------|-------------|
| Mieszkania | Apartments | `apartment` |
| Domy | Houses | `house` |

### Related scrapers

- [Otodom Scraper](https://apify.com/itsnotyouitsme/otodom-scraper) — Poland's largest real estate portal (resale + primary mixed)
- [Morizon Scraper](https://apify.com/itsnotyouitsme/morizon-scraper) — Poland's major complement to Otodom
- [Nieruchomosci-online Scraper](https://apify.com/itsnotyouitsme/nieruchomosci-online-scraper) — Poland's #3 property portal
- [Immoweb Scraper](https://apify.com/itsnotyouitsme/immoweb-scraper) — Belgium's #1 real estate portal
- [Immobiliare Scraper](https://apify.com/itsnotyouitsme/immobiliare-scraper) — Italian real estate listings

# Actor input Schema

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

Type of new-build development to search for.

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

Polish city to search, e.g. 'Warszawa', 'Krakow', 'Wroclaw', 'Gdansk'. Defaults to Warszawa. Leave empty to search all of Poland.

## `maxResults` (type: `integer`):

Maximum number of development projects to scrape.

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

rynekpierwotny.pl is Cloudflare-fronted but recon found no active challenge — automatic Apify proxy is the default. Switch to Residential (Poland) only if you see blocked/empty runs.

## Actor input object example

```json
{
  "propertyType": "apartment",
  "location": "Warszawa",
  "maxResults": 20,
  "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 = {
    "propertyType": "apartment",
    "location": "Warszawa",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/rynekpierwotny-pl-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 = {
    "propertyType": "apartment",
    "location": "Warszawa",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/rynekpierwotny-pl-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 '{
  "propertyType": "apartment",
  "location": "Warszawa",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/rynekpierwotny-pl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/rynekpierwotny-pl-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/wGk2891gGbNE6tUMo/builds/JwIamteGF64vssuhK/openapi.json
