# Sprzedajemy.pl Scraper | Polish Real Estate (`trev0n/sprzedajemy-scraper`) Actor

Extract Polish real-estate listings from Sprzedajemy.pl: flats, houses, plots, commercial units, warehouses and garages, for sale or rent. Prices, area, rooms, GPS coordinates, photos, seller name and phone. Includes incremental monitoring for cheap daily runs.

- **URL**: https://apify.com/trev0n/sprzedajemy-scraper.md
- **Developed by:** [Paweł](https://apify.com/trev0n) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 98.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/platform/actors/running/actors-in-store#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

## 🏠 Sprzedajemy.pl Real Estate Scraper

🎯 **Pull every property ad from Sprzedajemy.pl — one of Poland's biggest classifieds sites — into a clean, ready-to-use spreadsheet.**

Flats, houses, plots, commercial units, warehouses and garages, for sale and for rent. You get prices, area, rooms, floor, year built, GPS coordinates, full descriptions, every photo, and the seller's name and phone number. Around 37,000 property ads are available, and roughly 1,500 fresh ones appear every week.

### 🚀 What Does It Do?

This scraper automatically walks through Sprzedajemy.pl's property sections and collects **structured, ready-to-use data** from every ad it finds. No manual browsing, no copy-pasting — just set your filters and hit Start.

💡 **Two modes of operation:**

1. **🔍 Discovery Mode** — pick a category, sale or rent, a city or region, and optional price/area/room filters. The scraper builds the search for you and pages through every result.
2. **📋 Direct URL Mode** — already have a search open in your browser, or a shortlist of specific ads? Paste the links and the scraper works straight off those.

⚡ It is genuinely fast: a whole category of 432 ads comes back in under 3 seconds, and 100 ads with full details take about 20 seconds.

### 👥 Who Is This For?

| 🏢 Use Case                           | 💬 How It Helps                                                                                         |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| 🏘️ **Estate agents**                  | Spot every new private-seller listing in your area the day it appears, so you can reach the owner first |
| 📊 **Property investors**             | Compare price per square metre across districts and find the ads priced below the local average         |
| 🔎 **Property portals & aggregators** | Feed a complete, deduplicated Polish inventory into your own site or app                                |
| 📈 **Market analysts**                | Build genuine price-history data by tracking the same ads week after week                               |
| 🛠️ **Developers & flippers**          | Filter straight to "do remontu" properties and plots with building permission                           |
| 📣 **Lead-generation teams**          | Build contact lists of sellers with phone numbers, filtered to private owners or to agencies            |

### ✨ Features

- 🏘️ **All six property categories** — flats, houses, plots and land, commercial units, warehouses and halls, garages and parking
- 🔁 **Sale and rent** — scrape either one, or both at once
- 📍 **Location targeting at three levels** — whole voivodeship, a single city, or one district within a city
- 🎛️ **Smart Filters** — price range, area, number of rooms, keyword, and private-seller-vs-agency, with price and seller applied by the portal itself so nothing is wasted
- 📞 **Seller contact details** — seller name, phone number, profile link and how long they have been a member
- 🗺️ **GPS coordinates** — exact latitude and longitude for mapping and distance analysis
- 📸 **Every photo** — the complete gallery, not just the thumbnail
- 🔔 **Incremental Monitoring** — after the first run, only get what actually changed: new ads, price changes, and ads that came back. Typically 80–95% fewer results on a daily schedule
- 💰 **Price-drop detection** — an ad whose price changes comes back tagged as updated, so you can see exactly what moved
- ♻️ **Repost detection** — spots the same property re-listed under a new ad number
- ⚡ **Fast & Scalable** — thousands of ads per run; a full category in seconds
- 🧹 **Deduplication** — every ad appears once, even across dozens of result pages
- 📤 **Export Anywhere** — Download results as JSON, CSV, Excel, or push to Google Sheets, Zapier, Make, or your CRM

### 🎛️ Filters & Options

| Option                        | What It Does                                                                                                                      |
| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| 🏘️ **Property Type**          | Flats, houses, plots and land, commercial units, warehouses, garages — or all six at once                                         |
| 🔁 **Transaction Type**       | For sale, for rent, or both                                                                                                       |
| 📍 **Location**               | A city, a voivodeship, or a specific district — for example Warszawa, mazowieckie, or Wałbrzych/Glinik                            |
| 🔤 **Keyword**                | Match a phrase such as "kawalerka" or "bliźniak", in titles only or in full descriptions too                                      |
| 💰 **Price Range**            | Minimum and maximum price in PLN                                                                                                  |
| 📐 **Area Range**             | Minimum and maximum size in square metres                                                                                         |
| 🚪 **Rooms**                  | Minimum and maximum number of rooms                                                                                               |
| 👤 **Seller Type**            | Everyone, private sellers only, or businesses and agencies only                                                                   |
| 🔀 **Sort Order**             | Newest first, oldest first, cheapest, most expensive, or by size                                                                  |
| 📋 **Full Ad Details**        | Off for a fast, cheap sweep of the results pages; on to open every ad for descriptions, all photos, coordinates and phone numbers |
| 🔔 **Incremental Monitoring** | Only return ads that are new, changed or have come back since the last run                                                        |
| 🔢 **Max Results**            | Control how many ads to extract per run — or set 0 for the whole category                                                         |
| 🔗 **Direct URLs**            | Optionally provide specific search or ad URLs to scrape                                                                           |

### 📦 What You Get (Output Fields)

Every property ad includes:

#### Listing Basics

| Field         | Example                                                                                      |
| ------------- | -------------------------------------------------------------------------------------------- |
| id            | `73747664`                                                                                   |
| title         | `SPRZEDAM MIESZKANIE DO REMONTU`                                                             |
| price         | `143000`                                                                                     |
| priceCurrency | `PLN`                                                                                        |
| pricePerM2    | `2251`                                                                                       |
| isNegotiable  | `true`                                                                                       |
| isPromoted    | `false`                                                                                      |
| datePosted    | `2026-08-10T22:10:08+02:00`                                                                  |
| propertyUrl   | `https://sprzedajemy.pl/sprzedam-mieszkanie-do-remontu-walbrzych-4-1b8e55-6fpbc4-nr73747664` |

#### Property Specifics

| Field            | Example                                              |
| ---------------- | ---------------------------------------------------- |
| area             | `63.54`                                              |
| plotArea         | `600`                                                |
| numberOfRooms    | `2`                                                  |
| floor            | `1`                                                  |
| totalFloors      | `2`                                                  |
| buildYear        | `1930`                                               |
| marketType       | `wtorny`                                             |
| buildingType     | `kamienica`                                          |
| buildingMaterial | `cegła`                                              |
| heating          | `węglowe`                                            |
| ownershipForm    | `własność`                                           |
| condition        | `do remontu`                                         |
| amenities        | `["Parking: utwardzony", "Droga dojazdowa: asfalt"]` |

#### Location

| Field     | Example         |
| --------- | --------------- |
| city      | `Wałbrzych`     |
| district  | `Glinik`        |
| province  | `dolnośląskie`  |
| street    | `Wałbrzyska 41` |
| latitude  | `50.7247553`    |
| longitude | `16.272577`     |

#### Seller & Contact

| Field            | Example                                             |
| ---------------- | --------------------------------------------------- |
| sellerType       | `private`                                           |
| agency           | `Biuro Nieruchomości Kowalski`                      |
| phone            | `510112418`                                         |
| sellerProfileUrl | `https://sprzedajemy.pl/oferty-uzytkownika-9359804` |
| sellerSince      | `Gru 2021`                                          |
| viewCount        | `2158`                                              |

#### Media & Description

| Field       | Example                                                                                     |
| ----------- | ------------------------------------------------------------------------------------------- |
| description | `SPRZEDAM - 2 pokojowe przestronne jasne mieszkanie do REMONTU o powierzchni 63,54 m.kw...` |
| images      | `["https://thumbs.img-sprzedajemy.pl/1000x901c/21/b6/87/...jpg", "..."]`                    |
| imageCount  | `12`                                                                                        |
| mainImage   | `https://thumbs.img-sprzedajemy.pl/1000x901c/21/b6/87/...jpg`                               |

#### Monitoring (when incremental mode is on)

| Field       | Example                    |
| ----------- | -------------------------- |
| changeType  | `NEW`                      |
| firstSeenAt | `2026-08-09T06:00:00.000Z` |
| lastSeenAt  | `2026-08-11T06:00:00.000Z` |
| isRepost    | `false`                    |
| repostOfId  | `null`                     |

### 📊 Example Output

```json
{
    "id": "73747664",
    "offerId": "73747664",
    "title": "SPRZEDAM MIESZKANIE DO REMONTU",
    "price": 143000,
    "priceCurrency": "PLN",
    "pricePerM2": 2251,
    "area": 63.54,
    "numberOfRooms": 2,
    "floor": 1,
    "buildYear": 1930,
    "marketType": "wtorny",
    "city": "Wałbrzych",
    "province": "dolnośląskie",
    "street": "Wałbrzyska 41",
    "latitude": 50.7247553,
    "longitude": 16.272577,
    "description": "SPRZEDAM - 2 pokojowe przestronne jasne mieszkanie do REMONTU o powierzchni 63,54 m.kw. Idealna propozycja dla rodziny lub pod inwestycję.",
    "sellerType": "private",
    "amenities": ["Pokrycie dachu: dachówka"],
    "images": [
        "https://thumbs.img-sprzedajemy.pl/1000x901c/21/b6/87/sprzedam-mieszkanie-do-remontu-dolnoslaskie-walbrzych-605131469.jpg",
        "https://thumbs.img-sprzedajemy.pl/1000x901c/3f/54/55/sprzedam-mieszkanie-do-remontu-miejsce-parkingowe-605131470.jpg"
    ],
    "imageCount": 12,
    "mainImage": "https://thumbs.img-sprzedajemy.pl/1000x901c/21/b6/87/sprzedam-mieszkanie-do-remontu-dolnoslaskie-walbrzych-605131469.jpg",
    "datePosted": "2026-08-10T22:10:08+02:00",
    "propertyUrl": "https://sprzedajemy.pl/sprzedam-mieszkanie-do-remontu-walbrzych-4-1b8e55-6fpbc4-nr73747664",
    "district": "Glinik",
    "totalFloors": 2,
    "plotArea": null,
    "buildingType": "kamienica",
    "buildingMaterial": "cegła",
    "heating": "węglowe",
    "ownershipForm": "własność",
    "agency": null,
    "phone": "510112418",
    "sellerProfileUrl": "https://sprzedajemy.pl/oferty-uzytkownika-9359804",
    "sellerSince": "Gru 2021",
    "viewCount": 2158,
    "condition": null,
    "plotWidth": null,
    "plotLength": null,
    "isNegotiable": true,
    "isPromoted": false,
    "transactionType": "sale",
    "propertyType": "flats",
    "portal": "sprzedajemy",
    "scrapedAt": "2026-08-11T08:16:30.827Z"
}
```

### 📋 Dataset Views

The Apify Console gives you **five ready-made table views** to quickly browse your results:

| View                      | What It Shows                                                                         |
| ------------------------- | ------------------------------------------------------------------------------------- |
| 📊 **Overview**           | Title, price, area, rooms, city, district, seller and date posted                     |
| 🗺️ **Location & Map**     | City, district, voivodeship, street and GPS coordinates                               |
| 📞 **Seller Contacts**    | Seller type, name, phone number, profile link and member-since date                   |
| 🔔 **Monitoring Changes** | What changed on each run — new, updated or reappeared, with price and first/last seen |
| 📋 **Full Details**       | Every single field — the complete dataset                                             |

### ❓ FAQ

**🤔 How do I only get ads from private owners, not agencies?**
Set Seller Type to "Private sellers only". The portal applies that filter itself, so every result you pay for is a private seller.

**🤔 Can I get the seller's phone number?**
Yes — turn on "Fetch full ad details" and you get the phone number, seller name, profile link and how long they have been a member.

**🤔 How does the monitoring mode save me money?**
The first run stores a fingerprint of every ad. Later runs compare against it and only return ads that are new, changed or have come back — typically 80–95% fewer results on a daily schedule. Runs are faster too, because the scraper stops paging as soon as it reaches ads it already knows.

**🤔 Will I get duplicates if I run it every day?**
No. Every ad is deduplicated within a run, and in monitoring mode ads you have already seen are not returned again unless something about them actually changed.

**🤔 How many ads are there in total?**
Around 37,000 property ads across the six categories. The largest are plots and land (~11,000) and flats for sale (~7,300).

**🤔 Can I export the data?**
Yes — JSON, CSV, Excel, XML, HTML, RSS. You can also push data directly to Google Sheets, Zapier, Make, or any webhook/API endpoint.

**🤔 How often should I run this?**
For fresh data, run daily or weekly. You can schedule automatic runs on Apify with just a few clicks — combine a daily schedule with monitoring mode for the cheapest possible tracking.

**🤔 Does it work with proxies?**
It does, but it does not need one — this site works perfectly without a proxy, which keeps your runs as cheap as possible. If you would rather use one, it works with Apify's built-in proxy service.

### 🛠️ Need Custom Filters or Features?

**I'm happy to customize this scraper for your specific needs!** 🤝

Whether you need:

- 🎯 Additional filters (specific districts, price per square metre thresholds, only ads with a phone number, only "do remontu" properties)
- 📊 Extra data fields or custom output formats
- 🔄 Integration with your CRM, Google Sheets, or database
- ⏰ Scheduled scraping with automatic deduplication and instant alerts on new listings
- 🌐 Scraping from other Polish property platforms alongside Sprzedajemy.pl — Otodom, OLX, Morizon, Gratka, Adresowo, Domiporta and Nieruchomosci-online are all available, and results can be merged into one unified feed

👉 **Don't hesitate to reach out via private message** — I respond quickly and I'm always open to building exactly what you need. No request is too small or too specific!

### ⚖️ Legal & Ethical Use

This scraper collects **only publicly available information** from Sprzedajemy.pl. It does not access private data, bypass authentication, or log into any account — every field it returns is visible to any visitor browsing the site. Contact details are published by the sellers themselves for the purpose of being contacted about their listing. Please use the data responsibly and in compliance with applicable laws, GDPR, and the platform's terms of service.

# Actor input Schema

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

Paste sprzedajemy.pl real-estate listing URLs or individual ad URLs. When provided, these take priority over the search filters below. Listing URLs are paginated automatically; ad URLs (ending in -nr123456) are scraped directly.

## `transactionType` (type: `string`):

Sale or rent. Choose 'Any' to collect both.

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

Which real-estate category to scrape. 'Any' combined with a specific transaction type scrapes all six categories.

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

City, voivodeship, or 'City/District'. Examples: Warszawa, mazowieckie, Wałbrzych/Glinik. Leave empty to search all of Poland.

## `keyword` (type: `string`):

Free-text phrase to match, e.g. kawalerka, garaż murowany, bliźniak.

## `keywordInDescription` (type: `boolean`):

By default the keyword only matches ad titles. Turn this on to also search inside ad descriptions — many more results, slightly less precise.

## `sort` (type: `string`):

Newest first is required for incremental monitoring and early-stop pagination, and is the default.

## `priceMin` (type: `integer`):

Applied by the portal itself, so no results are wasted.

## `priceMax` (type: `integer`):

Applied by the portal itself, so no results are wasted.

## `areaMin` (type: `integer`):

Ads that do not state an area are kept.

## `areaMax` (type: `integer`):

Ads that do not state an area are kept.

## `roomsMin` (type: `integer`):

Ads that do not state a room count are kept.

## `roomsMax` (type: `integer`):

Ads that do not state a room count are kept.

## `sellerType` (type: `string`):

Restrict to private sellers or to businesses and agencies. Applied by the portal.

## `fetchPropertyDetails` (type: `boolean`):

Off (fast mode): ~15 fields per ad straight from the results pages — very fast and cheap. On (full mode): opens every ad for the full description, all photos, GPS coordinates, street, voivodeship, price per m², seller name and phone number. Roughly one extra request per ad.

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

Stop after this many ads. Set 0 for unlimited (the whole category).

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

Hard cap on pagination depth per listing URL. 0 means no page limit.

## `incrementalMode` (type: `boolean`):

Track state between runs and output only ads that are NEW, changed (UPDATED) or came back (REAPPEARED). The first run stores a baseline; later runs charge only for the difference — typically 80–95% fewer results on a daily schedule. Pagination also stops early once pages contain nothing new.

## `stateKey` (type: `string`):

Name of the saved baseline. Leave empty to derive it from your filters. Set it explicitly when several scheduled tasks must share one baseline.

## `emitUnchanged` (type: `boolean`):

Output every ad found, tagged UNCHANGED as well. Disables early-stop pagination because a full crawl is required.

## `emitExpired` (type: `boolean`):

Emit an EXPIRED record for ads that were in the previous run but are gone now — useful for detecting sold or withdrawn properties. Requires a full crawl.

## `skipReposts` (type: `boolean`):

Drop ads that look like a re-listing of an expired one (identical content under a new ad number).

## `earlyStopPages` (type: `integer`):

Incremental mode only: stop paginating once this many consecutive pages contain no new or changed ads. Set 0 to always crawl the full listing. Ignored when unchanged or expired ads are being emitted.

## `compact` (type: `boolean`):

Output only the core fields — handy for AI workflows and spreadsheets.

## `excludeEmptyFields` (type: `boolean`):

Leave out fields that are empty for a given ad instead of returning them as null.

## `maxConcurrency` (type: `integer`):

Parallel requests. The portal tolerates high concurrency well; lower it only if you want to be extra gentle.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

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

Optional. sprzedajemy.pl has no anti-bot protection and is not geo-restricted, so this scraper runs fine with no proxy at all — which is also the cheapest option. Enable a proxy only if you specifically need one.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://sprzedajemy.pl/warszawa/nieruchomosci/mieszkania/sprzedaz"
    }
  ],
  "transactionType": "sale",
  "propertyType": "flats",
  "location": "Warszawa",
  "keywordInDescription": false,
  "sort": "newest",
  "sellerType": "all",
  "fetchPropertyDetails": false,
  "maxItems": 100,
  "maxPages": 0,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "earlyStopPages": 2,
  "compact": false,
  "excludeEmptyFields": false,
  "maxConcurrency": 5,
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

## `monitoring` (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 = {
    "startUrls": [
        {
            "url": "https://sprzedajemy.pl/warszawa/nieruchomosci/mieszkania/sprzedaz"
        }
    ],
    "location": "Warszawa"
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/sprzedajemy-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": [{ "url": "https://sprzedajemy.pl/warszawa/nieruchomosci/mieszkania/sprzedaz" }],
    "location": "Warszawa",
}

# Run the Actor and wait for it to finish
run = client.actor("trev0n/sprzedajemy-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": [
    {
      "url": "https://sprzedajemy.pl/warszawa/nieruchomosci/mieszkania/sprzedaz"
    }
  ],
  "location": "Warszawa"
}' |
apify call trev0n/sprzedajemy-scraper --silent --output-dataset

```

## MCP server setup

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