# CIAN.ru Real Estate Scraper — Sale & Rent (`khadinakbar/cian-ru-scraper`) Actor

Scrape public CIAN.ru Russia property listings by search URL or filters (city, rooms, price, sale/rent). Returns price, area, floor, metro, address. Camoufox + Residential RU. No phone unlock. MCP-ready.

- **URL**: https://apify.com/khadinakbar/cian-ru-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 property scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## CIAN.ru Real Estate Scraper — Sale & Rent Listings (Russia)

**CIAN.ru Real Estate Scraper** collects **public** property cards from [CIAN.ru](https://www.cian.ru/) — Russia’s leading classifieds marketplace for buy and rent inventory. Paste a CIAN search or listing URL, or set filters (`dealType`, `location`/`regionId`, `rooms`, price band). Each dataset row includes asking price (RUB), rooms, area m², floor, metro, address, and the canonical listing URL. Runtime is **Camoufox + Apify Residential RU** (plain Chromium/Cheerio receives HTTP 403 WAF). Usable via Apify Console, API, and MCP. **No phone unlock** — only fields visible on public cards.

### Best fit and connected workflows

Use this Actor when the workflow is Russian residential inventory from CIAN.ru:

- Moscow / SPB buy screens with 1–3 room filters and RUB price caps
- Rent lead lists with monthly rent and metro proximity
- URL-driven collection after you already filtered on CIAN.ru
- CRM / spreadsheet import where one flat row per listing is the next step

Related portfolio Actors for neighboring markets:

- Then use [Idealista Scraper](https://apify.com/khadinakbar/idealista-scraper) when the brief needs ES/IT/PT Idealista inventory
- Then use [Immobiliare.it All-in-One Scraper](https://apify.com/khadinakbar/immobiliare-it-all-in-one-scraper) when the brief needs Italy Immobiliare.it inventory
- Then use [Rightmove All-in-One Scraper](https://apify.com/khadinakbar/rightmove-all-in-one-scraper) when the brief needs UK Rightmove inventory

### Practical scenario

Anna is screening **Moscow 1-room flats for sale** under a client budget. She sets `location` to `moscow`, `dealType` to `sale`, `rooms` to `[1]`, and `maxItems` to `10`. The dataset returns `priceRub`, `areaSqm`, `floor`, `metro`, `address`, and `url`. She sorts by ₽/m², shortlists three metro stations, and opens each `url` for photos before sharing a shortlist. Phone numbers stay out of scope — CIAN phone unlock is not part of this Actor.

### Input

Use either `startUrls` **or** filter mode (`location` / `regionId` + `dealType`).

| Field | Type | Purpose |
|---|---|---|
| `startUrls` | array | CIAN search (`cat.php` / filtered search) or listing (`/sale/flat/{id}`, `/rent/flat/{id}`) URLs |
| `dealType` | string | `sale` or `rent` for filter mode |
| `location` | string | City key such as `moscow`, `spb`, `kazan` (mapped to CIAN region id) |
| `regionId` | integer | Numeric CIAN region (1=Moscow, 2=SPB); overrides `location` |
| `rooms` | array | Room counts (1–5, 6=6+, 0/9=studio) |
| `minPrice` / `maxPrice` | integer | RUB filters |
| `propertyType` | string | `flat`, `room`, or `house` |
| `maxItems` | integer | Cap on rows and `property-scraped` charges (prefill 3) |
| `proxyConfiguration` | object | Defaults to Apify RESIDENTIAL country `RU` |

Focused input example (matches quality prefill):

```json
{
  "dealType": "sale",
  "location": "moscow",
  "rooms": [1],
  "propertyType": "flat",
  "maxItems": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "RU"
  }
}
```

### Output

One dataset row per public listing. Download as JSON, CSV, Excel, or HTML from the Output tab.

```json
{
  "cianId": "333184256",
  "url": "https://www.cian.ru/sale/flat/333184256/",
  "dealType": "sale",
  "title": "1-комн. квартира, 39 м², 5/6 этаж",
  "priceRub": 25643000,
  "pricePerSqmRub": 657513,
  "rooms": 1,
  "areaSqm": 39,
  "floor": 5,
  "floorsTotal": 6,
  "metro": "Санино",
  "address": "Москва, ТАО (Троицкий), м. Санино, д. Рогозинино, улица Луговая, 20Вк2",
  "scrapedAt": "2026-09-22T10:00:00.000Z"
}
```

#### Data table

| Field | Description |
|---|---|
| `cianId` | CIAN offer id |
| `url` | Canonical listing URL |
| `dealType` | `sale` or `rent` |
| `priceRub` | Asking price / monthly rent (RUB) |
| `pricePerSqmRub` | ₽/m² when shown |
| `rooms` / `areaSqm` / `floor` | Card specs |
| `metro` / `address` | Location signals from the card |
| `scrapedAt` | ISO-8601 UTC save time |

### How to scrape CIAN.ru

1. Open this Actor in [Apify Console](https://console.apify.com/).
2. Keep the Moscow 1-room sale prefill or paste your own `startUrls` / filters.
3. Leave Residential RU proxy defaults unless you have a reviewed override.
4. Click **Start**. Review the dataset, then schedule or call via API/MCP.

### Pricing

Pay per event + platform usage (passed through to the caller):

| Event | Price |
|---|---|
| `apify-actor-start` | $0.00005 / run start |
| `property-scraped` (primary) | $0.004 / saved listing |

A 3-listing smoke run is about **$0.012** in events plus Residential browser usage. See the live **Pricing** tab for the authoritative schedule.

### Best results

- Prefer **Residential RU**; datacenter and plain HTTP hit `cian_waf_block`.
- Keep `maxItems` small for quality tests (≤3) so runs finish under 5 minutes.
- Use `startUrls` when you already built a CIAN search with districts/metro.
- Expect `VALID_EMPTY` for over-constrained filters, `INVALID_INPUT` for empty location, and `UPSTREAM_FAILED` when WAF blocks every attempt.

### API / MCP

```bash
apify call khadinakbar/cian-ru-scraper -i '{
  "dealType": "sale",
  "location": "moscow",
  "rooms": [1],
  "maxItems": 3
}'
```

MCP tool name after publication: `apify--cian-ru-scraper`.

#### Agent prompt card

> Scrape 5 Moscow 1-room flats for sale from CIAN.ru under 20M RUB. Return priceRub, areaSqm, metro, address, url. Do not unlock phones.

### FAQ and responsible use

- **Is phone scraping included?** No. Only public card fields.
- **Why Camoufox?** CIAN’s WAF returns 403 for Cheerio/plain Chromium; Camoufox + Residential RU is the verified path.
- **Legal / ToS:** You are responsible for complying with CIAN.ru terms, applicable law, and personal-data rules. This Actor is for legitimate research and lead workflows on **public** listings.
- **Support:** Use the Issues tab on the Actor page.

### Builder’s note

Local probes confirmed `[data-name="CardComponent"]` holds full price/rooms/area/floor/metro/address text, while bare HTTP returns `cian_waf_block`. Camoufox `geoip` must stay `false` on Apify Residential RU or launch aborts.

# Actor input Schema

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

CIAN search URLs (cat.php or filtered search) or listing URLs (/sale/flat/{id}, /rent/flat/{id}). When set, filter fields are ignored for discovery.

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

Sale (buy) or rent for filter mode.

## `location` (type: `string`):

City or region name mapped to a CIAN region id (moscow, spb, kazan, …) or a numeric region id as text. Required for filter mode when regionId is empty.

## `regionId` (type: `integer`):

Numeric CIAN region id (1=Moscow, 2=Saint Petersburg). Overrides location when set.

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

Room counts to include as strings: "1"–"5", "6" for 6+, "0" or "9" for studio. Prefill is 1-room flats.

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

Lowest price in RUB (sale price or monthly rent).

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

Highest price in RUB (sale price or monthly rent).

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

flat (квартира), room (комната), or house/suburban.

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

Maximum properties to save and charge. Prefill 3 keeps the quality test under 5 minutes.

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

Defaults to Apify RESIDENTIAL country RU. Datacenter/plain Chromium hits CIAN WAF 403.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1&room1=1&p=1"
    }
  ],
  "dealType": "sale",
  "location": "moscow",
  "regionId": 1,
  "rooms": [
    "1"
  ],
  "minPrice": 3000000,
  "maxPrice": 15000000,
  "propertyType": "flat",
  "maxItems": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every scraped public CIAN.ru listing row.

## `output` (type: `string`):

Compact terminal contract with outcome, itemsPushed, and chargedEventCounts.

## `runSummary` (type: `string`):

Detailed run diagnostics including pagesScraped and billing counters.

# 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 = {
    "dealType": "sale",
    "location": "moscow",
    "rooms": [
        "1"
    ],
    "propertyType": "flat",
    "maxItems": 3,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "RU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "dealType": "sale",
    "location": "moscow",
    "rooms": ["1"],
    "propertyType": "flat",
    "maxItems": 3,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "RU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/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 '{
  "dealType": "sale",
  "location": "moscow",
  "rooms": [
    "1"
  ],
  "propertyType": "flat",
  "maxItems": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}' |
apify call khadinakbar/cian-ru-scraper --silent --output-dataset

```

## MCP server setup

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