How to scrape real estate data from Yandex Realty using the Minexa API
- Minexa.ai

- Jul 14
- 4 min read
Map-based real estate data is genuinely hard to collect at scale. The listings are rendered dynamically, the placemarks carry structured metadata embedded in CSS classes and href attributes, and the page requires JavaScript execution before any data is visible. Yandex Realty's apartment rental map for Moscow is a good example of this pattern, and it is exactly the kind of source where a deterministic, DOM-based extraction approach pays off.
This guide walks through how to build a working extraction pipeline for Yandex Realty (realty.yandex.ru/moskva/snyat/kvartira/karta/) using the Minexa API. The workflow has two phases: train a scraper once using the Minexa Chrome extension, then call the API programmatically to extract map placemark data at scale.
Watch the full walkthrough first
Before going through the steps below, the video tutorial covers the complete workflow from opening the page to running the extraction job.
Pipeline goal: structured placemark data from a live map
The end objective here is a structured dataset where each row represents one map placemark, carrying its price range, listing count, geographic coordinates, and rendering metadata. This dataset can feed rental price heatmaps, geographic clustering analysis, or market monitoring pipelines that track how rental floors shift across Moscow districts over time.
Step 1: open the target page and launch the extension
Navigate to the Yandex Realty map URL and open the Minexa Chrome extension. The extension detects the page structure and presents the starting options.
Click I'm on the right page to confirm the target URL and move to the next configuration step.
Step 2: configure pagination and scrape mode
The extension detects available pagination signals on the page and presents them for review. For the map view, the relevant scope is the visible placemark set. Confirm the pagination logic and select the list scrape mode since each placemark on the map is a discrete data record.
After validating, the extension moves to the scrape type selection screen where list mode is confirmed.
Step 3: select the data container and identify fields
Start the scraping job and hover over the map container holding the placemark elements. Minexa highlights the parent container automatically. Click to lock it in.
Once the container is selected, Minexa discovers all data points within it and presents them for review. No selectors need to be written.
All extracted columns are listed and navigable. This is where you confirm the fields that matter for your pipeline.
Step 4: copy the API request code
Click API Request in the top right of the extension. The pre-generated Python code is ready to copy. Update the scraper_id and urls fields with your values before running.
Here is the API request structure for this pipeline:
POST https://api.minexa.ai/data/
{
"batches": [{
"scraper_id": 6214,
"columns": ["top_30"],
"urls": ["https://realty.yandex.ru/moskva/snyat/kvartira/karta/"],
"scraping": {
"js_render": true,
"timeout": 30,
"js_code": [
{ "wait_time": 2 },
{ "page_init": true },
{ "wait_time": 4 }
],
"proxy": "verified",
"retry": 3
}
}],
"threads": 4
}JavaScript rendering is required here. The map placemarks are injected into the DOM after the initial page load, so js_render: true is necessary to capture them.
What the extracted data looks like
Each row in the output corresponds to one map placemark. Below are two representative records with the internal prefixes removed for readability:
[
{
"map_element_type": "defaultMapPlacemark",
"map_point_href": "/map/point/55.803226%2C37.347466",
"price_range": "от 44 000",
"price_range_2": [
{ "value": "4", "tag": "span", "type": "text" },
{ "value": "от 44 000", "tag": "span", "type": "text" }
],
"quantity": "4",
"style_attribute": "left: 145px; top: 158px;"
},
{
"map_element_type": "defaultMapPlacemarkSingleOffer",
"map_point_href": "/map/point/55.71883%2C37.391357",
"price_range": "62 000",
"price_range_2": [
{ "value": "62 000", "tag": "span", "type": "text" }
],
"quantity": "62 000",
"style_attribute": "left: 273px; top: 594px;"
}
]The map_element_type field distinguishes cluster placemarks (grouping multiple listings under a minimum price) from single-offer placemarks (one apartment at a fixed price). Cluster rows carry a quantity value reflecting the number of listings grouped at that location, while single-offer rows carry the exact rental price in that same field.
The map_point_href field encodes latitude and longitude directly in the path as percent-encoded coordinates. Parsing this field gives you geographic coordinates for every placemark without any separate geocoding step.
The price_range_2 field returns a structured array. For cluster placemarks, it contains two objects: the listing count and the minimum price string. For single-offer placemarks, it contains only the price. Extracting values is straightforward in Python: [item['value'] for item in row['price_range_2']].
The style_attribute field captures the absolute pixel position of each placemark within the map viewport. This can be used to reconstruct the spatial layout of listings across the rendered map without relying on the coordinate data alone.
Once the job completes, data is available for export as JSON, CSV, or Excel directly from the results view.
Scaling the pipeline programmatically
Once the scraper is trained and you have the scraper_id, the same extraction runs against any number of Yandex Realty map URLs by passing them in the urls array. The scraper does not need to be retrained for structurally identical pages. If you are running recurring jobs across many URLs, setting up your own cron job to call the API at intervals gives you full control over scheduling without any platform dependency.
The checkpoint-based Python script from the Minexa docs handles paginated API responses automatically, writing JSON and Excel files at each iteration so partial results are never lost mid-run.
For a broader look at real estate data pipelines and where extraction workflows typically break down, this post covers the topic in detail: Scraping real estate data: what actually works and where most pipelines break.

Comments