# Cian.ru Property Scraper (`parsebird/cian-ru-property-scraper`) Actor

Scrape Cian.ru real estate listings by city, filters, or search URL. Extract price, rooms, area, floor, building, address, metro, coordinates, photos, description and contacts. JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/cian-ru-property-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 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/actors/running/actors-in-store.md#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 Property Scraper

Scrape real estate listings from [Cian.ru](https://www.cian.ru) — Russia's largest property portal — by city, filters, or a pasted search URL. Extract price, rooms, area, floor, building details, full address, metro, coordinates, photos, description and contacts.

<table><tr>
<td style="border-left:4px solid #0468FF;padding:12px 16px;font-weight:600">Search any Russian city or region for flats, rooms, houses, land, commercial or new buildings — filter by deal type, price, rooms and area, or paste a Cian URL and every filter is read straight from it. Export JSON, CSV, Excel.</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/cian-ru-property-scraper — scrapes Cian.ru (cian.ru) property listings through Cian's public search API. Call: ApifyClient("TOKEN").actor("parsebird/cian-ru-property-scraper").call(run_input={"propertyType":"flat","dealType":"sale","locations":["Москва"],"minPrice":5000000,"maxPrice":20000000,"rooms":["1","2"],"sort":"newest","scrapeDetails":true,"maxResults":500,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"RU"}}). Inputs: startUrls[] (Cian search or listing URLs — override the filters), dealType ("sale"|"rent"), propertyType ("flat"|"room"|"house"|"land"|"commercial"|"newbuilding"), locations[] (Russian city/region names in Cyrillic, searched separately), minPrice/maxPrice (RUB), rooms[] ("studio","1".."4","5+"), minArea/maxArea (m²), sort ("newest"|"price_asc"|"price_desc"|"price_per_meter"), scrapeDetails (bool — full row vs lean core row), maxResults (int, you are only charged for returned results). Output per listing: listingId, url, dealType, propertyType, title, price, currency, priceText, pricePerMeter, rooms, totalArea, livingArea, kitchenArea, floor, totalFloors, buildingYear, buildingMaterial, address, region, city, district, metro, metroDistance, latitude, longitude, description, coverImage, images[], imageCount, agentName, agencyName, sellerType, agentPhone, publishedAt, scrapedAt. Any field Cian does not publish comes back null. API docs: https://docs.apify.com/api/v2  Token: https://console.apify.com/settings/integrations
```

### What does Cian.ru Property Scraper do?

Give it a city and filters, or a Cian search URL. The **Cian.ru Property Scraper** queries Cian's own search backend and returns one structured row per listing:

- 🏷️ **Price** — `price` (RUB number), `priceText` ("14 900 000 ₽"), `pricePerMeter`
- 📐 **Size & rooms** — `rooms`, `totalArea`, `livingArea`, `kitchenArea`
- 🏢 **Building** — `floor`, `totalFloors`, `buildingYear`, `buildingMaterial` (panel, brick, monolith, …)
- 📍 **Location** — full `address`, `region`, `city`, `district`, `metro`, `metroDistance`, `latitude`, `longitude`
- 🖼️ **Media & text** — `coverImage`, `images[]`, `imageCount`, full `description`
- 👤 **Contact** — `agentName`, `agencyName`, `sellerType` (agency / owner / developer), `agentPhone`, `publishedAt`

With **`scrapeDetails` off** you get a lean core row (id, URL, deal type, property type, title, price, price text, rooms, total area, address) for fast, lightweight exports. Any field Cian does not publish for a given listing comes back `null` — never a fabricated zero.

### Why scrape Cian.ru?

- **Market analysis** — price, ₽/m² and room-mix trends for any Russian city or district
- **Comps and valuation** — pull recent listings around a subject property with coordinates
- **Lead generation** — active listings with agent, agency and phone
- **Monitoring** — schedule a search and capture new inventory sorted by `newest`
- **Data pipelines** — clean JSON of listings, photos and geodata for your database or map

Run it on a **schedule**, pull results through the **Apify API**, connect it to **Make, Zapier, Google Sheets or Slack**, and export to **JSON, CSV, Excel or HTML**.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | Moscow flats-for-sale URL | Cian search-result or listing URLs. When set, the filters below are ignored — every filter is read from each URL. |
| `dealType` | string | `sale` | `sale` or `rent`. |
| `propertyType` | string | `flat` | `flat`, `room`, `house`, `land`, `commercial`, `newbuilding`. |
| `locations` | array | `[]` | Russian city / region names in Cyrillic (`Москва`, `Санкт-Петербург`, `Новосибирск`, `Московская область`). Each is searched separately. |
| `minPrice` / `maxPrice` | integer | — | Price bounds in Russian rubles. |
| `rooms` | array | `[]` | `studio`, `1`, `2`, `3`, `4`, `5+` (applies to flats and new buildings). |
| `minArea` / `maxArea` | integer | — | Total area bounds in m². |
| `sort` | string | `newest` | `newest`, `price_asc`, `price_desc`, `price_per_meter`. |
| `scrapeDetails` | boolean | `false` | Full detail row vs lean core row. |
| `maxResults` | integer | `100` | Max listings across all searches. You are only charged for returned results. |

#### Examples

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
}
```

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 }
```

### Output example

```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"],
  "imageCount": 24,
  "agentName": "Ирина Смирнова",
  "agencyName": "Этажи",
  "sellerType": "agency",
  "agentPhone": "+74951234567",
  "publishedAt": "2024-05-18T09:42:00",
  "scrapedAt": "2024-05-20T14:03:11Z"
}
```

Download the dataset in JSON, CSV, Excel or HTML from the **Storage** tab or the API.

### How it works

1. Each location name is resolved to a Cian region/city ID; the filters become a Cian search query.
2. The actor pages through Cian's search backend (28 listings per page) and de-duplicates by listing ID.
3. When a single query has more results than Cian's page window allows, the search walks the price axis to keep collecting.
4. `startUrls` skip the filters: search URLs are read for their embedded query, listing URLs are fetched individually.
5. `maxResults` caps the run — you are charged only for the rows returned.

### How much does it cost to scrape Cian.ru?

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `listing` | $0.00129 | $0.00119 | $0.00109 | $0.00099 |

One event per listing returned. **1,000 listings on the Free plan ≈ $1.29**, and ≈ $0.99 on the Gold plan.

### Related actors

- [Trulia Property Scraper](https://apify.com/parsebird/trulia-property-scraper) — US for-sale and rental listings
- [HouseSigma Scraper](https://apify.com/parsebird/housesigma-scraper) — Canadian real estate listings
- [Otodom Scraper](https://apify.com/parsebird/otodom-scraper) — Polish property listings

### FAQ

**Do I need a proxy?**
Cian blocks datacenter IPs. The default is Apify Proxy, RESIDENTIAL group, country RU, which works out of the box.

**How do I target a district, metro station, or street?**
Open that search on Cian, copy the URL, and pass it in `startUrls`. Filters in a URL are always respected exactly.

**How many listings can I get per search?**
A single query returns up to roughly 1,500 listings through Cian's paging. The actor walks the price range to go beyond that; splitting by `locations` or price also helps for very large areas.

**Does `scrapeDetails` cost extra?**
No. It only changes how much of each row is written — full detail row vs lean core row. Both cost one event per listing.

**Can I scrape rentals and new buildings?**
Yes. Set `dealType` to `rent`, or `propertyType` to `newbuilding`, `house`, `land`, `room` or `commercial`.

**Can I schedule it?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-run a `newest`-sorted search and track new listings.

**Something looks wrong.**
Open an issue on the Issues tab with your input and the run URL.

### Legal and compliance

This actor collects publicly available real-estate listing data from Cian.ru search pages. It does not log in, access private accounts, or bypass paywalls. You are responsible for using the exported data in compliance with Cian's terms and applicable laws. Use it for lawful purposes such as market research and analytics. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

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

One or more Cian search-result or individual listing URLs. When supplied, every filter is read straight from each search URL and the Search Filters below are ignored.

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

Find properties for sale or for rent.

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

Property segment to search.

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

Russian cities or regions, e.g. "Москва", "Санкт-Петербург", "Новосибирск", "Московская область". Each is searched separately. For a district, metro, or street, paste a Cian search URL instead.

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

Only include listings at or above this price, in Russian rubles.

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

Only include listings at or below this price, in Russian rubles.

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

Room counts to include (applies to flats and new buildings).

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

Minimum total area, in square meters.

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

Maximum total area, in square meters.

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

Result order.

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

Return the full row (building, metro, coordinates, photos, description, contacts). Off returns a lean core row for fast, lightweight exports.

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

Maximum listings to collect across all searches. You are only charged for returned results.

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

Cian blocks datacenter IPs. The default is Apify Proxy, RESIDENTIAL group, country RU.

## 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": [
    "Москва"
  ],
  "sort": "newest",
  "scrapeDetails": false,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}
```

# Actor output Schema

## `dataset` (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": [
        "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1"
    ],
    "locations": [
        "Москва"
    ],
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "RU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/cian-ru-property-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"],
    "locations": ["Москва"],
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "RU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/cian-ru-property-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"
  ],
  "locations": [
    "Москва"
  ],
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}' |
apify call parsebird/cian-ru-property-scraper --silent --output-dataset

```

## MCP server setup

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