{
  "openapi": "3.0.1",
  "info": {
    "title": "Yandex Maps Scraper: Places, Phones, Websites",
    "description": "Scrape Yandex Maps business listings by search term and area: name, categories, address, coordinates, phones, website, social links, opening hours, rating and review counts. No browser; places are de-duplicated and large areas are split into tiles. New-places-only mode. Pay per delivered place.",
    "version": "0.1",
    "x-build-id": "jpTXffaC3Tfx344cP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/amitaviv~yandex-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-amitaviv-yandex-maps-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/amitaviv~yandex-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-amitaviv-yandex-maps-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/amitaviv~yandex-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-amitaviv-yandex-maps-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": [
          "queries"
        ],
        "properties": {
          "queries": {
            "title": "Search terms or Yandex Maps URLs",
            "type": "array",
            "description": "What to search for, as you would type it on Yandex Maps, in any language (e.g. dentist, кофейня, kuaför). You can also paste Yandex Maps URLs: a search or category URL (the map area and filters of the URL are used) or a place URL (that one place). A URL of the map without a search cannot be used. A URL that shows a whole large city returns only what Yandex Maps lists at that view, which can be a few dozen places: zoom in to a district before copying it. Each term is searched in each location below.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, district or region to search in, by name (e.g. Kazan, Almaty, Kadıköy Istanbul). Yandex Maps resolves the name to an area; the run log shows which. For a complete list of a large city search its districts one by one (or bounding boxes): a whole-city search misses some places, and for a very large city or one Yandex covers thinly (e.g. Istanbul) it can return only a few dozen. For several locations separate them with a semicolon (Kazan; Samara). Leave empty if you use a bounding box, coordinates or URLs, or if the place is part of the search term (e.g. dentist Almaty)."
          },
          "boundingBox": {
            "title": "Bounding box (instead of a location name)",
            "type": "string",
            "description": "Exact rectangle to search: south,west,north,east in decimal degrees, latitude first (e.g. 55.70,37.50,55.80,37.70 is central Moscow), at most 180 degrees wide. Takes precedence over Location."
          },
          "coordinates": {
            "title": "Centre point (instead of a location name)",
            "type": "string",
            "description": "latitude,longitude of the centre of the map (e.g. 55.7558,37.6173). Together with Zoom this defines the area, as a map window of about 1280 x 800 pixels would show it. Takes precedence over Location; a bounding box takes precedence over this."
          },
          "zoom": {
            "title": "Zoom (with Centre point)",
            "minimum": 3,
            "maximum": 19,
            "type": "integer",
            "description": "Yandex Maps zoom level around the centre point, 3 to 19 (default 12): 10 is a large city, 12 a district, 14 a neighbourhood, 16 a few streets. Used only with Centre point.",
            "default": 12
          },
          "maxItems": {
            "title": "Max places per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of places to deliver for each search (each search term in each location, or each URL), 1 to 100,000 (default 100; e.g. 500). You are charged only for delivered places. Yandex Maps serves at most 40 pages of results for one map view, with many repeats; when a list runs long, the area is split into four smaller tiles and searched again, until this number is reached or the tiles run out. A run that ends below this number because Yandex Maps listed no more says so in its status message; smaller areas then find more.",
            "default": 100
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "ru",
              "tr",
              "uk",
              "kk"
            ],
            "type": "string",
            "description": "Language of names, addresses, categories and opening hours in the output, as far as Yandex Maps has them in that language: en (default), ru, tr, uk or kk. It does not change which places are found.",
            "default": "en"
          },
          "strictRelevance": {
            "title": "Strict relevance",
            "type": "boolean",
            "description": "On (default): deliver only places whose coordinates are inside the requested area and, when Yandex Maps matched your search term to categories, that belong to one of those categories. Yandex Maps also lists places just outside the map view and from nearby towns; those are dropped. Dropped places are not charged and are counted in the status message and in OUTPUT_SUMMARY. Off: deliver everything Yandex Maps returns.",
            "default": true
          },
          "includeIndividuals": {
            "title": "Include individual practitioners",
            "type": "boolean",
            "description": "Off (default): listings that are a person working under their own name (for example a notary, lawyer, psychologist or tutor listed by surname and initials, or a title that says self-employed) are not delivered and not charged; the status message says how many. On: they are delivered, marked with isIndividual: true. Their names and phone numbers are personal data: turn this on only if you have a lawful basis to process them. Recognition looks for a person's name in the listing title, in the categories for notaries, lawyers and legal services, psychologists, coaching, tutors, speech therapists, photographers, massage and cosmetology, or next to a profession word such as нотариус, адвокат or репетитор. It is not perfect and named practitioners can remain: beauty salon and nail studio categories are not covered (a listing like \"Мастер маникюра Фамилия Имя\" is delivered), names written in other ways and listings without a name are not recognised, and a title with an organisation word or a number sign (\"Адвокатский кабинет № 567 Фамилия И. О.\", \"палата\", \"центр\", \"бюро\") is treated as an organisation. Organisations named after a person (a hospital, a library, a law firm with partners) are not treated as individuals.",
            "default": false
          },
          "includeClosed": {
            "title": "Include permanently closed places",
            "type": "boolean",
            "description": "Off (default): places Yandex Maps marks as permanently closed are not delivered and not charged; the status message says how many. On: they are delivered with status permanent-closed.",
            "default": false
          },
          "onlyNew": {
            "title": "Only new places (monitoring)",
            "type": "boolean",
            "description": "Deliver and charge only places that earlier runs of this actor in your account have not delivered for the same search and area. The first run delivers everything it finds, up to the maximum; later runs deliver what is left: places the earlier runs did not reach, and places that appeared on Yandex Maps since. A later run stops a search after 80 result pages in a row without a new place, so keep each monitored search to an area of about 1,000 places or fewer. The memory is a key-value store named yandex-maps-scraper-monitor in your account; delete it to start over.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor name (optional)",
            "type": "string",
            "description": "Only with \"Only new places\". A free-text name (e.g. kazan-weekly). Runs with the same search, area and monitor name share one memory; give two schedules different names to keep their memories apart. Empty by default: runs with the same search and area share one memory."
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many requests are sent to Yandex Maps at the same time, 1 to 5 (default 5). Lower it if your runs are being blocked.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave off (default). The actor sends requests directly, which is about ten times faster, and when Yandex Maps answers with its captcha page it switches to Apify Proxy on its own: datacenter addresses first, residential after 3 blocked answers. Set a proxy here only to force every request through it from the start.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}