# RealtySync Universal — AI Real Estate Extractor (`conversational_kermis/realtysync-universal`) Actor

LLM-powered universal extractor for any Czech/Slovak real estate website. Uses Claude AI to understand and parse listing pages from boutique agencies, property managers, and non-standard portals. Outputs standardized listings matching the RealtySync schema.

- **URL**: https://apify.com/conversational\_kermis/realtysync-universal.md
- **Developed by:** [the anh nguyen](https://apify.com/conversational_kermis) (community)
- **Categories:** Real estate, AI
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## RealtySync Universal — AI Real Estate Extractor

Extract property listings from **any Czech or Slovak real estate website** — boutique agencies, property managers, developer sites, and non-standard portals that no pre-built scraper covers.

### What does this Actor do?

This Actor uses Claude AI (LLM) to understand and parse listing pages from arbitrary real estate websites:

1. **Loads the page** with Playwright (handles JavaScript-rendered sites and cookie banners)
2. **Extracts structured data** via multiple layers: JSON-LD, dataLayer, page text (trafilatura), image URLs, and GPS from embedded maps
3. **Sends to Claude AI** with a forced JSON schema — the LLM identifies and normalizes property details
4. **Outputs standardized listings** matching the RealtySync schema (price, area, GPS, contact, images)

If the page already has JSON-LD with real estate data, the LLM step is skipped entirely (fast path).

### Why use the Universal extractor?

The top 3-4 portals (Sreality, Bezrealitky, iDnes) cover ~80% of the Czech market. The remaining ~20% is spread across hundreds of boutique agency websites, developer landing pages, and regional portals. These sites have unique HTML structures that break traditional scrapers. The Universal extractor handles them all — point it at any listing page and get normalized output.

**Target audience:**
- Property databases that need the "long tail" of exclusive agency listings
- Market analysts covering niche segments (luxury, new builds, commercial)
- Cross-portal deduplication pipelines that need full market coverage

### How to use the Universal extractor

1. **Create a free Apify account** at [apify.com](https://apify.com) if you don't have one.
2. **Get an Anthropic API key** at [console.anthropic.com](https://console.anthropic.com) — the LLM extraction costs ~$0.001-0.003 per page (billed by Anthropic separately from this Actor's PPE charge).
3. **Open this Actor** in the Apify Console and click "Start".
4. **Add listing page URLs** and paste your Anthropic API key.
5. **Click Run** and download standardized listings from the Output tab.

#### Input example

```json
{
    "startUrls": [
        { "url": "https://www.bythos.cz/byty/prodej" },
        { "url": "https://www.luxury-reality.cz/nabidka" }
    ],
    "anthropicApiKey": "sk-ant-...",
    "maxResults": 50,
    "fetchDetailPages": true
}
````

#### Output example

```json
{
    "listing_id": "universal-a1b2c3d4",
    "title": "Prodej bytu 4+kk 120 m², Praha 1",
    "property_type": "APARTMENT",
    "transaction_type": "SALE",
    "price_czk": 18500000,
    "currency": "CZK",
    "locality": "Praha 1 - Josefov",
    "area_m2": 120.0,
    "latitude": 50.0900,
    "longitude": 14.4200,
    "seller_name": "Luxury Reality s.r.o.",
    "seller_phone": "+420 222 333 444",
    "url": "https://www.luxury-reality.cz/nabidka/byt-4kk-praha-1",
    "images": ["https://..."],
    "source": "universal"
}
```

#### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | array | Yes | — | URLs of listing/index pages to scrape |
| `anthropicApiKey` | string | Yes | — | Your Anthropic API key for Claude AI extraction |
| `maxResults` | integer | No | `100` | Maximum total listings to extract |
| `maxPagesPerSite` | integer | No | `5` | Maximum pagination pages per start URL |
| `fetchDetailPages` | boolean | No | `true` | Follow links to detail pages for richer data (GPS, full specs) |

### How much will it cost?

This Actor uses **Pay-Per-Event** pricing at **$0.01 per listing** (higher than portal-specific scrapers due to LLM processing).

| Volume | Cost (Actor PPE) | Est. Anthropic LLM cost | Total |
|--------|------------------|------------------------|-------|
| 10 listings | $0.10 | ~$0.01-0.03 | ~$0.13 |
| 50 listings | $0.50 | ~$0.05-0.15 | ~$0.65 |
| 100 listings | $1.00 | ~$0.10-0.30 | ~$1.30 |

**Note:** Anthropic API costs are billed separately by Anthropic to your account. Pages with JSON-LD data skip the LLM call entirely, reducing Anthropic costs.

Platform costs (compute) are billed separately by Apify based on your plan.

### Tips

- Use the dedicated portal scrapers (Sreality, Bezrealitky, iDnes) for those sites — they're 3x cheaper and faster.
- Set `fetchDetailPages: true` for best data quality — detail pages usually have GPS coordinates and full specs.
- Start with `maxResults: 10` to verify the Actor handles your target site before scaling up.
- Pages with structured data (JSON-LD) are processed instantly without LLM calls — check your site first.

### Is it legal to scrape these websites?

This Actor extracts publicly available data from public web pages. Web scraping of publicly accessible information is generally permitted under applicable law. Always review the target site's Terms of Service and applicable regulations (including GDPR for EU data) before use. This Actor does not bypass authentication, paywalls, or CAPTCHAs. Use responsibly and respect rate limits.

# Actor input Schema

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

URLs of listing/index pages to scrape. Each URL should point to a page showing multiple property listings.

## `anthropicApiKey` (type: `string`):

Your Anthropic API key for Claude AI extraction. Get one at console.anthropic.com. Cost: ~$0.001 per page processed.

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

Maximum total listings to extract across all start URLs.

## `maxPagesPerSite` (type: `integer`):

Maximum pagination pages to follow per start URL.

## `fetchDetailPages` (type: `boolean`):

Follow links to individual listing pages for richer data (GPS, full specs, all images). Slower but much better output.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bythos.cz/byty/prodej"
    }
  ],
  "maxResults": 50,
  "maxPagesPerSite": 5,
  "fetchDetailPages": 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 = {
    "startUrls": [
        {
            "url": "https://www.bythos.cz/byty/prodej"
        }
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("conversational_kermis/realtysync-universal").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://www.bythos.cz/byty/prodej" }],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("conversational_kermis/realtysync-universal").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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://www.bythos.cz/byty/prodej"
    }
  ],
  "maxResults": 50
}' |
apify call conversational_kermis/realtysync-universal --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=conversational_kermis/realtysync-universal",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RealtySync Universal — AI Real Estate Extractor",
        "description": "LLM-powered universal extractor for any Czech/Slovak real estate website. Uses Claude AI to understand and parse listing pages from boutique agencies, property managers, and non-standard portals. Outputs standardized listings matching the RealtySync schema.",
        "version": "1.0",
        "x-build-id": "NjOqvkfjz0f2p4iRW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/conversational_kermis~realtysync-universal/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-conversational_kermis-realtysync-universal",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/conversational_kermis~realtysync-universal/runs": {
            "post": {
                "operationId": "runs-sync-conversational_kermis-realtysync-universal",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/conversational_kermis~realtysync-universal/run-sync": {
            "post": {
                "operationId": "run-sync-conversational_kermis-realtysync-universal",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls",
                    "anthropicApiKey"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs of listing/index pages to scrape. Each URL should point to a page showing multiple property listings.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "anthropicApiKey": {
                        "title": "Anthropic API Key",
                        "type": "string",
                        "description": "Your Anthropic API key for Claude AI extraction. Get one at console.anthropic.com. Cost: ~$0.001 per page processed."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum total listings to extract across all start URLs.",
                        "default": 100
                    },
                    "maxPagesPerSite": {
                        "title": "Max Pages Per Site",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum pagination pages to follow per start URL.",
                        "default": 5
                    },
                    "fetchDetailPages": {
                        "title": "Fetch Detail Pages",
                        "type": "boolean",
                        "description": "Follow links to individual listing pages for richer data (GPS, full specs, all images). Slower but much better output.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
