# 2GIS Business Details and Contacts Scraper (`arjun_code/2gis-business-details-scraper`) Actor

Turn direct 2GIS business URLs into structured profiles: addresses, ratings, hours, and publicly listed phones, emails, websites, and social links. Covers five regional 2GIS sites; no 2GIS API key. / Данные и опубликованные контакты организаций 2ГИС по прямым ссылкам.

- **URL**: https://apify.com/arjun\_code/2gis-business-details-scraper.md
- **Developed by:** [Arjun AI](https://apify.com/arjun_code) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 business details

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

[English](#2gis-business-details-by-url) · [Русский](#2гис-данные-и-контакты-организаций)

### 2GIS business details by URL

Already have 2GIS business listing URLs? Paste up to 20 direct links and get one structured record per processed business: address, coordinates, categories, ratings, hours, and publicly listed phones, emails, websites, and social profiles. Use the results to verify known businesses or enrich an existing lead list. No 2GIS API key is required.

This is a **direct business-detail lookup**, not a keyword or map search. The Actor reads the public 2GIS listing and does not visit external company websites to fill missing contacts.

Try a ready-made example: [Dubai clinic details](https://apify.com/arjun_code/2gis-business-details-scraper/examples/lookup-dubai-clinic-details) or [Moscow business contacts](https://apify.com/arjun_code/2gis-business-details-scraper/examples/get-moscow-business-contacts). Replace the sample URLs with your own links.

#### Use cases

- Verify addresses, hours, ratings, and contacts for businesses you already found on 2GIS.
- Add publicly listed 2GIS contact details to an existing lead list or CRM import.
- Compare structured business profiles across the five supported regional 2GIS sites.

#### Input

```json
{
  "urls": [
    "https://2gis.ae/dubai/firm/70000001047946690",
    "https://2gis.uz/uz/tashkent/firm/70000001038986227"
  ]
}
```

`urls` is required and accepts 1–20 distinct business links per run. Duplicate values are rejected by input validation. Each link must contain `/firm/` and a numeric firm ID. Regional and language-prefixed URLs are supported on these sites:

| Website | Country |
| --- | --- |
| `2gis.ae` | United Arab Emirates |
| `2gis.ru` | Russia |
| `2gis.kz` | Kazakhstan |
| `2gis.uz` | Uzbekistan |
| `2gis.kg` | Kyrgyzstan |

#### Output fields

Successful lookups have `recordType: "businessDetail"` and `status: "complete"`.

| Fields | Meaning |
| --- | --- |
| `inputUrl`, `url`, `firmId`, `country`, `city` | Submitted URL, normalized listing URL, firm ID, country code, and city URL segment |
| `name`, `fullName`, `description` | Published business names and description, when present |
| `address`, `addressComment`, `latitude`, `longitude` | Published address and coordinates |
| `primaryCategory`, `categories` | First category and all categories from the listing |
| `rating`, `reviewCount`, `workingHours` | Published rating, review count, and schedule |
| `phones`, `emails`, `websites`, `socialProfiles` | All supported contacts found in the listing's contact groups |
| `scrapedAt` | Time the Actor created the record |

Contact entries retain their source as `"2gis"`. Fields that 2GIS does not publish remain `null` or empty arrays; the Actor does not invent ratings, emails, or other missing values. `country` is inferred from the 2GIS domain, `city` and `firmId` from the URL, and `primaryCategory` from the first listed category. The remaining business details come from the listing data in the public 2GIS page.

The Output tab has a compact **Businesses** view and a separate **Contacts** view. The full JSON item remains available from the Dataset API or export.

#### Real output example

Selected fields from a successful Uzbekistan lookup; values below are from an actual Actor run:

```json
{
  "recordType": "businessDetail",
  "status": "complete",
  "inputUrl": "https://2gis.uz/uz/tashkent/firm/70000001038986227",
  "firmId": "70000001038986227",
  "name": "Данные и технологии 2ГИС для бизнеса",
  "url": "https://2gis.uz/uz/tashkent/firm/70000001038986227",
  "country": "UZ",
  "city": "tashkent",
  "address": "Sayram 5-chi o'tish yo'li, 92",
  "primaryCategory": "Qo'ng'iroq markazlari",
  "rating": null,
  "reviewCount": null,
  "phones": [
    {"value": "+7 (383) 363‒05‒55", "displayValue": "+7 (383) 363‒05‒55", "comment": "qo'shimcha6, единая справочная", "groupName": null, "source": "2gis"},
    {"value": "+7‒966‒500‒00‒50", "displayValue": "+7‒966‒500‒00‒50", "comment": null, "groupName": null, "source": "2gis"}
  ],
  "emails": [{"value": "dev@2gis.ru", "source": "2gis"}],
  "websites": [
    {"url": "http://dev.2gis.ru?utm_source=card2gis&utm_medium=site&utrm_campaign=sng", "source": "2gis"},
    {"url": "http://data.2gis.com/?utm_source=card_in_products", "source": "2gis"}
  ],
  "socialProfiles": [{"platform": "telegram", "url": "https://t.me/geodata2gis", "source": "2gis"}]
}
```

#### Failed lookups and run summary

If a URL is invalid or its public detail page cannot be retrieved, the Actor still writes an item with `recordType: "businessLookupError"`, `status`, `inputUrl`, `errorCode`, and `errorMessage`. Check these rows in the Dataset alongside successful results. The `OUTPUT` record in the default Key-Value Store contains `totalInputUrls`, `successfulLookups`, `failedLookups`, `skippedDueToChargeLimit`, and `durationSeconds`. If the run's maximum charge is reached, remaining URLs are not requested.

#### Pricing

Each successful `businessDetail` record costs **$0.00199** ($1.99 per 1,000 successful details). The Actor Start event costs **$0.00005** per run at the supported memory sizes, including runs with no successful result. `businessLookupError` records do not incur a business-detail charge. A user-set maximum charge is a spending cap, not a minimum payment; the minimum selectable cap is $0.01.

#### FAQ

**Can I search by keyword or city name?** No. Provide a direct business listing URL. This Actor does not discover businesses from search pages.

**Why are some contact or rating fields empty?** They are not always published in every 2GIS listing. The Actor only exports what it can read from the public listing.

**Does an unavailable record mean the business does not exist?** Not necessarily. The listing may have moved, been removed, or failed to respond during the run. Inspect its `errorMessage` and verify the URL on 2GIS.

#### Responsible use and support

Use public business information in accordance with applicable laws and the websites' terms. This is an unofficial Actor and is not affiliated with 2GIS. For questions or reproducible errors, open an issue on the Actor's Apify page and include a non-sensitive example URL and run ID.

### 2ГИС: данные и контакты организаций

Уже есть прямые ссылки на карточки организаций 2ГИС? Добавьте до 20 ссылок и получите по одной структурированной записи для каждой обработанной организации: адрес, координаты, категории, рейтинг, часы работы и опубликованные телефоны, адреса электронной почты, сайты и социальные сети. Результаты подходят для проверки известных компаний и дополнения существующего списка контактов. Ключ API 2ГИС не нужен.

Actor получает **данные конкретных организаций**, а не ищет их по ключевым словам или карте. Он читает общедоступную карточку 2ГИС и не посещает сайты компаний для дополнения отсутствующих контактов.

Попробуйте готовые примеры: [карточки клиник Дубая](https://apify.com/arjun_code/2gis-business-details-scraper/examples/lookup-dubai-clinic-details) или [контакты организаций Москвы](https://apify.com/arjun_code/2gis-business-details-scraper/examples/get-moscow-business-contacts). Затем замените ссылки своими.

#### Сценарии использования

- Проверка адресов, часов работы, рейтингов и контактов уже известных организаций.
- Дополнение существующей базы лидов опубликованными контактами из 2ГИС.
- Сопоставление карточек компаний из пяти поддерживаемых региональных сайтов 2ГИС.

#### Входные данные

Укажите в обязательном параметре `urls` от 1 до 20 разных ссылок за один запуск. Одинаковые значения отклоняются при проверке входных данных. Ссылка должна содержать `/firm/` и числовой идентификатор организации. Формат JSON показан в [примере входных данных](#input) выше.

Поддерживаются сайты `2gis.ae` (ОАЭ), `2gis.ru` (Россия), `2gis.kz` (Казахстан), `2gis.uz` (Узбекистан) и `2gis.kg` (Кыргызстан), в том числе URL с языковым префиксом.

#### Поля результата

Успешная запись содержит `recordType: "businessDetail"` и `status: "complete"`.

| Поля | Значение |
| --- | --- |
| `inputUrl`, `url`, `firmId`, `country`, `city` | Исходная ссылка, ссылка на карточку, ID организации, код страны и сегмент города в URL |
| `name`, `fullName`, `description` | Название и описание, если опубликованы |
| `address`, `addressComment`, `latitude`, `longitude` | Адрес и координаты |
| `primaryCategory`, `categories` | Основная и остальные категории карточки |
| `rating`, `reviewCount`, `workingHours` | Рейтинг, число отзывов и часы работы |
| `phones`, `emails`, `websites`, `socialProfiles` | Опубликованные контакты из карточки |
| `scrapedAt` | Время создания записи |

В контактах сохраняется источник `"2gis"`. Неопубликованные сведения остаются `null` или пустыми массивами: Actor не придумывает адреса электронной почты, рейтинги и другие значения. `country` определяется по домену, `city` и `firmId` — по URL, `primaryCategory` — по первой категории карточки. Остальные сведения берутся из общедоступной страницы 2ГИС.

Во вкладке Output есть представления **Businesses** и **Contacts**. Полную JSON-запись можно получить через API Dataset или экспорт. [Пример реального результата](#real-output-example) выше взят из фактического запуска для организации в Узбекистане; имена JSON-полей не переводятся.

#### Ошибки и сводка запуска

Если ссылка некорректна или страницу не удалось получить, Actor всё равно записывает в Dataset элемент с `recordType: "businessLookupError"`, `status`, `inputUrl`, `errorCode` и `errorMessage`. Запись `OUTPUT` в Key-Value Store по умолчанию содержит `totalInputUrls`, `successfulLookups`, `failedLookups`, `skippedDueToChargeLimit` и `durationSeconds`. Если достигнут лимит стоимости запуска, оставшиеся ссылки не запрашиваются.

#### Стоимость

Каждая успешно полученная запись `businessDetail` стоит **$0.00199** ($1.99 за 1000 успешных карточек). Событие Actor Start стоит **$0.00005** за запуск при поддерживаемых объёмах памяти, даже если ни одна карточка не получена. За записи `businessLookupError` плата как за данные организации не взимается. Указанный пользователем максимальный расход — это лимит, а не минимальная плата; минимальный выбираемый лимит составляет $0.01.

#### Частые вопросы

**Можно ли искать по ключевому слову или городу?** Нет. Нужна прямая ссылка на карточку организации.

**Почему некоторые контакты или рейтинги пусты?** 2ГИС публикует эти сведения не в каждой карточке. Actor возвращает только доступные данные.

**Означает ли `unavailable`, что организации не существует?** Не обязательно. Карточка могла переехать, быть удалена или не ответить во время запуска. Проверьте `errorMessage` и ссылку в 2ГИС.

#### Использование и поддержка

Используйте общедоступные сведения об организациях с соблюдением применимого законодательства и правил соответствующих сайтов. Это неофициальный Actor, не связанный с 2ГИС. Для вопросов и воспроизводимых ошибок создайте обращение на странице Actor в Apify, приложив ссылку без конфиденциальных данных и идентификатор запуска.

# Changelog

This Actor's version history is a separate document: https://apify.com/arjun\_code/2gis-business-details-scraper/changelog.md

# Actor input Schema

## `urls` (type: `array`):

Enter one direct 2GIS business URL per line (1–20). Supported websites: 2gis.ae, 2gis.ru, 2gis.kz, 2gis.uz, and 2gis.kg. Contacts are returned only when listed publicly.

## Actor input object example

```json
{
  "urls": [
    "https://2gis.ae/dubai/firm/70000001047946690"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

Detailed public business records and contact information in the default Dataset.

## `summary` (type: `string`):

Input, successful, failed, skipped-at-charge-limit, and duration totals from the OUTPUT record.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://2gis.ae/dubai/firm/70000001047946690"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arjun_code/2gis-business-details-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": ["https://2gis.ae/dubai/firm/70000001047946690"] }

# Run the Actor and wait for it to finish
run = client.actor("arjun_code/2gis-business-details-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://2gis.ae/dubai/firm/70000001047946690"
  ]
}' |
apify call arjun_code/2gis-business-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arjun_code/2gis-business-details-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8gujRoj8Nzmtpednu/builds/4I80s8XCMB5swCRFi/openapi.json
