Cian RU - Property Listings, Search Filters & URLs
Pricing
from $1.50 / 1,000 dataset items
Cian RU - Property Listings, Search Filters & URLs
Collect property listings from Cian.ru by search filters or direct URLs. Returns structured rows with listing URL, title, price, address, rooms, area, floors, photos, visible contact fields, coordinates when available, and optional detail-page enrichment.
Pricing
from $1.50 / 1,000 dataset items
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
36
Total users
9
Monthly active users
12 days ago
Last modified
Categories
Share
CIAN Scraper: Property Listings, Prices, Photos & Contacts
CIAN Scraper turns CIAN (Cian.ru), Russia's largest real estate listing site, into a clean property data feed. Collect apartment, room, house, new building and commercial listings for sale or rent, with prices, addresses, room counts, floor and building details, coordinates, photos, descriptions and contact phone numbers included on every row. Search by location and filters, or paste Cian search result links directly, then export to JSON, CSV or Excel, or read the results through the API.
Why This Scraper?
- Two ways in. Search by location and filters, or paste Cian search result URLs directly.
- Every row comes ready to use. Price, address, rooms, area, floor, coordinates, photos, description and contact phone numbers are included on every saved listing, no extra step.
- An optional detail step. Turn on Fetch listing details for fields that only live on the listing page itself: agent and agency identity, a running view count, BTI-verified build year, renovation type, and more.
- Covers the whole market. Flats, rooms, houses, new buildings, and commercial categories, for sale or for rent.
- Built for monitoring. Resume one interrupted crawl, or track a saved search across a schedule and get back only what changed.
- A power-user escape hatch. Pass Cian's own raw filter fields when the built-in filters aren't enough.
- Fails loudly instead of guessing. If nothing could be read or matched, the run stops with a clear message instead of quietly returning an empty dataset.
Use Cases
- Real estate agencies and brokers: build and refresh a listings feed for a market segment, building complex, or client search.
- Price and market research: track price per square meter, floor, and room count trends across districts and cities.
- Property investment monitoring: watch a saved search over time and get back only the new, updated, or delisted properties.
- Lead generation and outreach: collect agent and agency names alongside contact phone numbers and listing details.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | 123456789 |
url | Cian link to the listing |
title | "2-комн. кв., 54 м², 5/9 эт." |
jkName | "ЖК Северный" (new building complex name, when the listing belongs to one) |
price / priceValue | "12 500 000 ₽" / 12500000 |
pricePerMeter / currency | 231481 / "rur" |
address | "Москва, Пресненский р-н, ул. Ленина, 10" |
district / metro / metroTime | "Пресненский" / "Баррикадная" / 7 |
roomsCount | 2 |
totalArea / livingArea / kitchenArea | 54 / 32 / 10 |
floorNumber / floorsCount | 5 / 9 |
buildYear / materialType | 2015 / "monolith" |
dealType / category / offerType | "sale" / "flatSale" / "flat" |
isFromDeveloper / isPremium | false / false |
phoneNumbers | ["+79991234567"] |
latitude / longitude | 55.7601 / 37.6103 |
description | "Просторная квартира с ремонтом, рядом метро" |
imageUrls | array of photo links |
creationDate / addedLabel | "2026-09-20T10:00:00+03:00" / "вчера, 14:40" |
scrapedAt | "2026-09-28T08:00:00.000Z" |
When Fetch listing details is on, a successfully enriched row also carries agentName, agentCompanyName, agentType, agentIsPro, agentOffersCount, agentAvatarUrl, viewsTotal, viewsToday, houseBuildYear (BTI-verified, often populated when the search card's own buildYear is empty), houseEntrances, houseFlatCount, houseLiftsTotal, houseHeatSupplyType, houseGasSupplyType, houseIsEmergency, repairType, windowsViewType, balconiesCount, bathroomsCombined, bathroomsSeparate, parkingType, amenities, and a detailStatus of ok. When a detail fetch fails, that row still ships with detailStatus: "skipped" and no extra fields, at no extra charge. Incremental mode adds changeType, changedFields, firstSeenAt and lastSeenAt to every row, only when it is switched on.
How to Use
- Pick a mode:
search(location and filters) orurl(paste Cian search-result links). - For search mode, set Location, Operation, Category, and any of the price, area, floor, or room filters you need.
- Set Max items to control run size and cost, and turn on Fetch listing details if you need agent info, view counts, or BTI-verified building data.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search Moscow flats for sale under 15,000,000 RUB:
{"mode": "search","location": "Москва","operationType": "sale","category": "flatSale","rooms": ["2"],"maxPrice": 15000000,"maxItems": 50}
Paste a Cian search-result URL:
{"mode": "url","urls": ["https://www.cian.ru/kupit-kvartiru/"],"maxItems": 100}
Saint Petersburg rentals with full listing details:
{"mode": "search","location": "Санкт-Петербург","operationType": "rent","category": "flatRent","fetchDetails": true,"maxItems": 30}
Power-user filter using Cian's own raw query field:
{"mode": "search","location": "Москва","operationType": "sale","advancedFilters": { "repair": { "type": "terms", "value": [2, 3] } },"maxItems": 20}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/cian-ru-scraper").call(run_input={"mode": "search", "location": "Москва", "operationType": "sale", "maxItems": 50})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/cian-ru-scraper').call({ mode: 'search', location: 'Москва', operationType: 'sale', maxItems: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Fetch listing details
fetchDetails loads each saved listing's own page for fields the search results don't carry: agent and agency identity, a running view counter, BTI-verified build year, renovation type, window view, balcony and bathroom counts, parking type, and amenities. It runs only on rows already selected to be saved, after any incremental suppression and the Max items cap, so a suppressed or capped-off listing is never fetched or charged for. It is billed as a detail-enrichment charge, only for listings whose detail page was actually read successfully; a failed detail fetch still returns the base row (with detailStatus: "skipped") at no extra charge.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted crawl: paste its run or dataset ID and this run skips every listing id already saved there, appending only new ones. - Incremental mode (
incrementalMode) is for scheduled runs over the same saved search. Each listing is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(only after a run that scanned the entire tracked search, and only withemitExpired).stateKeynames or shares the stored baseline; leave it empty and identical searches share one automatically, while different ones never mix. With incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search for filters, or url for pasted Cian links. |
urls | array | (none) | Cian search-result URLs (encode filters in the URL). URL mode only; the search filters below are ignored in this mode. |
location | string | (none) | Search mode only. Moscow or Saint Petersburg by name (Russian or English). For any other region, set regionId; unrecognized text falls back to Moscow. |
regionId | integer | (none) | Search mode only. Cian region ID. Moscow is 1, Saint Petersburg is 2. Left empty, it resolves from Location when possible, otherwise Moscow (1). |
operationType | string | sale | Search mode only. Deal type: sale or rent. |
category | string | "" (Any) | Search mode only. Listing category, or Any to let operation and property type decide. |
sort | string | default | Search mode only. Sort results when supported by the selected source. |
rooms | array | (none) | Search mode only. Room counts for flats and rooms. |
includeStudio | boolean | false | Search mode only. Include studio listings together with the selected room counts. |
minPrice | integer | (none) | Search mode only. Minimum price in rubles. |
maxPrice | integer | (none) | Search mode only. Maximum price in rubles. |
minArea | integer | (none) | Search mode only. Minimum total area in square meters. |
maxArea | integer | (none) | Search mode only. Maximum total area in square meters. |
minFloor | integer | (none) | Search mode only. Minimum floor. |
maxFloor | integer | (none) | Search mode only. Maximum floor. |
minFloors | integer | (none) | Search mode only. Minimum floors in the building. |
maxFloors | integer | (none) | Search mode only. Maximum floors in the building. |
advancedFilters | object | (none) | Search mode only. Raw Cian query objects merged into the search, for power users who know Cian's own query field names. |
maxItems | integer | 20 | Maximum matching rows to save. Fewer rows can be returned when the selected source and filters match fewer live records. |
maxPages | integer | 0 | No page limit when set to 0. The run still stops at Max items. |
fetchDetails | boolean | false | Load each saved listing's own detail page for richer fields not on the search card. Billed as a detail-enrichment charge. |
proxy | object | Apify Proxy | Connection settings. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
resumeFromRunId | string | (none) | Continue one interrupted crawl: paste a previous run ID (or dataset ID) and this run skips listings it already saved. |
incrementalMode | boolean | false | Remember this search's results between scheduled runs and report only what changed. |
stateKey | string | (none) | Incremental mode only. Optional manual key identifying this tracked search. Left empty, one is derived automatically from mode, filters, and URLs. |
emitUnchanged | boolean | false | Incremental mode only. Also save (and charge for) listings that did not change since the last run. |
emitExpired | boolean | false | Incremental mode only. Also save (and charge for) a row for previously tracked listings no longer found, marked changeType: "EXPIRED". Only fires after a run that scanned the full tracked search. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": 123456789,"url": "https://www.cian.ru/sale/flat/123456789/","sourceUrl": "https://www.cian.ru/sale/flat/123456789/","title": "2-комн. кв., 54 м², 5/9 эт.","jkName": null,"price": "12 500 000 ₽","priceValue": 12500000,"pricePerMeter": 231481,"currency": "rur","address": "Москва, Пресненский р-н, ул. Ленина, 10","district": "Пресненский","metro": "Баррикадная","metroTime": 7,"roomsCount": 2,"totalArea": 54,"livingArea": 32,"kitchenArea": 10,"floorNumber": 5,"floorsCount": 9,"buildYear": 2015,"materialType": "monolith","dealType": "sale","category": "flatSale","offerType": "flat","isFromDeveloper": false,"isPremium": false,"phoneNumbers": ["+79991234567"],"latitude": 55.7601,"longitude": 37.6103,"description": "Просторная квартира с ремонтом, рядом метро","imageUrls": ["https://img.cian.site/a.jpg", "https://img.cian.site/b.jpg"],"creationDate": "2026-09-20T10:00:00+03:00","addedLabel": "вчера, 14:40","scrapedAt": "2026-09-28T08:00:00.000Z"}
Plan Requirement
The actor uses a residential proxy group by default, which works out of the box on every plan. If you still see access checks, try a different proxy group under Connection.
FAQ
How much does it cost?
You pay per saved record, plus a one-time charge when a run starts. Turning on Fetch listing details adds a detail-enrichment charge for each listing whose detail page was actually read. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape CIAN?
This actor collects only publicly available real estate listings. You are responsible for how you use it: follow CIAN's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Contact phone numbers are published by listers and agents as part of the public listing; handle them under the privacy and telecom laws that apply to you.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then classifies every listing as new, updated, unchanged, reappeared, or expired against the previous run of the same search, and unchanged listings are not billed unless you turn that on too.
What is the difference between Resume from run and Incremental mode?
Resume from run continues ONE specific interrupted crawl: it skips listing ids already saved in a past run's dataset so that run can finish without duplicates. Incremental mode is for a recurring, scheduled search: it keeps its own state between separate runs and reports what changed each time. They can combine to bootstrap a monitoring baseline from an interrupted crawl's dataset, but not once that baseline already has tracked listings, in which case the run stops with a message asking you to remove Resume from run or set a different State key.
Why did my run fail instead of returning an empty dataset?
A run fails when it cannot read the site at all after several attempts, when none of the pasted URLs could be read, or when the search matched no listings whatsoever, since the actor treats a completely empty result as indistinguishable from a blocked run and stops with a clear message rather than guessing. Run it again, try broader filters, or try a different region. The one case where a successful run can still save nothing is Incremental mode finding every previously tracked listing unchanged.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, Airtable, or Apify.
🔗 Want more real estate data?
Pair this actor with these related scrapers from the same team:
| 🏠 Domclick RU Property Scraper Extract property listings from domclick.ru, one of Russia’s largest real estate portals... | 🏷️ Avito.ru Scraper From $1/1K. Scrape structured listings from Avito.ru by region, category, filters, or... |
| 🛒 Ozon.ru Scraper Extract structured product data from Ozon.ru, Russia’s largest marketplace. Search by... | 🏷️ Wildberries Scraper Scrape Wildberries marketplace: product search with prices (wallet vs retail), discounts... |
| 💼 HH.ru Jobs Scraper From $1/1K. Scrape HH.ru job listings with 50+ structured fields. Search by filters or... | 🧩 Pikabu Scraper Scrape Pikabu (Пикабу): keyword search, hot/new/best feeds, communities, tags, full story... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.