# Gratka Scraper \[$1.50/1K💰] | Polish Real Estate (`ahmed_jasarevic/gratka-scraper`) Actor

Scrape Gratka Polish real-estate listings: price, price per m², area, rooms, floor, land size, seller, location, property type, photos and listing URLs. $1.50 per 1,000 listings.

- **URL**: https://apify.com/ahmed_jasarevic/gratka-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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.
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?

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 Scraper – Polish Real Estate Listings & Contacts

Scrape public **Gratka** property listings across Poland: flats, houses, plots, rooms, garages and commercial units for sale or rent. Get prices, price per m², area, rooms, floor, land size, location, seller and agency details, phones, photos, descriptions and dates. **$1.50 per 1,000 listings.**

### Polish Property Data For Agencies And Investors

Gratka is one of Poland’s largest real-estate marketplaces. This Actor turns public search results into a structured dataset for estate agencies, property flippers, relocation teams, investors and rent-vs-buy researchers.

- **Competitor monitoring** — track asking prices and inventory by city.
- **Investment screening** — compare price per m², area and property type.
- **Agency lead generation** — collect agency, agent and phone details when public.
- **Relocation research** — compare districts and cities for sale and rent.
- **Market reports** — export listing counts, prices and locations for analysis.

### How It Works

![How the Gratka Scraper works: search pages to structured Polish property listings with prices, locations and contacts.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-gratka-scraper.webp)

Paste any public Gratka search URL. The Actor reads the listing cards, follows the available result pages up to your limits, and writes one row per property. City, transaction, property type and price filters already in the URL are preserved.

- One row per listing.
- Any Gratka search or listing URL works.
- Automatic pagination up to `maxPagesPerUrl` and `maxItems`.
- Seller phones and agency details when the portal publishes them.
- Free users get a 10-listing preview.

### Search By City, Property Type And Transaction

Common starting points:

- **Flats for sale** — `https://gratka.pl/nieruchomosci/mieszkania`
- **Flats for rent** — `https://gratka.pl/nieruchomosci/mieszkania/wynajem`
- **Houses** — `https://gratka.pl/nieruchomosci/domy`
- **Plots** — `https://gratka.pl/nieruchomosci/dzialki-grunty`
- **Rooms** — `https://gratka.pl/nieruchomosci/pokoje`
- **Garages** — `https://gratka.pl/nieruchomosci/garaze`
- **Commercial** — `https://gratka.pl/nieruchomosci/lokale-uzytkowe`

Append a city or district, for example `https://gratka.pl/nieruchomosci/mieszkania/krakow`.

### Price, Area, Location And Seller Fields

Every listing can include the listing ID, URL, title, property type, transaction type and label, price, currency, price per m², area, rooms, floor, building height, land area, region, county, city, district, street, seller type, seller name, agency name and ID, agency type, agent name and URL, phones, images, description, advertisement text, development name, media and promotion flags, added date, refresh date and source URL.

Some fields are not published for every listing. Seller phones appear only when Gratka displays them, and email addresses are not part of the public listing card.

### Input – Configure A Gratka Run

| Field | Type | Default | Notes |
|---|---|---|---|
| `startUrls` | array | Warsaw flats | Any Gratka search or listing URL |
| `maxPagesPerUrl` | integer | `3` | Result pages per start URL, about 35 listings each |
| `maxItems` | integer | `100` | Global cap on saved listings |
| `proxy` | object | Direct | Optional connection settings |

### Output – Listing Fields

- **Identity** — `listingId`, `url`, `title`, `propertyType`, `transactionType`, `transactionLabel`
- **Price** — `price`, `currency`, `priceFormatted`, `pricePerM2`, `pricePerM2Formatted`
- **Size** — `areaM2`, `rooms`, `floor`, `floorsInBuilding`, `floorFormatted`, `landAreaM2`
- **Location** — `location.region`, `location.county`, `location.city`, `location.district`, `location.street`, `location.raw`
- **Seller** — `sellerType`, `sellerName`, `agencyName`, `agencyId`, `agencyType`, `agentName`, `agentUrl`, `phones`
- **Content** — `images`, `description`, `advertisementText`, `developmentName`
- **Flags** — `hasVideo`, `has3dView`, `isTopPromoted`
- **Dates** — `addedAt`, `refreshedAt`, `sourceUrl`

### Example Input – Warsaw Flats And Kraków Houses

```json
{
  "startUrls": [
    { "url": "https://gratka.pl/nieruchomosci/mieszkania/warszawa" },
    { "url": "https://gratka.pl/nieruchomosci/domy/krakow" }
  ],
  "maxPagesPerUrl": 5,
  "maxItems": 300
}
```

### Example Output – Warsaw Flat

```json
{
  "listingId": "ob/12345678",
  "url": "https://gratka.pl/nieruchomosci/mieszkanie/warszawa/ob/12345678",
  "title": "mieszkanie na sprzedaż",
  "propertyType": "flat",
  "transactionType": "sale",
  "transactionLabel": "sprzedaż",
  "price": 850000,
  "currency": "PLN",
  "priceFormatted": "850 000 zł",
  "pricePerM2": 17000,
  "pricePerM2Formatted": "17 000 zł/m²",
  "areaM2": 50,
  "rooms": 2,
  "floor": 6,
  "floorsInBuilding": 11,
  "floorFormatted": "piętro 6/11",
  "landAreaM2": null,
  "location": {
    "region": "mazowieckie",
    "county": "Warszawa",
    "city": "Warszawa",
    "district": "Mokotów",
    "street": "Przykładowa",
    "raw": "Warszawa, Mokotów, Przykładowa"
  },
  "sellerType": "agency",
  "sellerName": "Example Estate",
  "agencyName": "Example Estate",
  "agencyId": "1234",
  "agencyType": "AGENCY",
  "agentName": "Jan Kowalski",
  "agentUrl": "https://gratka.pl/biuro/example-estate",
  "phones": ["+48 22 555 01 23"],
  "images": ["https://example.gratka.pl/photo/1.jpg"],
  "description": "Public listing description.",
  "advertisementText": "2 pokoje, 50 m², Mokotów",
  "developmentName": null,
  "hasVideo": false,
  "has3dView": true,
  "isTopPromoted": false,
  "addedAt": "2026-10-20T09:00:00.000Z",
  "refreshedAt": "2026-10-31T09:00:00.000Z",
  "sourceUrl": "https://gratka.pl/nieruchomosci/mieszkania/warszawa"
}
```

### Export Polish Property Data And Schedule Runs

Download JSON, CSV, Excel or HTML from Apify Console or through the Apify API. Send results to Google Sheets, Airtable, Make, Zapier, n8n or a webhook. Schedule daily or weekly runs to track new listings and price changes.

### Related Actors

- [Otodom Scraper](https://apify.com/ahmed_jasarevic/otodom-scraper) — compare Polish property listings
- [OLX Scraper](https://apify.com/ahmed_jasarevic/olx-scraper) — add classified marketplace inventory
- [Google Maps Scraper](https://apify.com/apify/google-maps-scraper) — research neighborhoods and amenities
- [Contact Details Scraper](https://apify.com/ahmed_jasarevic/contact-details-scraper) — enrich agency websites with public contact data

### FAQ

#### Do I need a Gratka account?

No. The Actor reads public listing and search pages without login.

#### Can I use any Gratka search URL?

Yes. Paste a public search URL with city, transaction, property type or price filters and those filters are preserved.

#### How many listings does one page contain?

About 35. Pagination stops at `maxPagesPerUrl`, `maxItems` or the last results page.

#### Are seller phones always available?

No. Phones appear only when Gratka displays them. Many agency listings route calls through the portal, and email addresses are not part of the public card.

#### Why is `floorsInBuilding` sometimes empty?

It is derived from the public floor string. When Gratka shows only `piętro 3` without building height, the field is `null`.

#### Does it include commercial properties?

Yes. Supported property types include flats, houses, land, rooms, garages and commercial units.

#### How much does it cost?

FREE users pay **$0.0015 per listing** ($1.50 per 1,000), BRONZE pays **$0.0014**, SILVER **$0.0013** and GOLD+ **$0.0012**, plus a small Actor Start event.

### For AI Agents & LLM Apps

Returns one row per public Gratka property listing with price, size, location, seller and media fields.

Minimal working input:

```json
{ "startUrls": [{ "url": "https://gratka.pl/nieruchomosci/mieszkania/warszawa" }], "maxItems": 20, "maxPagesPerUrl": 1 }
```

Output fields: `listingId, url, title, propertyType, transactionType, transactionLabel, price, currency, priceFormatted, pricePerM2, pricePerM2Formatted, areaM2, rooms, floor, floorsInBuilding, floorFormatted, landAreaM2, location, sellerType, sellerName, agencyName, agencyId, agencyType, agentName, agentUrl, phones, images, description, advertisementText, developmentName, hasVideo, has3dView, isTopPromoted, addedAt, refreshedAt, sourceUrl, scrapedAt`.

Behaviors an agent should know:

- `location` is a nested object with `region`, `county`, `city`, `district`, `street` and `raw`.
- `transactionType` is `sale` or `rent`; `propertyType` is normalized.
- `maxItems` is a global cap across all start URLs.
- Missing phones, floors or land area stay `null` or empty.
- Email addresses are not available.
- Free users get a 10-listing preview.

Billing: **$0.0015 per listing** on FREE ($1.50 per 1,000), $0.0014 on BRONZE, $0.0013 on SILVER and $0.0012 on GOLD+, plus a small Actor Start event.

### Legal & Compliance Disclaimer

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Gratka.

It collects publicly available property listings. Prices, areas, locations and contact details are published by advertisers and may change or contain errors. Users are responsible for complying with Gratka’s terms, privacy and marketing law, and for verifying listing details before any transaction. Nothing here is legal, valuation or investment advice.

### SEO Keywords

gratka scraper, gratka listings, polish real estate, poland property, warsaw flats, krakow houses, property prices poland, price per m2, real estate data, property listings, estate agency leads, property investment, rental market, gratka api, real estate api, property scraper, polish property market, gratka data

# Actor input Schema

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

gratka.pl listing pages to scrape. Any search URL on gratka.pl works (city, transaction, property type). Results are paginated automatically.

## `maxPagesPerUrl` (type: `integer`):

How many result pages to crawl for each start URL (each page holds ~35 listings).

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

Maximum number of listings to save to the dataset across the whole run.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://gratka.pl/nieruchomosci/mieszkania/warszawa"
    }
  ],
  "maxPagesPerUrl": 3,
  "maxItems": 100,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://gratka.pl/nieruchomosci/mieszkania/warszawa"
        }
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/gratka-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://gratka.pl/nieruchomosci/mieszkania/warszawa" }],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/gratka-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://gratka.pl/nieruchomosci/mieszkania/warszawa"
    }
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/gratka-scraper --silent --output-dataset

```

## MCP server setup

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