# Gratka & Morizon Scraper — Poland Property Listings, No Phones (`highbrow_fame/gratka-morizon-properties`) Actor

Polish property listings from Gratka.pl and Morizon.pl, for sale or to rent: price, price per m², area, rooms, floor, market, city and district, seller type, full description. No phones.

- **URL**: https://apify.com/highbrow_fame/gratka-morizon-properties.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 property delivereds

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

## Gratka & Morizon Scraper — Poland Property Listings, No Phones

Get property listings from Gratka.pl and Morizon.pl, two of Poland's big property portals: price, price per m², area, rooms, floor, city, district and street, primary or secondary market, seller type and agency, when it was added, the photo, and — by default — the full description, coordinates, build year, building type, heating, condition, ownership and every attribute the listing has. For sale and to rent. Paste your search links from either site — or just type a place.

**Why this one**

- 🔗 **Both sites, one tool.** Gratka and Morizon show the same listings from one database: in a live run, 100 Gdańsk flats from gratka.pl and 100 from morizon.pl were the same 100 listings in the same order. Paste links from either site (mixing is fine); each result links back to the site you searched.
- 🔎 **Your search, as you set it up.** Set every filter you like on the site and paste the link. Or type a place here — Kraków, Mokotów, Zakopane — and choose sale or rent, property type, price, area, rooms, private / agency / developer, primary or secondary market, "added within" and the sort order.
- 📄 **The whole listing.** Every property comes with its full description and attributes (a live run: 4,744 properties, every one with its listing details). Switch **Open every listing for its details** off if you only need the search-card fields.
- ⚡ **Fast and deep.** A live run read 4,744 properties with details from three search links and a place in 173 seconds; 5,000 Warsaw flats without details took 157 seconds. It reads past the 200 pages the websites show: 15,435 Warsaw flats in one run.
- 🔒 **No phone numbers, no agent names.** Agencies and developers are named by their company; private sellers by nothing, and they get no street and no coordinates. Phone numbers, e-mail addresses, agents' names and licence numbers written into titles and descriptions are replaced with `[phone removed]`, `[e-mail removed]`, `[name removed]` and `[removed]`.
- 💸 **You pay only for properties delivered.** A link that is not a Gratka or Morizon search, or a place the sites do not know, comes back as a free record with the reason.

### What you get

For every property:

| Field | What it is |
|---|---|
| `price`, `currency`, `pricePerSqm`, `previousLowestPrice` | the asking price (PLN; for rent per month), price per m², and the lowest earlier price when the site shows one (EU price-reduction rule) |
| `transaction`, `propertyType`, `market`, `category` | sale or rent; FLAT, HOUSE, PLOT, GARAGE, ROOM, OFFICES, …; primary or secondary; the site's own label ("mieszkanie na sprzedaż") |
| `areaSqm`, `rooms`, `floor`, `floorsInBuilding` | size and layout (floor 0 = ground floor) |
| `province`, `county`, `city`, `district`, `neighbourhood`, `locationPath`, `street` | where it is, as the site writes it; `street` only for agencies and developers |
| `sellerType`, `agency`, `development` | private / agency / developer, the company name (none for private sellers) and the development's name |
| `title`, `description`, `highlight` | the ad's headline, its text (full with details, the first ~450 characters without) and the badge the agency set ("0% prowizji") |
| `addedAt`, `refreshedAt`, `isPromoted` | when it was added and refreshed |
| `image`, `imageCount`, `floorPlanCount`, `hasVideo`, `has3dTour` | the first photo and what else the listing has |
| `url`, `site`, `listingId`, `siteListingId` | the listing on the site you searched; `listingId` is the same on both sites |
| `input`, `place`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

With **Open every listing for its details** (on by default) also: `latitude`, `longitude` (agencies and developers only), `buildYear`, `buildingType`, `buildingMaterial`, `heating`, `condition`, `ownership`, `bathrooms`, `plotAreaSqm`, `additionalCosts`, `deposit`, `availableFrom`, `features` (lift, parking, furniture, …), `attributes` (every attribute of the listing, with the site's Polish labels), `updatedAt`, `views`, `county`, `commune`, `listingStatus`.

#### Example

A real record from a live run — Warsaw flats for sale on gratka.pl, 26 September 2026 (description and lists shortened):

```json
{
  "listingId": 1543003718,
  "site": "gratka",
  "siteListingId": "48985153",
  "url": "https://gratka.pl/nieruchomosci/mieszkanie-warszawa-wlochy-ks-juliana-chroscickiego/ob/48985153",
  "title": "Piękne 3pokojowe mieszkanie we Włochach",
  "category": "mieszkanie na sprzedaż",
  "transaction": "sale",
  "propertyType": "FLAT",
  "market": "secondary",
  "price": 1130000,
  "currency": "PLN",
  "pricePerSqm": 13614.46,
  "areaSqm": 83,
  "rooms": 3,
  "floor": 1,
  "floorsInBuilding": 3,
  "city": "Warszawa",
  "district": "Włochy",
  "street": "Księdza Juliana Chrościckiego",
  "sellerType": "agency",
  "agency": "Akcent Nieruchomości Sp. z o.o.",
  "highlight": "Tylko u nas",
  "addedAt": "2026-09-16",
  "description": "Przestronne 3 pokojowe mieszkanie z 2 balkonami i garderobą w Warszawie ( Nowe Włochy).\nNa sprzedaż wyjątkowo komfortowe…",
  "image": "https://media.domy.pl/img/zdjecia/akcent/b/akcent_ms_11797_1.jpg",
  "imageCount": 23,
  "latitude": 52.2104277,
  "longitude": 20.8919506,
  "buildYear": 2009,
  "buildingType": "Apartamentowiec",
  "heating": "Co miejskie",
  "condition": "Bardzo dobry",
  "ownership": "Własność",
  "features": ["Obiekt zamknięty", "Domofon", "Miejsce postojowe (miejsce postojowe)"],
  "views": 638,
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from gratka.pl or morizon.pl, one per line — or type **Places** and choose the filters.
2. Set **Max listings per search**. Leave **Open every listing for its details** on for descriptions, coordinates and building data.
3. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To follow new listings in an area, save your input as a task with **Added within (days)** set to 1 and schedule it daily. Searches typed as **Places** run on morizon.pl, so their links point there.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per property delivered** — see the price on this page. Opening listings for their details costs nothing extra. Links that are not Gratka or Morizon searches and places the sites do not know are free.

### FAQ

**How many properties per search?** As many as the site has. The websites' own result pages stop at page 200 (7,000 listings); this tool reads on to the end: a live run read 15,435 of the 15,560 Warsaw flats for sale in 8 minutes, without details. While a long search is being read, agencies refresh and remove listings and the order moves, so a few can slip past; split a very large search by district or price if you need every single one.

**Do I need both sites?** No. They list the same properties, so one search on either site is enough; searching the same thing on both gives you each property twice (once per site, with the same `listingId`).

**Why is the city sometimes a municipality?** For villages the sites often write "municipality / village"; then `city` is the municipality and `district` the village. `locationPath` always has the site's own wording.

**Why no phone numbers or agent names?** They are personal data. Every listing has its `url`; buyers and tenants contact the seller on the site. Some agencies trade under their owner's name; that business name is kept as the site publishes it.

**What about new-development project pages?** A list of projects ("inwestycje", "nowe inwestycje") has no property list and comes back as a free record. Search flats or houses with **Market: Primary** to get the units for sale in new developments.

**Is this affiliated with Gratka or Morizon?** No. This is an independent tool that reads public listings from gratka.pl and morizon.pl.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

## `searchUrls` (type: `array`):

Set up a search on gratka.pl or morizon.pl with all the filters you want and paste the address of the results page. One per line; both sites can be mixed.

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

Or search here without a link: cities, towns, districts or villages in Poland (Kraków, Mokotów, Zakopane). The filters below apply. These searches run on morizon.pl, which lists the same properties as gratka.pl.

## `transaction` (type: `string`):

For the places above.

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

For the places above.

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

Optional. For rent: per month.

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

Optional. For rent: per month.

## `minArea` (type: `integer`):

Optional.

## `maxArea` (type: `integer`):

Optional.

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

Optional.

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

Optional.

## `ownerType` (type: `string`):

Optional.

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

Optional: new build (primary) or resale (secondary).

## `addedWithinDays` (type: `integer`):

Optional: only listings first added in the last N days.

## `sortBy` (type: `string`):

For the places above.

## `maxListingsPerSearch` (type: `integer`):

Stops each search after this many listings.

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

Adds the full description, primary or secondary market, coordinates (agencies and developers only), build year, building type, heating, condition, ownership, plot area, extra costs and all the listing's attributes. One more small request per listing; switch it off for the fastest runs.

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

How many searches to work on at the same time.

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

Used only to try again after a network error: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://gratka.pl/nieruchomosci/mieszkania/krakow?cena-calkowita:max=600000&liczba-pokoi[0]=2&liczba-pokoi[1]=3",
    "https://www.morizon.pl/do-wynajecia/mieszkania/warszawa/mokotow/"
  ],
  "transaction": "sale",
  "propertyType": "flat",
  "ownerType": "all",
  "market": "all",
  "sortBy": "default",
  "maxListingsPerSearch": 30,
  "includeDetails": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "searchUrls": [
        "https://gratka.pl/nieruchomosci/mieszkania/krakow?cena-calkowita:max=600000&liczba-pokoi[0]=2&liczba-pokoi[1]=3",
        "https://www.morizon.pl/do-wynajecia/mieszkania/warszawa/mokotow/"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/gratka-morizon-properties").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 = {
    "searchUrls": [
        "https://gratka.pl/nieruchomosci/mieszkania/krakow?cena-calkowita:max=600000&liczba-pokoi[0]=2&liczba-pokoi[1]=3",
        "https://www.morizon.pl/do-wynajecia/mieszkania/warszawa/mokotow/",
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/gratka-morizon-properties").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 '{
  "searchUrls": [
    "https://gratka.pl/nieruchomosci/mieszkania/krakow?cena-calkowita:max=600000&liczba-pokoi[0]=2&liczba-pokoi[1]=3",
    "https://www.morizon.pl/do-wynajecia/mieszkania/warszawa/mokotow/"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/gratka-morizon-properties --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/gratka-morizon-properties"
        }
    }
}
```

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/JhXPSptPgfvLtDfmp/builds/P9UMbAwtJoRquUtL5/openapi.json
