{
  "openapi": "3.0.1",
  "info": {
    "title": "Sutochno.ru Scraper - Rentals, Prices, Availability & Reviews",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "dRl1KMGyJ6HMoByTY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~sutochno-ru-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-sutochno-ru-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~sutochno-ru-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-sutochno-ru-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~sutochno-ru-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-sutochno-ru-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "urls"
            ],
            "type": "string",
            "description": "search: walk listing pages for a location with your dates and guests. urls: read the sutochno.ru links you paste (listing pages, hotel pages, search links).",
            "default": "search"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Search mode: a city, region or address the site knows (Russian or Latin both work, e.g. 'Санкт-Петербург', 'Sochi'). The search is scoped to this location.",
            "default": "Санкт-Петербург"
          },
          "checkIn": {
            "title": "Check-in",
            "type": "string",
            "description": "Check-in date (YYYY-MM-DD). Prices on the site depend on the stay window, so set both dates to see real prices. Leave both empty to browse without a stay window."
          },
          "checkOut": {
            "title": "Check-out",
            "type": "string",
            "description": "Check-out date (YYYY-MM-DD), must be after check-in. If check-in is set and this is empty, one night is assumed."
          },
          "guestsAdults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Number of adult guests the search should fit.",
            "default": 2
          },
          "guestsChildrens": {
            "title": "Children ages",
            "type": "array",
            "description": "Ages of child guests (0-17), e.g. [4, 9]. The site uses ages, not just a count.",
            "default": []
          },
          "pets": {
            "title": "Pets welcome",
            "type": "boolean",
            "description": "Only listings that accept pets.",
            "default": false
          },
          "sortings": {
            "title": "Sort",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc"
            ],
            "type": "string",
            "description": "Listing order as the site serves it: relevance (the site's own order), price ascending or price descending.",
            "default": "relevance"
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum listings collected per run (0 to 100000). 0 means no limit (the walk stops at the natural end of results).",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per scope",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum result pages walked per scope. 0 (default) walks until results run out; Max items is the only limit that stops a run early.",
            "default": 0
          },
          "housingTypes": {
            "title": "Housing types",
            "type": "array",
            "description": "Restrict to selected housing types (applied by the site itself). Empty = all types.",
            "items": {
              "type": "string",
              "enum": [
                "apartment",
                "hotel",
                "house",
                "room",
                "bed",
                "mini_hotel",
                "aparthotel"
              ]
            },
            "default": []
          },
          "stars": {
            "title": "Hotel stars",
            "type": "array",
            "description": "Restrict to selected hotel star ratings ('none' = unrated hotels). Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "none",
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            },
            "default": []
          },
          "minReviewScores": {
            "title": "Minimum review score",
            "type": "array",
            "description": "Only listings whose guest score is one of the selected values (the site's own 6-9 score filter). Empty = any.",
            "items": {
              "type": "string",
              "enum": [
                "6",
                "7",
                "8",
                "9"
              ]
            },
            "default": []
          },
          "bookingNow": {
            "title": "Instant booking only",
            "type": "boolean",
            "description": "Only listings bookable instantly without owner approval.",
            "default": false
          },
          "priceMin": {
            "title": "Min price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price per night, RUB. Applied after collection (the site filters price in the browser too), so Max items counts listings before this filter narrows them."
          },
          "priceMax": {
            "title": "Max price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price per night, RUB. Applied after collection (see Min price per night)."
          },
          "urls": {
            "title": "sutochno.ru links",
            "type": "array",
            "description": "URLs mode: listing pages (sutochno.ru/front/searchapp/detail/<id>, <city>.sutochno.ru/<id>, sutochno.ru/<id>), hotel pages (sutochno.ru/hotels/<id>, optional ?occupied=from;to), search-app links (term, occupied, guests_adults, sortings, page, is_hotel, id, type), and city or country pages (spb.sutochno.ru/, /hotels, /?page=2, sutochno.ru/armenia). If you add no links, one example of every supported shape is used. In search mode this list is ignored.",
            "default": [
              {
                "url": "https://sochi.sutochno.ru/998663"
              },
              {
                "url": "https://sutochno.ru/front/searchapp/detail/858763"
              },
              {
                "url": "https://sutochno.ru/hotels/144264"
              },
              {
                "url": "https://sutochno.ru/hotels/144264?occupied=2026-12-10;2026-12-13"
              },
              {
                "url": "https://sutochno.ru/front/searchapp/search?term=%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3&guests_adults=2"
              },
              {
                "url": "https://sutochno.ru/front/searchapp/search?term=%D0%A1%D0%BE%D1%87%D0%B8&occupied=2026-12-10;2026-12-13&guests_adults=2&sortings=1"
              },
              {
                "url": "https://sutochno.ru/front/searchapp/search?term=Sochi&page=2&guests_adults=2"
              },
              {
                "url": "https://sutochno.ru/front/searchapp/search?is_hotel=1&guests_adults=2&id=397367&type=city&term=%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3"
              },
              {
                "url": "https://spb.sutochno.ru/"
              },
              {
                "url": "https://spb.sutochno.ru/?page=2"
              },
              {
                "url": "https://spb.sutochno.ru/1-komnatnye"
              },
              {
                "url": "https://spb.sutochno.ru/hotels"
              },
              {
                "url": "https://sutochno.ru/armenia"
              },
              {
                "url": "https://sutochno.ru/998663"
              },
              {
                "url": "https://m.sutochno.ru/998663"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "fetchDetails": {
            "title": "Fetch listing details",
            "type": "boolean",
            "description": "Read each listing's detail record: full description, all amenities, house rules, check-in/out rules, owner profile, long-stay price tiers, and the full photo set.",
            "default": true
          },
          "fetchReviews": {
            "title": "Fetch guest reviews",
            "type": "boolean",
            "description": "Collect guest reviews for each listing (up to Max reviews per listing) into a nested reviews field. The Reviews output tab lists them one per row.",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per listing",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum guest reviews collected per listing (0 to 1000). 0 skips reviews.",
            "default": 20
          },
          "fetchAvailability": {
            "title": "Fetch stay pricing & availability",
            "type": "boolean",
            "description": "Price each listing for a stay window: total stay price, per-period season prices, prepayment, service fee, booking availability and rooms left.",
            "default": true
          },
          "availabilityDays": {
            "title": "Availability window (nights)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Length of the stay window priced per listing (used when Check-in/Check-out are empty): 1-90 nights, default 30.",
            "default": 30
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "The site is open and the default datacenter connection works. Residential proxies are supported if you select them.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Continue a previous unfinished run: listings already collected by that run are skipped. Leave empty for a fresh run."
          },
          "changeScope": {
            "title": "Change scope (incremental mode only)",
            "enum": [
              "all",
              "priceAndStock"
            ],
            "type": "string",
            "description": "Incremental mode: which fields decide UPDATED. 'All fields' compares every field the run reads for the listing (card, detail, availability and reviews, as far as those are switched on). 'Prices and availability only' compares pricePerNight, priceFull, priceWithoutDiscounts, fullPrice, busyStatus, roomsAvailable, bookingNow, extPrices and seasonPrices, so description, photo or owner edits never produce an UPDATED row. Without fixed Check-in/Check-out dates the availability window moves with the run date, so the window totals (fullPrice, periodNights, prepayment, serviceFee, bonus, seasonPrices) are left out of change detection.",
            "default": "all"
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "For scheduled runs: track listings between runs and return only NEW or CHANGED ones (UNCHANGED rows are suppressed unless Emit unchanged is on). Price, availability and detail changes (see Change scope) drive UPDATED; scrape time, change labels and the order of reviews or photos never do. Cannot be combined with Resume from run ID.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Advanced: name of the incremental baseline. Leave empty to derive it from your search scope automatically (recommended)."
          },
          "emitUnchanged": {
            "title": "Emit unchanged",
            "type": "boolean",
            "description": "Incremental mode: also return listings that did not change since the last run (labelled UNCHANGED).",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired",
            "type": "boolean",
            "description": "Incremental mode: label listings that disappeared from the results since the last complete run as EXPIRED.",
            "default": false
          },
          "compactUpdates": {
            "title": "Compact updates (incremental mode only)",
            "type": "boolean",
            "description": "Incremental mode: return UPDATED and EXPIRED listings as slim rows (identifiers, current price and availability, plus priceChanges and variantChanges with the old and new values) instead of the full record. NEW listings stay full. A slim UPDATED row is billed for the availability read only, never for the detail record or reviews it no longer carries. Off by default.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after missed scans (incremental mode only)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "With Emit expired: a listing is labelled EXPIRED only after it was missing from this many complete scans in a row (1 = the first complete scan that misses it). EXPIRED means the listing no longer appears in the results, not that it is unavailable for your dates: check busyStatus and roomsAvailable for availability.",
            "default": 1
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Advanced: dataset field names that should not mark a listing as CHANGED in incremental mode (e.g. fields you find too volatile for your schedule). A dotted path such as seasonPrices.type drops that key from every element of the list while the rest of each element is still compared.",
            "default": []
          },
          "mcpConnectors": {
            "title": "MCP connectors",
            "type": "array",
            "description": "Send results into your apps (MCP connectors). Leave empty to only use the dataset. See the README for the connector config shape.",
            "default": []
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which listing pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}