# Sreality.cz Scraper (`hgservices/sreality-cz-scraper`) Actor

Scrape Sreality.cz listings - prices, photos, GPS, floor areas and agency contacts for apartments, houses and land across the Czech Republic. Export JSON, CSV, Excel.

- **URL**: https://apify.com/hgservices/sreality-cz-scraper.md
- **Developed by:** [Harish Garg](https://apify.com/hgservices) (community)
- **Categories:** Real estate, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 real estate listings

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/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

### What does Sreality.cz Scraper do?

**Sreality.cz Scraper** extracts real-estate listings from [Sreality.cz](https://www.sreality.cz),
the Czech Republic's #1 property portal — **prices, GPS coordinates, photos, floor areas, energy
ratings, agency details, and 12 POI distance metrics** per listing. It runs on Sreality's public
JSON API (no login, no browser), so it's fast and cheap. Paste search URLs and go — or schedule it
on the Apify platform for fresh data daily, delivered via API, JSON, CSV, or Excel.

### Why use Sreality.cz Scraper?

- **PropTech & investors:** track asking prices per m² across districts, and spot price drops —
  turn on **Include full details** to get the previous asking price of a discounted listing.
- **Relocations & research:** full locality tree (region → district → municipality → city part)
  plus distances to metro, schools, shops, doctors and more.
- **Lead generation:** identify the listing agency, with its company registration number, in
  detail rows.

Unlike other Sreality scrapers, this actor talks to the verified public API directly — no brittle
browser automation, no login wall.

### How to scrape Sreality.cz

1. Open [Sreality.cz](https://www.sreality.cz) and build your search (e.g. *for sale → apartments
   → Praha*).
2. Copy the URL from your browser and paste it into **Start URLs** (mix in detail-page URLs or
   bare listing ids too).
3. Click **Start** and download your dataset.

No URL to hand? Put a place name in **Start URLs** — `Praha 5`, `Brno` — and set **Offer type**
and **Property type**. That combination is what an AI agent sends when it has only your words to
work from.

### Input

| Field            | Description                                                                                                                                                                                                                                                                                                                                                                     |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`      | **Required.** Search URLs (`/hledani/...` or `/en/search/...`), detail URLs, listing ids, or a plain place name such as `Praha 5`. The scheme is optional, and `[{ "url": "..." }]` objects work as well as plain strings — handy when another Actor or an AI agent calls this one. Entries that cannot be used are reported and skipped, so one bad URL does not sink the run. |
| `offerType`      | `for-sale`, `for-rent`, or `auction`. Optional; unset returns all three.                                                                                                                                                                                                                                                                                                        |
| `propertyType`   | `apartments`, `houses`, `land`, `commercial`, or `other`. Optional; unset returns every kind, garages and offices included.                                                                                                                                                                                                                                                     |
| `maxListings`    | Cap on listings scraped across all URLs (default 100). Named listings are scraped before searches, so a search cannot crowd them out.                                                                                                                                                                                                                                           |
| `includeDetails` | Fetch the full detail record per listing (description, areas, energy, agency).                                                                                                                                                                                                                                                                                              |
| `language`       | `en` or `cs` — language of category labels.                                                                                                                                                                                                                                                                                                                                     |

### Output

One row per listing. You can download the dataset in various formats such as JSON, HTML, CSV, or
Excel.

```json
{
  "hashId": "1200328780",
  "url": "https://www.sreality.cz/en/detail/sale/flat/2+kt/praha-branik-novodvorska/1200328780",
  "name": "For sale apartment 2+kt 42 m²",
  "categoryType": "Sale",
  "priceCzk": 7350000,
  "priceCzkPerSqM": 175000,
  "city": "Praha",
  "district": "Praha 4",
  "gpsLat": 50.0259,
  "gpsLon": 14.4312,
  "images": ["https://d18-a.sdn.cz/..."],
  "poiDistances": { "metro": 420, "school": 310 }
}
```

With `includeDetails`, each row adds a `detail` object with the full record: description, area
breakdowns, energy rating, heating and utilities, agency and its company registration number,
and the previous asking price.

### How much does it cost to scrape Sreality.cz?

Pay per result: a small charge per listing card, plus a per-detail charge when
`includeDetails` is on. A 1,000-listing search costs cents in platform usage — the actor is pure
HTTP (no browser), so compute is minimal.

### Tips

- The whole-country flats-for-sale catalog is ~19k listings — paginate with a big `maxListings`
  and let the actor dedupe on `hashId` for you.

### FAQ, disclaimers, and support

Is this legal? The actor accesses public listing data; you are responsible for complying with
Sreality's terms and applicable law. Known limits: new-development *projects* and user-account
features (favourites) are out of scope. Found a problem or need a custom Sreality solution? Use
the **Issues** tab.

# Actor input Schema

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

Search URLs (`/hledani/...` or `/{lang}/search/...`), detail page URLs (`/detail/.../{id}`), bare listing ids, or a plain place name such as `Praha 5`. Mixed lists are fine.

## `offerType` (type: `string`):

Restrict searches to sale, rent, or auction listings. Leave unset for all three. A start URL that already states the offer type keeps its own — this only fills the gap, which is what a plain place name such as `Praha 5` leaves open.

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

Restrict searches to one property category. Leave unset to get every kind, including garages, parking places and offices. A start URL that already states the category keeps its own.

## `maxListings` (type: `integer`):

Maximum number of listings to scrape across all start URLs. The run stops at the default 1-hour timeout, so raise the run timeout for very large numbers — above roughly 100,000 cards, or 3,000 listings with Include full details on.

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

Fetch the full detail record (description, areas, energy rating, agency, old price) for every listing. One extra request per listing, charged as a separate event.

## `language` (type: `string`):

Language for localized labels (category names etc.).

## Actor input object example

```json
{
  "startUrls": [
    "https://www.sreality.cz/en/search/for-sale/apartments",
    "Praha 5",
    "3028607052"
  ],
  "maxListings": 100,
  "includeDetails": false,
  "language": "en"
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped listings, one item per listing. Use the view selector to switch between the overview, location, and media tables.

## `runInput` (type: `string`):

The input record this run started from.

# 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": [
        "https://www.sreality.cz/en/search/for-sale/apartments"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/sreality-cz-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": ["https://www.sreality.cz/en/search/for-sale/apartments"] }

# Run the Actor and wait for it to finish
run = client.actor("hgservices/sreality-cz-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": [
    "https://www.sreality.cz/en/search/for-sale/apartments"
  ]
}' |
apify call hgservices/sreality-cz-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hgservices/sreality-cz-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/54AJ2TAIDxSm06bLC/builds/iQPQfN0iO5E0Oz3aY/openapi.json
