# Cian.ru Real Estate Scraper (`solidcode/cian-ru-scraper`) Actor

\[💰 $1.2 / 1K] Extract Russian real estate listings from Cian.ru (Циан) — apartments, rooms, houses, land, commercial, and new buildings for sale or rent. Get price, rooms, area, floor, address, geo, building specs, description, photos, and agent contact. Search by city, or paste any Cian URL.

- **URL**: https://apify.com/solidcode/cian-ru-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **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/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

## Cian.ru Scraper

Pull Russian real estate listings from Cian.ru (Циан) at scale — apartments, rooms, houses, land, commercial units, and new builds, for sale or rent, each with price in rubles, full address, map coordinates, photo galleries, and agent phone numbers. Search by Russian city or region name in Cyrillic, or paste a Cian search URL you already built on the site to reach any district, metro station, or advanced filter. Built for real estate analysts, property investors, and relocation and lead-generation teams who need fresh Cian data without copy-pasting listings by hand.

### Why This Scraper?

- **All 6 Cian property segments** — apartments (flats), rooms, houses and suburban, land plots, commercial units, and new buildings, each searchable for **sale or rent** in a single run.
- **Agent and agency contact on every listing** — agent name, agency name, seller type (agency / owner / developer), and the exposed phone number, so leads land ready to call.
- **Up to ~48 photos per listing** — the full gallery URLs plus a cover image and an exact photo count, not just a thumbnail.
- **Map-ready geo on every row** — latitude and longitude, nearest metro station, and walk time to metro, alongside the full Cyrillic address, region, city, and district.
- **Studio through 5+ room filters** — combine studio, 1, 2, 3, 4, and 5+ room counts in one search across apartments, rooms, and houses.
- **Price in rubles plus human-readable price text** — a clean numeric `price`, the raw display string, and a computed price-per-square-meter for instant comps.
- **4 sort orders** — newest first, price low to high, price high to low, and price per square meter, so you collect the most relevant listings first.
- **Paste a Cian URL or search in Cyrillic** — drop in any search page you built on the site to inherit its filters, including a specific district, metro station, or street, or type a city or region like "Москва" or "Санкт-Петербург" and let the scraper resolve it.
- **Up to 10,000 listings per run** — multi-location searches run each city or region separately, and a lightweight core-fields mode speeds up large exports.

### Use Cases

**Market Research**

- Track asking prices and price-per-square-meter across Moscow, St. Petersburg, and regional cities.
- Compare sale versus rent inventory by district and metro line.
- Measure listing supply by property segment — flats versus houses versus commercial.

**Investment Analysis**

- Build comparable-sales tables from live price, area, and floor data.
- Screen new-building inventory for pre-sale opportunities.
- Filter by budget and total area to shortlist yield candidates in one pass.

**Lead Generation**

- Collect agent and agency contacts, including phone numbers, from active listings.
- Segment leads by seller type — agencies, private owners, or developers.
- Build outreach lists scoped to a single city, district, or metro station.

**Relocation & Housing Search**

- Pull rentals near a specific metro station with walk-time filters.
- Compare neighborhoods by price, room count, and building age.
- Assemble a shortlist of apartments with full descriptions and photo galleries.

**Price Monitoring**

- Re-run saved searches to watch how asking prices move over time.
- Monitor a district for new listings sorted newest-first.
- Alert on properties entering a target price band.

### Getting Started

#### Search one city

```json
{
  "propertyType": "flat",
  "dealType": "sale",
  "locations": ["Москва"],
  "maxResults": 100
}
```

#### Filtered rental search

```json
{
  "propertyType": "flat",
  "dealType": "rent",
  "locations": ["Санкт-Петербург"],
  "rooms": ["1", "2"],
  "minPrice": 30000,
  "maxPrice": 80000,
  "sort": "newest",
  "maxResults": 500
}
```

#### Advanced multi-location search

```json
{
  "propertyType": "house",
  "dealType": "sale",
  "locations": ["Москва", "Московская область"],
  "minPrice": 5000000,
  "maxPrice": 25000000,
  "minArea": 80,
  "maxArea": 250,
  "sort": "price_asc",
  "scrapeDetails": true,
  "maxResults": 2000
}
```

#### Paste a Cian URL

```json
{
  "startUrls": [
    "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"
  ],
  "maxResults": 1000
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `["https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"]` | One or more Cian search-result or individual listing URLs. Every filter is read straight from each search URL, so the Search Filters are ignored when URLs are supplied. |

#### Search Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dealType` | string | `"sale"` | Whether to find properties **For sale** or **For rent**. |
| `propertyType` | string | `"flat"` | Property segment: **Apartment / flat**, **Room**, **House / suburban**, **Land plot**, **Commercial**, or **New building**. |
| `locations` | array | `[]` | Russian cities or regions to search, e.g. `"Москва"`, `"Санкт-Петербург"`, `"Новосибирск"`, `"Московская область"`. Each location is searched separately. To target a specific district, metro station, or street, paste a Cian search URL instead. |

#### Price, Rooms & Size

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `minPrice` | integer | empty | Only include listings at or above this price, in Russian rubles. |
| `maxPrice` | integer | empty | Only include listings at or below this price, in Russian rubles. |
| `rooms` | array | `[]` | Room counts to include (applies to homes, not land or commercial): **Studio**, **1 room**, **2 rooms**, **3 rooms**, **4 rooms**, **5+ rooms**. |
| `minArea` | integer | empty | Minimum total area, in square meters. |
| `maxArea` | integer | empty | Maximum total area, in square meters. |
| `sort` | string | `"newest"` | Result order: **Newest first**, **Price: low to high**, **Price: high to low**, or **Price per m²**. |

#### Output

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `scrapeDetails` | boolean | `true` | Include full data for every listing (description, full gallery, coordinates, building specs, metro, agent contact). Turn off for a lighter export with just the core fields. |
| `maxResults` | integer | `100` | Maximum listings to collect across all URLs and searches. Set to `0` for as many as possible (up to a built-in cap of 10,000). |

### Output

Each listing is one row. With `scrapeDetails` on you get the full row below; with it off you get a lean core row (ID, URL, deal type, property type, title, price, price text, rooms, total area, and address) for fast, lightweight exports.

```json
{
  "listingId": "302345678",
  "url": "https://www.cian.ru/sale/flat/302345678/",
  "dealType": "sale",
  "propertyType": "flat",
  "title": "2-комн. кв., 54,3 м², 5/12 этаж",
  "price": 14900000,
  "currency": "RUB",
  "priceText": "14 900 000 ₽",
  "pricePerMeter": 274401,
  "rooms": 2,
  "totalArea": 54.3,
  "livingArea": 30.1,
  "kitchenArea": 9.5,
  "floor": 5,
  "totalFloors": 12,
  "buildingYear": 2008,
  "buildingMaterial": "monolith",
  "address": "Москва, ЦАО, р-н Хамовники, ул. Льва Толстого, 16",
  "region": "Москва",
  "city": "Москва",
  "district": "Хамовники",
  "metro": "Парк культуры",
  "metroDistance": "7 мин. пешком",
  "latitude": 55.735124,
  "longitude": 37.587891,
  "description": "Продается светлая двухкомнатная квартира в тихом центре...",
  "coverImage": "https://images.cdn-cian.ru/images/2345678901-1.jpg",
  "images": [
    "https://images.cdn-cian.ru/images/2345678901-1.jpg",
    "https://images.cdn-cian.ru/images/2345678901-2.jpg"
  ],
  "imageCount": 24,
  "agentName": "Ирина Смирнова",
  "agencyName": "Этажи",
  "sellerType": "agency",
  "agentPhone": "+74951234567",
  "publishedAt": "2024-05-18T09:42:00",
  "scrapedAt": "2024-05-20T14:03:11Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Cian offer ID. |
| `url` | string | Canonical listing URL. |
| `dealType` | string | `sale` or `rent`. |
| `propertyType` | string | `flat`, `room`, `house`, `land`, `commercial`, or `newbuilding`. |
| `title` | string | Listing title (Cyrillic). |
| `scrapedAt` | string | Collection timestamp (ISO). |

#### Pricing

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Price in Russian rubles. |
| `currency` | string | Currency code (`RUB`). |
| `priceText` | string | Human-readable price display string. |
| `pricePerMeter` | number | Price per square meter, computed from price and area. |

#### Size & Rooms

| Field | Type | Description |
|-------|------|-------------|
| `rooms` | integer | Room count (null for studios, land, and commercial). |
| `totalArea` | number | Total area, m². |
| `livingArea` | number | Living area, m². |
| `kitchenArea` | number | Kitchen area, m². |

#### Building & Location

| Field | Type | Description |
|-------|------|-------------|
| `floor` | integer | Floor number. |
| `totalFloors` | integer | Total floors in the building. |
| `buildingYear` | integer | Year the building was built. |
| `buildingMaterial` | string | Building material (panel, brick, monolith, etc.). |
| `address` | string | Full address (Cyrillic). |
| `region` | string | Region / oblast. |
| `city` | string | City. |
| `district` | string | District. |
| `metro` | string | Nearest metro station. |
| `metroDistance` | string | Walk or transport time to metro. |
| `latitude` | number | Latitude. |
| `longitude` | number | Longitude. |

#### Media, Description & Contact

| Field | Type | Description |
|-------|------|-------------|
| `description` | string | Full listing description (Cyrillic). |
| `coverImage` | string | Cover photo URL. |
| `images` | array | Full photo gallery URLs. |
| `imageCount` | integer | Number of photos. |
| `agentName` | string | Agent or contact name. |
| `agencyName` | string | Agency name. |
| `sellerType` | string | `agency`, `owner`, or `developer`. |
| `agentPhone` | string | Contact phone number when exposed. |
| `publishedAt` | string | Publish / update timestamp. |

### Tips for Best Results

- **Paste a fully-filtered Cian URL to reach advanced facets not offered as inputs.** Build your search on cian.ru with ceiling height, repair status, building class, or MCAD distance, then paste that URL — every facet encoded in it is honored.
- **Type city or region names in Cyrillic.** Use `"Москва"`, `"Санкт-Петербург"`, `"Новосибирск"`, or `"Московская область"`; the scraper resolves the Russian name to the correct Cian region automatically. For a specific district, metro station, or street, build that search on cian.ru and paste its URL instead.
- **Turn off Include Full Details for fast, lightweight exports.** The lean mode returns just the core fields (ID, URL, price, rooms, area, address, deal and property type) and is ideal for quick price sweeps or large pulls.
- **List multiple locations to compare markets in one run.** Each city or region is searched separately, so `["Москва", "Московская область"]` returns both in a single dataset.
- **Start with a small `maxResults` (10–50) to preview results, then scale up.** Set `maxResults` to `0` to collect everything up to the 10,000-listing cap.
- **Use "Price: high to low" to surface the most expensive inventory first.** This ordering is applied to your collected results, so keep `maxResults` generous when you need a complete high-to-low ranking.
- **`buildingYear` is filled for older stock; new builds carry a completion deadline instead** — expect it populated on roughly a quarter of central Moscow flats, which is normal for listings without a stated construction year.

### Pricing

**From $1.20 per 1,000 results** — undercuts the leading Cian scraper while covering every property segment. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.14 | $0.135 | $0.13 | $0.12 |
| 1,000 | $1.40 | $1.35 | $1.30 | $1.20 |
| 10,000 | $14.00 | $13.50 | $13.00 | $12.00 |
| 100,000 | $140.00 | $135.00 | $130.00 | $120.00 |

A "result" is one listing row pushed to your dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom workflows on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This scraper collects publicly available real estate listings for legitimate research, analysis, and lead-generation purposes. You are responsible for using the collected data in compliance with Cian.ru's terms of service, applicable data-protection laws, and any regulations governing personal data and contact information in your jurisdiction. Do not use extracted contact details for unsolicited communication where prohibited, and respect all applicable rules on the storage and processing of personal data.

# Actor input Schema

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

Paste one or more Cian.ru URLs — either search-result pages (e.g. a page you built on cian.ru after choosing filters) or individual listing pages (e.g. https://www.cian.ru/sale/flat/...). The scraper reads every filter straight from each search URL, so the Search Filters below are ignored for these. Use this when you already built a search on the site.

## `dealType` (type: `string`):

Whether to find properties for sale or for rent. Only applies when you build a search below (not when pasting URLs).

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

Which property segment to search. Apartments (flats) is the most common. Rooms filter applies to residential only.

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

Where to search, at city or region level. Enter a Russian city or region — for example 'Москва' (Moscow), 'Санкт-Петербург' (St. Petersburg), 'Новосибирск', or 'Московская область'. Each location is searched separately. To narrow to a specific district, metro station, or street, build that search on cian.ru and paste its URL into the Cian URLs field above. Leave empty when you are pasting URLs.

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

Only include listings at or above this price, in Russian rubles. Leave empty for no minimum.

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

Only include listings at or below this price, in Russian rubles. Leave empty for no maximum.

## `rooms` (type: `array`):

Only include listings with these room counts (applies to residential property only). Leave empty for any.

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

Only include listings with at least this much total area, in square meters. Leave empty for no minimum.

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

Only include listings with at most this much total area, in square meters. Leave empty for no maximum.

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

Order in which to collect listings. 'Newest first', 'Price: low to high', and 'Price per m²' are ordered by the site; 'Price: high to low' is applied to the collected results. Only applies when you build a search below (not when pasting URLs).

## `scrapeDetails` (type: `boolean`):

Include the full data for every listing: complete description, the whole photo gallery, map coordinates, building specifications (year, material, floors), nearest metro, and agent / agency contact. Turn off for a lighter export with just the core fields — ID, URL, price, rooms, area, address, deal type, and property type.

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

Total number of listings to collect across every location and URL combined (a global cap, not per location). When you enter several locations, this total is shared fairly between them so each one is searched. Set to 0 for as many as possible (up to a built-in safety cap of 10,000). Tip: start with 10-50 to test, then increase.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"
  ],
  "dealType": "sale",
  "propertyType": "flat",
  "locations": [],
  "rooms": [],
  "sort": "newest",
  "scrapeDetails": true,
  "maxResults": 100
}
```

# Actor output Schema

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

Table of scraped property listings with key fields — title, price, deal type, property type, rooms, area, city, and URL.

## `details` (type: `string`):

Full per-listing fields including description, photos, coordinates, building specs, agent / agency contact, and timestamps.

# 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.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"
    ],
    "dealType": "sale",
    "propertyType": "flat",
    "locations": [],
    "rooms": [],
    "sort": "newest",
    "scrapeDetails": true,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/cian-ru-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.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"],
    "dealType": "sale",
    "propertyType": "flat",
    "locations": [],
    "rooms": [],
    "sort": "newest",
    "scrapeDetails": True,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/cian-ru-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.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"
  ],
  "dealType": "sale",
  "propertyType": "flat",
  "locations": [],
  "rooms": [],
  "sort": "newest",
  "scrapeDetails": true,
  "maxResults": 100
}' |
apify call solidcode/cian-ru-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/cian-ru-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/7ELEk2blJV9v83hTk/builds/YFTqqWHnZWjNef2GR/openapi.json
