Domclick RU Property Scraper - Listings, Prices & Agent Data
Pricing
from $1.50 / 1,000 listing results
Domclick RU Property Scraper - Listings, Prices & Agent Data
Extract property listings from domclick.ru, one of Russia’s largest real estate portals. Search by city or use listing/search URLs. Returns 70+ fields including price, area, rooms, floor, address, GPS, metro info, photos, seller and agency details, developer data, discounts, and mortgage flags.
Pricing
from $1.50 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
8
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Domclick Property Scraper
Pull structured property data from Domclick, one of the largest property portals in Russia, in seconds. Search by city with rich filters, or paste any Domclick search or listing link and the scraper walks results forward. Every listing comes back as a flat JSON record with 70+ fields: price, price per square meter, area, rooms, floor, build year, full address, GPS, metro stations with walking time, the full photo gallery, the seller description, seller and agency details, verification badges, new building and developer info, discounts, and mortgage flags. Turn on extra details for a market valuation estimate, nearby places, and agent deal stats.
Why this scraper
- 70+ fields per listing, far more than most alternatives expose
- Two modes: build a search from filters, or paste search and listing URLs verbatim
- All of Russia: any city or region, resolved automatically from its name
- Sale and rent, residential, commercial, and garage categories
- Filter by rooms, price, area, floor, and sort seven ways, all applied server side so counts stay accurate
- Optional extra details: market valuation estimate (low / mid / high), nearby places, and agent deal history
- Fast and inexpensive: an optimized data path keeps runs quick and light on proxy usage
Data you get
Sample shape, values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
| id | 0000000000 |
| url | https://domclick.ru/card/sale__flat__0000000000 |
| dealType | sale |
| offerType | flat |
| price | 34999000 |
| squarePrice | 466653 |
| currency | RUB |
| area | 75 |
| rooms | 2 |
| floor | 14 |
| totalFloors | 17 |
| buildYear | 2026 |
| isApartment | false |
| address | Москва, набережная Примерная, 1 к1 |
| latitude | 55.0000 |
| longitude | 37.0000 |
| nearestSubway | Технопарк |
| subwayWalkMinutes | 12 |
| subways | [{ "name": "Технопарк", "walkMinutes": 12, "lineColors": ["#3EA332"] }] |
| description | Full seller description text appears here. |
| photoCount | 11 |
| photos | ["https://img.dmclk.ru/vitrina/owner/00/00/000.jpg"] |
| complexName | Sample Complex |
| buildingEndYear | 2026 |
| buildingPath | https://msk.domclick.ru/building/sample-building |
| localityPath | https://msk.domclick.ru/sample-district |
| subdomain | msk |
| sellerName | Agent Name |
| sellerCasId | 0000000 |
| isAgency | true |
| companyName | Sample Company |
| companyFiasId | 00000000-0000-0000-0000-000000000000 |
| isRosreestrApproved | true |
| isSberCollateral | false |
| hasDiscount | true |
| discountValue | 0 |
| hasFamilyMortgage | true |
| publishedDate | 2026-01-01T00:00:00+00:00 |
| marketPrice | 30280000 |
| minMarketPrice | 25740000 |
| maxMarketPrice | 34820000 |
| agentDealsCompleted | 31 |
| poiCount | 50 |
The full seller and agency block is also passed through verbatim as sellerRaw so no upstream field is ever dropped.
How to use
Search one city:
{"mode": "search","locations": ["Москва"],"dealType": "sale","category": "living","offerType": "flat","maxListings": 100}
Search with filters:
{"mode": "search","locations": ["Санкт-Петербург"],"dealType": "sale","rooms": ["2", "3"],"minPrice": 10000000,"maxPrice": 25000000,"minArea": 50,"sortBy": "price_asc","maxListings": 200}
Multiple cities with extra details (valuation, nearby places, agent stats):
{"mode": "search","locations": ["Москва", "Сочи", "Казань"],"fetchDetails": true,"maxPages": 3}
Paste URLs:
{"mode": "url","urls": ["https://domclick.ru/search?deal_type=rent&category=living&offer_type=flat&address=1d1463ae-c80f-4d19-9331-a1b68a85b553","https://domclick.ru/card/sale__flat__0000000000"],"maxListings": 50}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | search | search builds a query from filters; url reads pasted links |
| locations | array | ["Москва"] | City or region names, or address GUIDs. Search mode only |
| dealType | string | sale | sale or rent |
| category | string | living | living, commercial, or garage |
| offerType | string | flat | flat or layout (new building plan) |
| rooms | array | [] | Any of studio, 1, 2, 3, 4+ |
| minPrice / maxPrice | integer | none | Price range in rubles |
| minArea / maxArea | integer | none | Area range in square meters |
| minFloor / maxFloor | integer | none | Floor range |
| sortBy | string | relevance | relevance, newest, updated, price_asc, price_desc, price_per_m2_asc, price_per_m2_desc |
| urls | array | none | Domclick search or listing links. URL mode only |
| fetchDetails | boolean | false | Add valuation estimate, nearby places, agent stats (loads each card page; slower) |
| maxPages | integer | (empty) | Result pages per city or URL, about 30 listings each. Leave empty to walk every result page (the item cap and end-of-catalogue detection still bound the run). |
| maxListings | integer | 20 | Overall cap across all targets. 0 means unlimited. |
| proxy | object | Residential RU | Proxy configuration |
| resumeFromRunId | string | (empty) | A previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by id) are skipped, so this run only saves the new ones. |
| incrementalMode | boolean | false | Recurring monitoring: remembers the previous run of the same search and only returns changed listings on later runs. See "Incremental mode" below. |
| stateKey | string | (empty) | Only used with incrementalMode. Identifies the saved baseline. Leave empty to derive it automatically from your search filters. |
| emitUnchanged | boolean | false | Only used with incrementalMode. Also return (and bill) listings with no changes, marked changeType: UNCHANGED. |
| emitExpired | boolean | false | Only used with incrementalMode. Also return (and bill) a row for a listing that's no longer found, marked changeType: EXPIRED. Only fires after a complete, uncapped, non-resumed scan. |
Resuming a full-catalogue walk
For an unbounded pull (maxPages empty, maxListings: 0), two things protect a long run:
resumeFromRunIdlets you continue in a brand-new run: paste the ID of a previous run (or its dataset), and this run skips every listingidalready saved there, appending only new listings.- A checkpoint is saved automatically as the run progresses. If the run is interrupted by an Apify platform migration or you click Resurrect on a failed run, it picks back up from where it left off in the same run, without re-saving (or re-charging for) listings it already collected. No input is needed for this; it's automatic.
Incremental mode (recurring monitoring)
Turn on incrementalMode for a search you run on a schedule (e.g. daily) and only want what changed since last time. The actor remembers a baseline of every listing it has seen for that search (keyed by stateKey, or automatically by a hash of your filters — mode, deal type, category, property type, rooms, price/area/floor range, sort, locations/URLs, and whether extra details are on) and classifies every listing it sees against that baseline:
- NEW — never seen before
- UPDATED — a real field changed (price, area, floor, rooms, status, discounts, seller/verification info, market valuation, etc.) — the
changedFieldsarray lists which ones - UNCHANGED — nothing changed since last time; skipped from the output (and not billed) by default — turn on
emitUnchangedto include these rows too - REAPPEARED — was previously marked expired and is back
- EXPIRED — was seen before but is no longer found; only emitted when
emitExpiredis on, and only after a run that scanned every result page for every location/URL with no page or item cap and no resume in effect (a capped or partial run can't tell "gone" apart from "not reached yet", so it's skipped rather than guessed)
Every emitted row also gets firstSeenAt and lastSeenAt timestamps.
How the item cap interacts with incremental mode — read this before you schedule a run. maxListings counts rows returned, not rows examined. So on a later run the actor skips the unchanged listings it already knows and keeps walking deeper until it has filled your quota with listings you have not seen before. A daily run with maxListings: 20 therefore keeps returning (and billing for) up to 20 rows — but they are 20 listings that are genuinely new to you, never repeats of what you already received. If you would rather a quiet run return nothing and cost almost nothing, run uncapped (maxListings: 0, maxPages empty): then a run that finds no changes returns zero rows and prints its scanned-but-unchanged count instead — the normal, healthy outcome of monitoring a stable search, not an error.
What counts as a change: description, photos, and subways are tracked for presence but not compared field-by-field in the baseline (they're dropped from the stored snapshot to keep it small at scale — see below); every other field, including price, area, floor, rooms, status, discounts, and promo/placement flags, is compared and will trigger UPDATED on a genuine change. Measured against a live search (two fetches of the same listings 8 seconds apart): the only field that ever differs without a real change is the internal scrape timestamp, which is excluded from comparison.
incrementalMode is a separate mechanism from resumeFromRunId and the automatic migration checkpoint above — all three can be used together. Using incrementalMode together with resumeFromRunId on a search that already has a saved incremental baseline is rejected (the two would disagree about which listings are "new"); remove resumeFromRunId or pick a different stateKey to start a separate monitoring baseline.
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.
Output example
Sample shape, values are illustrative placeholders, not from a live listing.
{"id": "0000000000","url": "https://domclick.ru/card/sale__flat__0000000000","dealType": "sale","offerType": "flat","price": 34999000,"squarePrice": 466653,"currency": "RUB","area": 75,"rooms": 2,"floor": 14,"totalFloors": 17,"buildYear": 2026,"address": "Москва, набережная Примерная, 1 к1","latitude": 55.0000,"longitude": 37.0000,"nearestSubway": "Технопарк","subwayWalkMinutes": 12,"complexName": "Sample Complex","sellerName": "Agent Name","sellerCasId": 0,"isAgency": true,"companyName": "Sample Company","companyFiasId": "00000000-0000-0000-0000-000000000000","isRosreestrApproved": true,"hasDiscount": true,"photoCount": 11,"photos": ["https://img.dmclk.ru/vitrina/owner/00/00/000.jpg"],"publishedDate": "2026-01-01T00:00:00+00:00","marketPrice": 30280000,"minMarketPrice": 25740000,"maxMarketPrice": 34820000,"agentDealsCompleted": 31,"poiCount": 50,"query": "Москва","scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan requirement
Domclick only accepts traffic from Russian residential connections. Use Apify Residential proxy with country set to RU, available on the Starter plan and above. On the free plan, which does not include residential proxy, runs will likely return zero items. The actor prints a clear notice at the start of a run when residential proxy is not available.