# Changelog of Yandex Maps Scraper: Leads, Emails & Website Check (`foxlabs/yandex-maps-scraper`) Actor

- **URL**: https://apify.com/foxlabs/yandex-maps-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/yandex-maps-scraper.md

## Changelog

### 0.1.15 — 2026-10-01 (private build)

- README only: a region's outline on Yandex can include the city it surrounds (`Московская область` returns Moscow places;
  test run `IXJgoWesQrGxYzIUM`: the first 20 were all in Moscow). No change to the code.

### 0.1.14 — 2026-10-01 (private build)

Fixes from the second independent README review (Q15) of build 0.1.13:

- More chat, link and directory pages are not taken for the business's website: jivo.chat, vk.me, kazan-guide.ru,
  mekan.com, tumisyeri.com, tikla.com.tr, booking.medflex.ru, app.1denta.ru (6 of about 2,400 places in the 0.1.13 tests;
  `info@jivo.ru` and `kazan-guide@mail.ru` were delivered as the business's email, and two places' real websites, listed
  second, were skipped).
- Emails are cleaned before they are checked: `maito:stom@…` → `stom@…`, `mailto%3adentolider@…` → `dentolider@…`,
  `%c2%a0skazka…@…` → `skazka…@…`, and a phone or postal code glued to the start (`644-51-87your-stom@…`, `1825info@…`) is
  removed (7 such addresses in the 0.1.13 tests). Addresses on international domains (`info@лояльность.com`) stay.
- Also left out: `admin@admin.ru`, `mail@google.com`, VK widget addresses (`…@stacks.vk-portal.net`) and the Ministry of
  Health (`info@rosminzdrav.ru`).
- Call-tracking and Yandex-source tags are removed from websites too (`calltouch_tm=…`, `rs=yandex-map`, `rs=ya_…`; 5 of
  1,200 Moscow websites).
- Input form: the radius describes a circle ("places within this many kilometres of the point"), and the location
  description says that only places inside Yandex's outline of it are kept.

### 0.1.13 — 2026-10-01 (private build)

Fixes from the independent README review (Q15) of builds 0.1.11–0.1.12:

- **Fix: a city search keeps only places inside the city.** The area was the rectangle around the location, so a "Москва"
  search also delivered towns of the Moscow region: 557–575 of 1,200 rows in the 1,200-place tests. Places are now kept
  only inside Yandex's outline of the location (city, district or region). On those 1,200 rows the outline keeps all 643
  rows addressed "Москва" and drops all 557 addressed "Московская область"; a local 300-place run after the change: 300 of
  300 in Moscow. Without an outline from Yandex the rectangle (2% margin) is used as before.
- **Fix: `coordinates` + `radiusKm` is a circle.** It was a square, so places up to 1.4× the radius away were delivered
  (Kadıköy 2 km test: 5 of 100 cafés at 2.0–2.21 km). Local test after the change: 150 cafés, farthest 1.96 km.
- After Yandex's ranked pages, the map views nearest the centre are searched first (a 100-place Moscow run continued in the
  south-west corner before).
- More addresses that are not the business's are left out: the compulsory medical insurance funds (`general@mofoms.ru`,
  `…tfoms…`), placeholders (`box@domain.tld`, `info@domen.ru`, `ivanov@mail.ru`) and hosting addresses on subdomains
  (`…beget.tech`). Short-link and link-in-bio pages (`clc.to`, `to.click`, `mssg.me`) are not treated as the business's
  website (their own addresses were delivered as the business's email).
- The coordinates area is named "lat, lon (radius N km)".

### 0.1.12 — 2026-10-01 (private build)

- **Fix: the contact page is a page, not a stylesheet.** The website check followed the first link whose address contains
  "contact" or "kontakt", also `<link>` tags: on WordPress sites with the "contact-form-7" plugin that was the plugin's CSS
  file. In the 0.1.11 tests 200 of 1,020 `contactPageUrl` values were such files, so the real contact page and its emails
  were missed. Only `<a>` links to pages count now (and Cyrillic addresses such as `/контакты/`). Re-checked on 20 of
  those sites: 15 now get their real contact page and 4 an email they did not have.

### 0.1.11 — 2026-10-01 (private build)

- **Faster area lookup for big cities.** Yandex's answer for a city like Moscow is 4.7 MB, and some sessions took 20–60 s to
  deliver it: in the platform tests the area lookup took 20–102 s in about one run of five, before any place was searched.
  When the first request has not answered after 8 s, a second one now starts on another session, and the first answer wins.

### 0.1.10 — 2026-10-01 (private build)

- More pages are recognised as not the business's own website: a lawyer directory (avukatrehber.net), the sites of Turkish
  bar associations (the Ankara Bar's addresses were delivered as a lawyer's email), a salon platform (vse-v-salon.ru,
  `info@vse-v-salon.ru`), Kazakh clinic platforms (macdent.kz, clinica.kz), QR-menu and booking links (restify.one,
  qr-cafe.ru, splitpay-service.ru, mikroturk.com, allzinapp.com), Yandex Dzen, and mail providers listed as a website
  (hotmail.com). In all test runs 51 of 3,528 places had such a page as their website; it now stays in `websites` only and
  is not checked or charged.
- Their accounts (instagram.com/avukatrehber for 10 Ankara lawyers, instagram.com/macdent.kz, instagram.com/ankara.barosu)
  no longer fill the `instagram` column.

### 0.1.9 — 2026-10-01 (private build)

- **The first places of a run are the ones Yandex ranks highest.** A search now starts with the first four result pages for
  the centre of the area, in the order Yandex's search returns them, and then searches the area map view by map view. Before, a run
  with a small `maxResults` got the places of the first map views, a corner of the city: in the 100-place tests of build
  0.1.6 only 0–47 of the first 100 places were among Yandex's top results, and those top results have a website far more
  often (Almaty 81% against 26%). Local test after the change: 67 of Yandex's top 73 Moscow dental clinics among the first
  100 places (before: 0). A whole-area search still searches the whole area (corrected wording: it does not find every
  place, see the README).
- The log line of a search counts the pages read in Yandex's order.

### 0.1.8 — 2026-10-01 (private build)

Fixes from checking every email of 2,768 places delivered in the platform tests:

- **Wrong emails removed.** `rating@mail.ru` came from the Mail.ru counter's HTML comment and was the only email of 11
  sites (6 cafés of one chain among them); HTML comments are no longer read. Form placeholders (`mail@mail.ru`), `abuse@`
  addresses and addresses with an ending that exists nowhere (`u@ab.po`) are dropped.
- **Booking, directory and short-link pages are not the business's website.** kolayrandevu.com, dikidi, zoon, dugun.com,
  estelink.ru, telegra.ph, bit.ly and a few directories were checked as if they were the business's own site, and their
  support addresses were delivered as its email (`destek@kolayrandevu.com` for 7 hairdressers, `info@dikidi.net`,
  `info@zoon.ru`, `press@bitly.com`). These links stay in `websites`; `website` is empty, `websiteStatus` is `no-website`,
  and no website check is charged.
- **Platform accounts are not the business's Instagram.** Yandex lists `instagram.com/kolayrandevu` or
  `instagram.com/doktortakvimi` for some places; the `instagram` column now takes the business's own account when Yandex
  lists one, otherwise stays empty (`socialLinks` keeps everything Yandex lists).
- **ROT13-hidden emails are decoded** (`vasb@fx-yrtraqn.eh` → `info@sk-legenda.ru`, two Moscow clinic sites).
- **Sites that do not answer the platform are tried once more through Apify Proxy.** 35 of 1,109 Moscow clinic websites timed
  out from the Apify platform's own address in a test, while 17 of 18 such sites opened through the Apify datacenter proxy.
  Such a site now gets a second try through the run's proxy (20 s); `SOURCE_REPORT.websites.proxyRecovered` counts them.
- Job, press and marketing addresses (`hr@`, `resume…@`, `advert@`, `press@`…) come after the other addresses of the same
  kind, so `email` is more often the front desk.

### 0.1.7 — 2026-10-01 (private build)

- **Fix: a run never delivers more places than `maxResults`.** When saving a row reported an error although the row had reached
  the dataset (seen once, on build 0.1.5, right after the stall fixed in 0.1.6), the place was counted as not delivered and
  replaced by another: that run wrote 1,203 rows for 1,200. A row whose saving reports an error now keeps its place in
  `maxResults`: at worst one row fewer, never more.
- The main `phone` is the first number in E.164: a city service number listed first (`122` at a Moscow clinic) stays in `phones`
  only.
- WhatsApp links with a short number lose Yandex's prefilled message too (`wa.me/56816?text=…` → `wa.me/56816`).
- The run's status message says what it counts: "(searches: 1 OK)".
- Actor description: "searches whole cities view by view, not just the first pages" (it named a 1,000-result limit that was
  never measured).

### 0.1.6 — 2026-10-01 (private build)

- **Fix: a website with a very long inline image no longer freezes the run.** The email search scanned such pages in quadratic
  time (50,000 characters: 1 s; a 1–2 MB page: minutes), so a 1,200-place test run (build 0.1.5) stopped delivering for 5.5
  minutes while every other request waited. Emails are now found from each "@" outwards and links and tags are read in one pass:
  a 2 MB page takes milliseconds. Same results on the test pages.

### 0.1.5 — 2026-10-01 (private build)

- **Fix: a run moved to another server by the platform no longer starts over.** In a 1,200-place test run that the platform moved
  twice (build 0.1.4), the Actor restarted from scratch each time and wrote 1,757 rows (1,226 different places): places would have
  been delivered and charged twice. The run now keeps the ids it delivered, the searches it finished and its counters in the
  key-value store (`RUN_STATE`), stops writing rows when the move is announced, and continues on the new server without repeating
  a place. Checked with a simulated move: 60 rows, 60 different places for `maxResults` 60.
- Place links on yandex.com.tr come back in Turkish and links on yandex.com in English when the language is automatic (before:
  always Russian).
- 32 website checks run at once (was 16): they wait on the network, not on the processor.

### 0.1.4 — 2026-10-01 (private build)

- Website addresses are looked up through public DNS resolvers (1.1.1.1, 8.8.8.8) on the platform too, with the platform's own
  resolver as the fallback: in a 100-place test the public resolvers were faster (0.55 s against 1.2 s per site) and had fewer
  timeouts (7 against 16).

### 0.1.3 — 2026-10-01 (private build)

- Website check is faster: every website's address is looked up once per run and at most six lookups run at a time (parallel
  lookups were the slow part: 48 at once took 8.3 s each in a test). On the Apify platform the platform's own resolver was used
  in this build (changed in 0.1.4).
- Every website request has a hard time limit (a server that sends bytes very slowly no longer holds its slot).
- The `SOURCE_REPORT` record shows where website-check time goes (lookup, first byte, download) and the slowest requests.

### 0.1.2 — 2026-10-01 (private build)

- A slow Yandex answer is given up after 20 s (was 30 s) and retried through a fresh IP.
- The website check of one site now has a 30-second budget (12 s per request), so one silent website cannot hold the run.
- The log and the `SOURCE_REPORT` record show how long the area lookup took and the slowest Yandex request and website.

### 0.1 — 2026-10-01

First version (private build; not yet published).

- Search by query and area: a city or district name (looked up on Yandex Maps), or coordinates with a radius. The area is searched map view by map view; a full view is split into four, the smallest views are paged. Each place is delivered once per run and only if it lies inside the area.
- Specific places by Yandex Maps link (any Yandex domain, also `/harita/org/…`) or id.
- Place rows: name, categories, phones in E.164 (with extension, type and Yandex's label), the business website without tracking parameters, every social link Yandex lists (Telegram, WhatsApp, VK, Instagram, MAX, Viber…), rating, number of ratings and reviews, Monday-first weekly hours, open now, status (open / temporarily / permanently closed), owner verification, chain, address parts, coordinates and the Yandex Maps link.
- Website check (on by default): website status (`ok`, `domain-not-found`, `dns-error`, `parked`, `spam`, `hacked`, `empty`, `protected`, `blocked`, `unreachable`, `redirects-to-platform`, or `no-website`) with the reason; emails from the home page and the contact page, each with its source page and kind (website domain, free mail, other domain); Instagram, WhatsApp and Telegram links from the website. Regulators' addresses (shown on Russian clinic sites by law), placeholder and hosting-provider addresses are removed.
- Filters: only places with a phone, a website or an email; minimum rating; skip permanently closed places.
- Output in Russian, Turkish or English (automatic by country).
- Pay-per-event billing: `place` per delivered place, `site-checked` per delivered place whose website was checked. Status rows, duplicates, places outside the area and filtered places are free. The run stops within the user's spending limit.
- Apify datacenter proxy by default; residential proxy when Yandex keeps refusing.
- Free status rows and a `SOURCE_REPORT` record explain every search that delivered nothing.
- Prepared for a Standby API (`/places`, `/place`); published in batch mode.
