{
  "openapi": "3.0.1",
  "info": {
    "title": "2GIS Scraper: Places, Contacts & Reviews (privacy-safe)",
    "description": "Unofficial 2GIS scraper, no login. Search places in any 2GIS city (Russia, Kazakhstan, UAE, Kyrgyzstan, Uzbekistan) past the 60-result limit, or paste place URLs. Address, coordinates, phones, website, socials, hours, rating and reviews with owner replies. No reviewer names.",
    "version": "0.1",
    "x-build-id": "pEKeX2ouf7XqUka55"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kyungminlee~twogis-places-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kyungminlee-twogis-places-reviews-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/kyungminlee~twogis-places-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-kyungminlee-twogis-places-reviews-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/kyungminlee~twogis-places-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-kyungminlee-twogis-places-reviews-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",
        "properties": {
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "What to search for on 2GIS, as you would type it, e.g. \"кофейня\", \"стоматология\", \"автосервис\", \"cafe\" or a brand name. Local-language terms return the most complete results. Each query is searched in the city below.",
            "items": {
              "type": "string"
            }
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "The 2GIS city to search in: its slug from a 2GIS URL (\"moscow\", \"spb\", \"novosibirsk\", \"ekaterinburg\", \"kazan\", \"almaty\", \"astana\", \"bishkek\", \"tashkent\", \"dubai\", \"yerevan\"...) or its name in Russian or English (\"Москва\", \"Saint Petersburg\", \"Алматы\"). You can also paste a 2GIS city URL such as https://2gis.kz/almaty. Required for search queries."
          },
          "maxPlacesPerQuery": {
            "title": "Max places per query",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "How many places to save for each query. Up to 60 come in 2GIS's own ranking. Above 60 (the 2GIS per-search limit), the Actor splits the city into map tiles and searches each one, so you can collect thousands of places per query. A place found twice is saved and charged only once per run.",
            "default": 50
          },
          "placeUrls": {
            "title": "Place URLs or IDs",
            "type": "array",
            "description": "Specific places to collect, as 2GIS place URLs (https://2gis.ru/moscow/firm/70000001007179642, https://2gis.kz/almaty/firm/..., also with a language prefix like https://2gis.ae/ar/dubai/firm/...) or numeric place IDs (70000001007179642).",
            "items": {
              "type": "string"
            }
          },
          "boundingBox": {
            "title": "Bounding box (optional)",
            "type": "string",
            "description": "Only search inside this rectangle of the city, given as two opposite corners: latitude,longitude,latitude,longitude, e.g. \"55.745,37.600,55.765,37.640\". The box is split into map tiles like a whole city; places outside it are skipped and not charged. The box must lie inside the chosen city."
          },
          "includeContacts": {
            "title": "Include business contacts",
            "type": "boolean",
            "description": "Open each place's 2GIS page to add the phones, e-mails, websites and social/messenger links the business published there. Costs one extra request per place and is charged as the \"place with contacts\" event (only when at least one contact is found). Turn off for a cheaper, faster list without contacts.",
            "default": true
          },
          "maxReviewsPerPlace": {
            "title": "Max reviews per place",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Reviews to save for each place. 0 = no reviews. The first 50 come with the place page; more (and the newest-first order) are read from 2GIS's reviews service at a slower, polite pace. Each review is a separate dataset item and a separate review event. Reviewer names, IDs, avatars and profile links are never collected.",
            "default": 0
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "relevance",
              "newest"
            ],
            "type": "string",
            "description": "Order in which reviews are read. Use \"Newest first\" with \"Only reviews published on or after\" to monitor new reviews.",
            "default": "relevance"
          },
          "minReviewRating": {
            "title": "Minimum review rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only save reviews with at least this many stars (1-5). Skipped reviews are not charged."
          },
          "maxReviewRating": {
            "title": "Maximum review rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only save reviews with at most this many stars (1-5), e.g. 2 to collect complaints only. Skipped reviews are not charged."
          },
          "reviewsSince": {
            "title": "Only reviews published on or after",
            "type": "string",
            "description": "Only save reviews written (or last edited) on or after this date (YYYY-MM-DD, UTC). Older reviews are skipped and not charged. With \"Newest first\" the Actor stops reading a place as soon as it reaches older reviews."
          },
          "includeReviewPhotoUrls": {
            "title": "Include review photo URLs",
            "type": "boolean",
            "description": "Add the URLs of photos attached to each review. Off by default; the photo count is always included.",
            "default": false
          },
          "language": {
            "title": "Language",
            "enum": [
              "auto",
              "ru",
              "en",
              "kk",
              "ky",
              "uz",
              "ar",
              "az",
              "hy",
              "ka",
              "tg",
              "mn"
            ],
            "type": "string",
            "description": "Language of categories, addresses and attributes, where the country's 2GIS site offers it (2gis.ru is Russian only; 2gis.kz offers Kazakh, 2gis.ae Arabic, 2gis.kg Kyrgyz, 2gis.uz Uzbek). Business names and review texts stay as written. An unavailable language falls back to the site default with a log message.",
            "default": "auto"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "No proxy by default: 2GIS answers Apify's own IPs directly, about 4 times faster than through a proxy. The Actor paces requests (two streams, each about one request every 0.8-1.5 seconds with random jitter) and backs off when 2GIS refuses a request (HTTP 403/429). If refusals persist, switch on Apify Proxy (datacenter is enough): the Actor then uses three streams, moves to a new proxy session every 25 requests and immediately after a refusal.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}