Sutochno.ru Scraper - Rentals, Prices, Availability & Reviews avatar

Sutochno.ru Scraper - Rentals, Prices, Availability & Reviews

Pricing

from $1.50 / 1,000 listing records

Go to Apify Store
Sutochno.ru Scraper - Rentals, Prices, Availability & Reviews

Sutochno.ru Scraper - Rentals, Prices, Availability & Reviews

Scrape Sutochno.ru short-term rentals, apartments and hotels by city, dates, guests or URL. Extract property details, stay prices, availability, ratings, guest reviews, amenities and owner information. Supports listing, hotel and search URLs for rental research and price comparison.

Pricing

from $1.50 / 1,000 listing records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Security

Limited permissions

Share

Sutochno.ru Scraper

Scrape Sutochno.ru, Russia's largest short-term-rental platform and the domestic alternative to Airbnb: apartment and house listings with real stay prices, availability, ratings, guest reviews, amenities and owner profiles. Search any city with your dates and guest count, or paste listing, hotel and search links.

Why This Scraper?

  • Real stay pricing, not brochure rates. Every listing is priced for your exact check-in and check-out dates: per-night rate, stay total, season price rows, long-stay tiers, prepayment and service fee.
  • Reviews behind pagination. Guest reviews are collected past the first page (up to your per-listing limit) with ratings, stay dates, party size and text, into a dedicated Reviews tab.
  • Detail records, not just cards. House rules, check-in and check-out windows, the full amenity set, owner response stats and the complete photo gallery come off each listing's detail record.
  • Availability signals per stay window. Booking availability, rooms left and max guests are read for your dates, so occupancy analytics work out of the box.
  • Filters as first-class inputs. Housing types, hotel stars, guest score, instant booking and the site's own sort orders reach the site server-side, not as post-hoc guesses.
  • Built for schedules. Incremental mode tracks listings between runs and returns only new or changed ones; resume continues an interrupted run; both are first-class inputs.

Use Cases

  • Who: Price analysts and revenue managers tracking daily rates across Russian cities for specific stay windows.
  • Who: Investors and hosts benchmarking occupancy signals (availability, rooms left) and competitor amenities in their market.
  • Who: Travel and relocation researchers comparing neighborhoods by price, rating, reviews and transit notes.
  • Who: Data teams feeding RU rental inventory into dashboards or alerts through the dataset, API or MCP connectors.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

Fields (highlights)

FieldExample
objectId, recordId, url12345678, sutochno:12345678, listing link
title, typeTitle, hotelTitle, hotelStarsСтудия, квартиры, апартаменты, hotel block for hotels
pricePerNight, fullPrice, periodNights, currency5000, 10000, 2, RUB
prepayment, serviceFee, bonusstay cost breakdown
seasonPrices, extPricesper-period and long-stay price tiers
busyStatus, roomsAvailable, maxGuestsunbusy, 1, 3
rating, countReviews, reviewsTotal4.9, 27, 27
reviews[]rating, text, author, dates, stay size, images
address, cityTitle, lat, lng, metroStationslocation block
area, bedrooms, beds, guests, roomsCount, floorcapacity block
checkInAfter, checkOutUntil, minNights, earlyCheckInhouse rules
wifi, parking, airConditioning, washmachine, tvamenity flags
ownerName, ownerAnswerRate, ownerAnswerTimeMinutes, ownerSinceowner profile
mediaUrls, photoCountfull photo gallery
changeType, changedFields, firstSeenAt, lastSeenAtincremental bookkeeping

Output tabs: Listings (overview), Full listing details, Reviews (one row per review), Changes (incremental mode).

How to Use

Search a city with dates and guests:

{
"mode": "search",
"location": "Санкт-Петербург",
"checkIn": "2026-12-04",
"checkOut": "2026-12-07",
"guestsAdults": 2,
"maxItems": 50
}

Search with filters and sorting:

{
"mode": "search",
"location": "Сочи",
"sortings": "price_asc",
"housingTypes": ["apartment", "hotel"],
"minReviewScores": ["8", "9"],
"maxItems": 100
}

Read pasted links:

{
"mode": "urls",
"urls": ["https://sochi.sutochno.ru/998663"],
"fetchDetails": true,
"fetchReviews": true
}

Supported link shapes (URLs mode):

LinkWhat it reads
sochi.sutochno.ru/998663, sutochno.ru/998663, m.sutochno.ru/998663, sutochno.ru/front/searchapp/detail/858763one listing
sutochno.ru/hotels/144264 (optional ?occupied=2026-12-10;2026-12-13)one hotel listing; the dates set its stay and price window; a window that starts before today is ignored with a warning and the relative default window is used
sutochno.ru/front/searchapp/search?term=...a search; occupied, guests_adults, sortings (0 relevance, 1 price up, 2 price down), is_hotel/is_house/... flags, id+type and page are honoured
spb.sutochno.ru/, spb.sutochno.ru/?page=2everything listed for that city
spb.sutochno.ru/hotels (also house and hostel categories)that city, narrowed to the category
spb.sutochno.ru/1-komnatnyethe whole city: room-count categories have no server-side filter, so a warning is logged and the scope counts as partial
sutochno.ru/armeniaeverything listed for that country

A link with ?page=N (N above 1) starts at that page and counts as a partial scope, so incremental runs never mark unseen listings as expired. If you leave the URL list untouched, URLs mode scrapes one example of each shape above. Search mode ignores the list.

Run it from your code

Python (Apify client 3.x):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/sutochno-ru-scraper").call(run_input={
"mode": "search",
"location": "Санкт-Петербург",
"checkIn": "2026-12-04",
"checkOut": "2026-12-07",
"maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["pricePerNight"], item["fullPrice"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/sutochno-ru-scraper').call({
mode: 'search',
location: 'Санкт-Петербург',
checkIn: '2026-12-04',
checkOut: '2026-12-07',
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.title, i.pricePerNight, i.fullPrice]));

Tips

  • Set both dates to see real prices. Prices on the site depend on the stay window; without dates the actor prices a default 30-night window for availability.
  • Min/Max price are applied after collection (the site filters price in the browser the same way), so Max items counts listings before the price filter narrows them.
  • Unknown location? Use the city name as the site spells it; the actor resolves your text against the site's own location directory and fails with a clear message when it is not there.
  • Incremental schedules: keep the same location, dates and filters so the scope hash stays stable; new and changed listings are billed, unchanged ones are not.

Send results into your apps (MCP connectors)

Optionally send results into the apps you already use through Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the dataset is never changed and the full record always stays in it.

  1. Authorize a connector once under Apify -> Settings -> Integrations.
  2. Select it in the mcpConnectors field.
  3. For Notion, also set notionParentPageUrl. maxNotifyListings caps how many listings each connector receives per run.

Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modeselectsearchsearch walks a location; urls reads pasted links.
locationstringСанкт-ПетербургSearch mode: city, region or address the site knows.
checkIndatenoneCheck-in date (YYYY-MM-DD).
checkOutdatenoneCheck-out date; defaults to one night after check-in.
guestsAdultsinteger2Adult guests the search should fit.
guestsChildrensarray[]Child guest ages (0-17), e.g. [4, 9].
petsbooleanfalseOnly listings that accept pets.
sortingsselectrelevancerelevance, price_asc or price_desc as the site serves it.
maxItemsinteger20Maximum listings per run; 0 walks to the natural end.
maxPagesinteger0Page cap per scope; 0 walks until results run out.
housingTypesmulti-select[]apartment, hotel, house, room, bed, mini_hotel, aparthotel (applied by the site).
starsmulti-select[]Hotel star ratings; none = unrated hotels.
minReviewScoresmulti-select[]Guest score filter values 6-9 (the site's own filter).
bookingNowbooleanfalseOnly instantly bookable listings.
priceMinintegernoneMinimum price per night, RUB, applied after collection.
priceMaxintegernoneMaximum price per night, RUB, applied after collection.
urlsURL listone example of each shapeURLs mode: listing, hotel, search-app, city and country page links. Leave it untouched and URLs mode scrapes one example of each supported shape (see the Supported link shapes table above); it never rides a search-mode run.
fetchDetailsbooleantrueRead each listing's detail record (description, amenities, rules, owner, full gallery).
fetchReviewsbooleantrueCollect guest reviews into a nested field.
maxReviewsinteger20Review cap per listing (0 to 1000); 0 skips reviews.
fetchAvailabilitybooleantruePrice the stay window: total, season rows, prepayment, availability.
availabilityDaysinteger30Stay window length when no dates are set (1-90 nights).
proxyConfigurationproxyApify proxyThe site is open; the default connection works. Residential supported if selected.
resumeFromRunIdstringnoneContinue a previous unfinished run.
incrementalModebooleanfalseScheduled runs return only NEW or CHANGED listings.
stateKeystringautoNamed incremental baseline (advanced).
emitUnchangedbooleanfalseAlso return UNCHANGED listings in incremental mode.
changeScopestringallIncremental mode: all compares the whole record; priceAndStock compares only price and availability fields (pricePerNight, priceFull, priceWithoutDiscounts, fullPrice, busyStatus, roomsAvailable, bookingNow, extPrices, seasonPrices). Photo host rotation and review order never count as a change. Fields are compared after the run has read the listing's detail, availability and reviews (as far as those are switched on), so a changed availability or price shows up as UPDATED; re-reading an unchanged listing is not billed, only delivered rows are. Without fixed dates the moving window totals and season price segments (which shift with the run date) are ignored, so a plain re-run does not re-flag every listing as CHANGED.
emitExpiredbooleanfalseLabel listings that disappeared from the scope as EXPIRED. EXPIRED means the listing no longer appears in the results, not that it is unavailable for your dates (see busyStatus and roomsAvailable).
compactUpdatesbooleanfalseReturn UPDATED and EXPIRED listings as slim rows: identifiers, current price and availability, plus priceChanges and variantChanges with old and new values. NEW listings stay full. A slim UPDATED row bills the availability read only, never a detail record or reviews it does not carry.
expireAfterMissedScansinteger1With Emit expired: label a listing EXPIRED only after it was missing from this many complete scans in a row.
ignoreFieldsForChangesarray[]Dataset fields excluded from change detection. A dotted path such as seasonPrices.type drops that key from every element of the list.
mcpConnectorsarray[]Send results into your apps (MCP connectors).
notionParentPageUrlstringnoneNotion connector only: page under which listing pages are created.
maxNotifyListingsinteger50Cap on listings exported to each connector per run (1 to 1000). Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

One listing from a city search (2-night stay window):

{
"recordId": "sutochno:12345678",
"kind": "listing",
"objectId": 12345678,
"title": "Студия",
"typeTitle": "квартиры, апартаменты",
"url": "https://sutochno.ru/front/searchapp/detail/12345678",
"pricePerNight": 5000,
"fullPrice": 10000,
"periodNights": 2,
"currency": "RUB",
"busyStatus": "unbusy",
"rating": 4.9,
"countReviews": 27,
"bookingNow": true,
"photoCount": 21,
"address": "ул. Примерная, 10",
"cityTitle": "Санкт-Петербург",
"area": 26,
"bedrooms": 1,
"guests": 2,
"wifi": true,
"checkInAfter": "15:00",
"checkOutUntil": "12:00",
"ownerName": "Анна",
"ownerAnswerRate": 100,
"reviews": [
{
"reviewId": 123456789,
"rating": 5,
"reviewText": "Все ок, цена качество, соответствует.",
"reviewAuthor": "Guest",
"reviewDate": "2026-10-01 10:00:00",
"stayNights": 3
}
],
"changeType": "NEW"
}

Plan Requirement

This actor uses Pay Per Event pricing. Four events exist, each charged exactly as follows:

EventUnitWhen it fires
apify-actor-startone per runonce, when the run starts
apify-default-dataset-itemone per roweach row actually saved to the dataset
detail-enrichmentone per served readone for a served detail record and one for a served availability/stay-price read, billed with the row they enrich
review-enrichmentone per listingone per saved listing whose reviews were collected (not one per individual review)

Enrichment events are charged only for rows that were saved, so card-only, suppressed and unchanged rows cost proportionally less. Check the Pricing tab on the actor page for the current per-event prices and your plan's tier rates.

FAQ

How much does a run cost?

The start event fires once per run. Each listing returned bills the dataset-item event; each served detail record and availability read bills one detail-enrichment unit each; a listing with collected reviews bills one review event. Card-only runs (enrichment off) bill the dataset-item event only.

The actor reads the same public listing pages and JSON interface the site's own web app requests, without logging in and without bypassing any protection. Collect publicly available data responsibly: respect the site's terms, do not request data about private individuals beyond what listings publish, and keep run volumes reasonable.

How do I schedule recurring runs?

Enable Incremental mode and run the actor on a schedule (daily works well). The actor keeps a baseline in its named key-value store keyed by your search scope, returns only NEW or CHANGED listings, and can label disappeared ones as EXPIRED with Emit expired (optionally only after several missed complete scans). Turn on Compact updates for slim price and availability change rows.

Why did my run return fewer results than the site shows?

The site caps its map-lane result counter at 10,000; a walk ends at the natural end of pages. Max items, Max pages and the run time limit also stop a walk early (the status message says so). Min/max price filters apply after collection, so counts before and after the price filter can differ.

Can I use this actor with AI agents or MCP?

Yes. Add an MCP connector to the mcpConnectors input to push results into your connector-enabled app, or read the dataset through Apify's MCP server. The actor's structured fields (prices, availability, reviews, rules) are designed for downstream LLM consumption.

Does the actor log in or need an account?

No. Everything shipped here is public: listings, prices, availability and guest reviews.

🔗 Want more travel data?

Pair this actor with these related scrapers from the same team:

🏨 Airbnb Scraper
Scrape Airbnb stays by destination or link: nightly and total price, rating breakdown...
🏨 Trip.com Hotels, Rooms & Reviews Scraper
Pull structured hotel listings from trip.com with prices, room types, amenities...
🏨 Wego Scraper
Scrape Wego hotels by city or search URL. Get rates, providers, booking links...
🏨 Booking.com Scraper
Scrape booking.com hotels, apartments, villas and hostels. Search any destination with...
🏨 Expedia Hotels Scraper
Scrape Expedia.com hotel listings and reviews for any destination. Extract prices...
🏨 Rakuten Travel Scraper
Scrape Rakuten Travel, Japan's largest domestic hotel-booking site, by prefecture...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 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 contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.