{
  "openapi": "3.0.1",
  "info": {
    "title": "2GIS $1💰 Extract Phones, Emails, Reviews & Locations",
    "description": "From $1/1K. Extract business and place data from 2GIS.com at scale. Get names, addresses, phones, emails, websites, social links, opening hours, ratings, reviews, photos, coordinates, and 80+ fields per place. Supports all regions covered by 2GIS with fast, low-cost extraction.",
    "version": "1.0",
    "x-build-id": "vBOvwGdy24un9bKIO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~2gis-places-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-2gis-places-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~2gis-places-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-2gis-places-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~2gis-places-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-2gis-places-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",
              "url"
            ],
            "type": "string",
            "description": "search = find places by query, category, city, coordinates, or map area (any combination). url = scrape specific 2GIS links or IDs.",
            "default": "search"
          },
          "query": {
            "title": "Search queries",
            "type": "array",
            "description": "WHAT to find, as free text, for example coffee shop, dentist, hotel. Each query runs separately. Optional: leave empty (and no categories) to return every place in the chosen area.",
            "default": [
              "кофейня"
            ],
            "items": {
              "type": "string"
            }
          },
          "categoryQuery": {
            "title": "Categories",
            "type": "array",
            "description": "WHAT to find, as category names, for example Restaurants, Pharmacies, Car repair. Each is matched against the 2GIS category tree and runs separately. Optional, and combine freely with queries.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "latitude": {
            "title": "Latitude (WHERE)",
            "type": "string",
            "description": "Search around a center point. Latitude, for example 55.7558. Provide together with longitude. Overrides city."
          },
          "longitude": {
            "title": "Longitude (WHERE)",
            "type": "string",
            "description": "Center longitude, for example 37.6173. Provide together with latitude."
          },
          "radiusMeters": {
            "title": "Radius (meters)",
            "minimum": 1,
            "maximum": 40000,
            "type": "integer",
            "description": "Search radius around the center point, in meters. Max 40000. Only used when latitude and longitude are set.",
            "default": 1000
          },
          "bbox": {
            "title": "Map area / bounding box (WHERE)",
            "type": "string",
            "description": "Rectangle: lon1,lat1,lon2,lat2 (south-west corner then north-east corner), for example 37.55,55.70,37.70,55.80. Overrides city and coordinates."
          },
          "urls": {
            "title": "2GIS URLs or IDs",
            "type": "array",
            "description": "Paste 2GIS links: place pages (/firm/ID), searches (/search/query), buildings (/inside/ID), short links (go.2gis.com), or raw numeric firm IDs. Multiple supported. Used only when mode = url.",
            "items": {
              "type": "string"
            }
          },
          "city": {
            "title": "City (WHERE)",
            "type": "string",
            "description": "Where to look, by city name, for example Moscow, Москва, Almaty, Dubai. Ignored if you provide coordinates or a map area.",
            "default": "Москва"
          },
          "language": {
            "title": "Language",
            "enum": [
              "ru",
              "en",
              "ar",
              "kk",
              "ky",
              "ka",
              "az",
              "cs",
              "it",
              "uz"
            ],
            "type": "string",
            "description": "Response language for names and content.",
            "default": "ru"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "rating",
              "distance"
            ],
            "type": "string",
            "description": "Result ordering. Distance only applies when searching around coordinates; otherwise it falls back to relevance.",
            "default": "relevance"
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "string",
            "description": "Keep only places with rating at or above this value (0 to 5). Leave blank for no filter."
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only places with at least this many reviews. Leave blank for no filter."
          },
          "onlyWithPhone": {
            "title": "Only places with a phone",
            "type": "boolean",
            "description": "Skip places that have no phone number.",
            "default": false
          },
          "onlyWithWebsite": {
            "title": "Only places with a website",
            "type": "boolean",
            "description": "Skip places that have no website.",
            "default": false
          },
          "skipAds": {
            "title": "Skip promoted places",
            "type": "boolean",
            "description": "Skip advertising or promoted entries.",
            "default": false
          },
          "maxReviews": {
            "title": "Max reviews per place",
            "minimum": 0,
            "type": "integer",
            "description": "How many reviews to fetch per place. 0 = do not fetch reviews. Reviews are pushed as separate records. Fetching reviews adds an extra request per place.",
            "default": 0
          },
          "reviewsSort": {
            "title": "Reviews sort",
            "enum": [
              "date_edited",
              "date_created",
              "rating",
              "friends"
            ],
            "type": "string",
            "description": "Order of fetched reviews.",
            "default": "date_edited"
          },
          "reviewsProvider": {
            "title": "Reviews source",
            "enum": [
              "all",
              "2gis",
              "flamp"
            ],
            "type": "string",
            "description": "Which review source to keep: all, 2GIS only, or Flamp only.",
            "default": "all"
          },
          "reviewsRating": {
            "title": "Reviews rating filter",
            "enum": [
              "all",
              "positive",
              "negative"
            ],
            "type": "string",
            "description": "Keep all reviews, only positive (4 to 5 stars), or only negative (1 to 3 stars).",
            "default": "all"
          },
          "reviewsMinRating": {
            "title": "Reviews minimum rating",
            "type": "string",
            "description": "Keep only reviews at or above this star rating (1 to 5). Leave blank for no limit."
          },
          "reviewsWithAnswer": {
            "title": "Only reviews with an official answer",
            "type": "boolean",
            "description": "Keep only reviews that have an official reply from the place.",
            "default": false
          },
          "reviewsStartDate": {
            "title": "Reviews from date",
            "type": "string",
            "description": "Keep only reviews created on or after this date (YYYY-MM-DD). Leave blank for no limit."
          },
          "reviewsKeyword": {
            "title": "Reviews keyword",
            "type": "string",
            "description": "Keep only reviews whose text contains this word or phrase. Leave blank for no filter."
          },
          "includePhotos": {
            "title": "Include place photos",
            "type": "boolean",
            "description": "Include photo URLs available in the place record.",
            "default": true
          },
          "maxResults": {
            "title": "Max places (total)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum total places across all queries / URLs. 0 = unlimited (capped at the 2GIS per-query ceiling of about 3000).",
            "default": 10
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "2GIS APIs work on datacenter proxy, which is the cheapest and fastest option. Residential is optional for very large runs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item 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
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of places without returning or charging for places already collected there. Use this after an interrupted run, or when continuing a large pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching places (and their reviews) as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED places and reviews. Places and reviews are tracked separately, so a place with a brand-new review is not itself reported as UPDATED. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those rows returned (and billed). State is kept separately for each search/category/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/category/URL and filter settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged places and reviews (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return places and reviews that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired places (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return places that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max places capped it or when Resume was used. Reviews do not have an EXPIRED state: review fetching is limited by Max reviews per place and the review filters, so an absent review is not reliable evidence it was deleted. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}