{
  "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": "mP4gcmbIiftAxWbUc"
  },
  "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. Left untouched, it scrapes one example of each shape. Used only when mode = url.",
            "default": [
              "70000001106130477",
              "https://2gis.ru/moscow/search/%D0%BA%D0%BE%D1%84%D0%B5%D0%B9%D0%BD%D1%8F",
              "https://2gis.ru/moscow/firm/70000001063551091",
              "https://2gis.kz/almaty/firm/70000001041444514",
              "https://2gis.ae/dubai/search/cafe",
              "https://2gis.kz/almaty/inside/9430047375164168"
            ],
            "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. For a city or link on another 2GIS country site (for example 2gis.ae or 2gis.kz) the matching local locale is used automatically when this language is not offered there (Russian on 2gis.ae is served in English).",
            "default": "ru"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "rating",
              "distance",
              "opened_time",
              "name"
            ],
            "type": "string",
            "description": "Result ordering. Distance only applies when searching around coordinates; otherwise it falls back to relevance. Newest listings and Name use the 2GIS catalog sort in search mode.",
            "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
          },
          "rubricIds": {
            "title": "Category ids",
            "type": "array",
            "description": "Exact 2GIS rubric (category) ids to search, one search per id. Use alongside or instead of Category names.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onlyWithPhotos": {
            "title": "Only places with photos",
            "type": "boolean",
            "description": "Search mode: ask 2GIS for places that have photos.",
            "default": false
          },
          "onlyWithGoods": {
            "title": "Only places with goods/menu",
            "type": "boolean",
            "description": "Search mode: ask 2GIS for places that list goods or a menu.",
            "default": false
          },
          "openNow": {
            "title": "Only places open now",
            "type": "boolean",
            "description": "Search mode: ask 2GIS for places open at run time.",
            "default": false
          },
          "maxReviews": {
            "title": "Max reviews per place",
            "minimum": 0,
            "maximum": 1000,
            "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
            }
          },
          "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. COMPARED: every output field of a place (name, address, rating, review count, hours, phone, website, photos, attributes, categories and so on) and every field of a review (rating, text, dates, likes, owner answer, photos). EXCLUDED on places (they change on every fetch, or are derived or re-sent copies of compared fields): fullId, contactsRaw, adsRaw, scrapedAt, pageNumber, searchUrl, searchRubricId, searchRubricLabel, createdAt, updatedAt, mainPhotoUrl, brand, attributeGroups, scheduleSpecial, phoneText, phoneValue; they are still returned in the output. Use \"Ignore fields when detecting changes\" to exclude more. 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
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names that must NOT count as a change when incremental mode compares a place or review with the previous run, for example photos or rating. A name matches that field at any depth (a plain name also matches inside nested lists and objects); use dotted paths such as address.city for one specific nested field. Ignored fields are still returned in the output, they just never make a row UPDATED or appear in changedFields. Changing this list does not mark everything as UPDATED. Always ignored already on places: fullId, contactsRaw, adsRaw, scrapedAt, pageNumber, searchUrl, searchRubricId, searchRubricLabel, createdAt, updatedAt, mainPhotoUrl, brand, attributeGroups, scheduleSpecial, phoneText, phoneValue.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}