GET /v1/organization
Организация, которой принадлежит ключ · любой действующий ключ
Ответ
200 — JSON: Organization
Отзывы 2GIS, рейтинги локаций и аналитика организации — для вашей CRM, ERP, BI или любого другого продукта.
API решает три задачи:
Адрес API: https://api.review.cerebralabs.kz/v1. Описание в формате OpenAPI: https://api.review.cerebralabs.kz/v1/openapi.json — его можно импортировать в Postman или использовать для генерации клиента.
Authorization каждого запроса:curl -H "Authorization: Bearer rk_ВАШ_КЛЮЧ" \
"https://api.review.cerebralabs.kz/v1/reviews?limit=1"
Ответ:
{
"data": [
{
"id": "317202675",
"location_id": "70000001012345678",
"location_name": "Кофейня на Абая",
"author_name": "Айгерим К.",
"rating": 5,
"text": "Очень вкусный кофе и приветливый бариста!",
"created_at": "2026-11-14T14:07:35.479718Z",
"edited_at": null,
"changed_at": "2026-11-14T14:10:38.921527Z",
"is_rated": true,
"is_hidden": false,
"likes_count": 0,
"photo_urls": [],
"answer": null,
"removed_at": null
}
],
"has_more": true,
"next_cursor": "eyJzIjoiY3JlYXRlZF9kZXNjIiwidiI6IjIwMjYtMTEtMTRUMTQ6MDc6MzUuNDc5NzE4IiwiaSI6MTk2NTh9"
}
Дальше: как держать свою базу отзывов в актуальном состоянии и как получать события на свой сервер.
Ключ принадлежит одной организации и даёт доступ только к её данным. Это строка вида rk_…; храните её как пароль и не встраивайте в код, который выполняется в браузере или мобильном приложении.
У ключа есть набор прав. Запрос без нужного права получает ответ 403 с кодом insufficient_scope.
| Право | Что разрешает | У нового ключа |
|---|---|---|
locations:read | Список локаций и их рейтинги | есть |
reviews:read | Отзывы | есть |
analytics:read | Аналитика и история рейтинга | есть |
events:read | Лента событий | есть |
webhooks:manage | Настройка своих вебхуков: ключ сам подписывается на события и получает их на свой адрес | только если владелец отметил |
Владелец может ограничить ключ отдельными локациями и задать срок действия. Локации, недоступные ключу, для него не существуют: запрос к ним отвечает 404.
Отозванный или просроченный ключ сразу перестаёт приниматься (401, код invalid_api_key). Вебхуки, которые система настроила этим ключом, при отзыве отключаются.
2026-11-14T14:07:35.479718Z. В параметрах запроса можно указывать время со смещением (…+05:00); время без смещения считается UTC.null, а не пропадает из ответа.Списки отдаются частями. В ответе есть has_more и указатель на продолжение: next_cursor у отзывов, next_after у событий. Передайте его в следующем запросе и повторяйте, пока has_more равно true. Размер части задаёт параметр limit.
Не больше 120 запросов в минуту на ключ. В каждом ответе есть заголовки X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset (через сколько секунд счётчик обнулится). При превышении приходит ответ 429 с заголовком Retry-After — подождите указанное число секунд и повторите запрос.
Любая ошибка приходит в одном формате. Опирайтесь в коде на поле code: оно не меняется, а текст message может уточняться.
{
"error": {
"code": "insufficient_scope",
"message": "Ключу не разрешено: analytics:read",
"request_id": "req_9584d029f63a754f"
}
}
| HTTP | code | Что произошло |
|---|---|---|
| 400 | invalid_cursor | Курсор получен из запроса с другим sort или повреждён |
| 401 | unauthorized | Ключ не передан |
| 401 | invalid_api_key | Ключ неизвестен, отозван или просрочен |
| 403 | insufficient_scope | У ключа нет права на этот метод |
| 403 | organization_disabled | Организация отключена от сервиса |
| 404 | not_found | Объекта нет или он недоступен ключу — эти случаи намеренно не различаются |
| 409 | conflict | Действие сейчас невозможно: например, достигнут предел числа вебхуков |
| 422 | validation_error | Некорректные параметры; в details — список полей с пояснениями |
| 429 | rate_limited | Превышен лимит запросов |
| 500 | internal_error | Сбой на нашей стороне; сообщите поддержке значение request_id |
Номер запроса есть и в заголовке X-Request-Id каждого ответа, в том числе успешного.
initial_load_done равно false.Чтобы держать у себя копию отзывов, не нужно каждый раз выгружать всё заново. Запросите отзывы в порядке их изменения — sort=changed_asc — и сохраните последний next_cursor. В следующий раз запрос с этим курсором вернёт только то, что изменилось: новые отзывы, правки, ответы компании, пропажи.
import pathlib
import time
import requests
API = "https://api.review.cerebralabs.kz/v1"
HEADERS = {"Authorization": "Bearer rk_ВАШ_КЛЮЧ"}
CURSOR_FILE = pathlib.Path("reviews_cursor.txt") # где хранить курсор между запусками
def sync(save):
"""Забирает всё, что изменилось с прошлого запуска. save(review) — создать или обновить отзыв по review["id"]."""
cursor = CURSOR_FILE.read_text().strip() if CURSOR_FILE.exists() else None
while True:
params = {"sort": "changed_asc", "limit": 200}
if cursor:
params["cursor"] = cursor
response = requests.get(f"{API}/reviews", headers=HEADERS, params=params, timeout=30)
if response.status_code == 429: # превышен лимит — ждём столько, сколько просит сервер
time.sleep(int(response.headers["Retry-After"]))
continue
response.raise_for_status()
page = response.json()
for review in page["data"]:
save(review) # у пропавшего из 2GIS отзыва заполнено review["removed_at"]
if page["next_cursor"]:
cursor = page["next_cursor"]
CURSOR_FILE.write_text(cursor) # сохраняем после каждой страницы: сбой не заставит начинать заново
if not page["has_more"]:
break
next_cursor возвращается всегда, даже когда изменений нет, — сохраняйте его после каждой части.id.removed_at. Если отзыв вернётся, он придёт снова с removed_at: null.429, как в примере.Если вашей системе важны не сами отзывы, а факты — «появился отзыв», «компания ответила», — используйте события.
Сервис записывает каждое замеченное изменение как событие. Получать события можно двумя способами — формат одинаковый:
GET /v1/events — вы периодически запрашиваете новые события, передавая в after значение next_after из прошлого ответа. Подходит, если ваш сервер не может принимать входящие запросы.| Тип | Когда происходит |
|---|---|
review.created | Новый отзыв |
review.updated | Отзыв изменён: текст, оценка, учёт в рейтинге; либо ответ компании убран |
review.answered | Компания ответила на отзыв или изменила ответ |
review.removed | Отзыв пропал из 2GIS |
review.restored | Пропавший отзыв снова в 2GIS |
location.rating_changed | Изменился рейтинг карточки 2GIS |
У события есть id (растёт в порядке появления), type, момент occurred_at, локация и содержимое data.
Новый отзыв — в data.review тот же объект, что отдаёт GET /v1/reviews:
{
"id": 1042,
"type": "review.created",
"occurred_at": "2026-11-14T14:10:38.921527Z",
"location_id": "70000001012345678",
"location_name": "Кофейня на Абая",
"data": {
"review": {
"id": "317202675",
"location_id": "70000001012345678",
"location_name": "Кофейня на Абая",
"author_name": "Айгерим К.",
"rating": 5,
"text": "Очень вкусный кофе и приветливый бариста!",
"created_at": "2026-11-14T14:07:35.479718Z",
"edited_at": null,
"changed_at": "2026-11-14T14:10:38.921527Z",
"is_rated": true,
"is_hidden": false,
"likes_count": 0,
"photo_urls": [],
"answer": null,
"removed_at": null
}
}
}
У событий review.updated и review.answered дополнительно есть changed — что изменилось, и previous — прежние значения этих полей:
{
"id": 1057,
"type": "review.answered",
"occurred_at": "2026-11-14T15:05:40.310000Z",
"location_id": "70000001012345678",
"location_name": "Кофейня на Абая",
"data": {
"review": {
"id": "317202675",
"location_id": "70000001012345678",
"location_name": "Кофейня на Абая",
"author_name": "Айгерим К.",
"rating": 5,
"text": "Очень вкусный кофе и приветливый бариста!",
"created_at": "2026-11-14T14:07:35.479718Z",
"edited_at": null,
"changed_at": "2026-11-14T15:05:40.310000Z",
"is_rated": true,
"is_hidden": false,
"likes_count": 0,
"photo_urls": [],
"answer": {
"text": "Спасибо за отзыв! Ждём вас снова.",
"answered_at": "2026-11-14T15:02:11.120000Z",
"first_answered_at": "2026-11-14T15:02:11.120000Z"
},
"removed_at": null
},
"changed": [
"answer"
],
"previous": {
"answer": null
}
}
}
Изменение рейтинга карточки:
{
"id": 1060,
"type": "location.rating_changed",
"occurred_at": "2026-11-14T15:10:02.500000Z",
"location_id": "70000001012345678",
"location_name": "Кофейня на Абая",
"data": {
"rating": 4.6,
"previous_rating": 4.7,
"rating_confirmed": true,
"reviews_count": 321
}
}
Со временем появятся новые типы событий и новые поля. Незнакомые типы пропускайте, незнакомые поля игнорируйте — тогда обновления API не сломают вашу интеграцию.
Локация показывает события только с момента её подключения к организации; события за время первичной загрузки отзывов не создаются.
Вебхук — это адрес на вашем сервере, на который сервис отправляет события запросом POST с телом в формате JSON. Настроить его можно двумя способами:
webhooks:manage:curl -X POST "https://api.review.cerebralabs.kz/v1/webhooks" \
-H "Authorization: Bearer rk_ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"url": "https://crm.example.com/hooks/reviews", "event_types": ["review.created", "review.answered"]}'
В ответе придёт secret — секрет для проверки подписи. Он показывается один раз; при необходимости его можно сменить методом rotate-secret.
Вебхук, созданный через API, виден и управляется только тем ключом, который его создал, и получает события только доступных этому ключу локаций.
https, с действующим сертификатом, на сервере, доступном из интернета по IPv4.2xx за 10 секунд. Отвечайте сразу, а долгую обработку выполняйте в фоне.3xx считается неудачей.webhook-id. Запоминайте принятые значения и не обрабатывайте сообщение дважды.id и occurred_at события.410 отключает его сразу. События за время отключения не досылаются — заберите их из ленты GET /v1/events.Метод POST /v1/webhooks/{id}/test (или кнопка «Отправить проверочное сообщение» в кабинете) отправляет событие типа ping. Результат и ответ вашего сервера видны в журнале доставок: GET /v1/webhooks/{id}/deliveries.
Адрес вебхука могут узнать посторонние, поэтому каждое сообщение подписано. Проверяйте подпись, прежде чем доверять содержимому. Подпись соответствует открытой спецификации Standard Webhooks — для неё есть готовые библиотеки на многих языках.
| Заголовок | Значение |
|---|---|
webhook-id | Номер сообщения. Не меняется при повторной отправке |
webhook-timestamp | Время отправки, секунды Unix |
webhook-signature | v1,<подпись>; подписей может быть несколько через пробел |
Как проверить:
{webhook-id}.{webhook-timestamp}.{тело запроса}. Тело берите как есть, байт в байт, — не разобранный и заново собранный JSON.whsec_, декодированная из base64.webhook-timestamp отличается от текущего времени больше чем на 5 минут.import base64
import hashlib
import hmac
import time
def verify_webhook(secret: str, headers, body: bytes, tolerance: int = 300) -> bool:
"""secret — whsec_…; headers — заголовки запроса (имена в нижнем регистре); body — тело запроса как есть."""
message_id = headers["webhook-id"]
timestamp = headers["webhook-timestamp"]
if abs(time.time() - int(timestamp)) > tolerance:
return False # слишком старое сообщение: возможно, кто-то повторяет перехваченный запрос
key = base64.b64decode(secret.removeprefix("whsec_"))
signed = f"{message_id}.{timestamp}.".encode() + body
expected = base64.b64encode(hmac.new(key, signed, hashlib.sha256).digest()).decode()
# В заголовке может быть несколько подписей через пробел: "v1,<подпись> v1,<подпись>"
received = [part.split(",", 1)[1] for part in headers["webhook-signature"].split() if part.startswith("v1,")]
return any(hmac.compare_digest(expected, candidate) for candidate in received)
const crypto = require("crypto");
// body — тело запроса как есть (Buffer или строка), до JSON.parse; имена заголовков в нижнем регистре
function verifyWebhook(secret, headers, body, tolerance = 300) {
const id = headers["webhook-id"];
const timestamp = headers["webhook-timestamp"];
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > tolerance) return false; // слишком старое сообщение
const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
const expected = crypto.createHmac("sha256", key).update(`${id}.${timestamp}.`).update(body).digest("base64");
// В заголовке может быть несколько подписей через пробел: "v1,<подпись> v1,<подпись>"
return headers["webhook-signature"].split(" ").some((part) => {
const [version, signature] = part.split(",");
if (version !== "v1" || !signature) return false;
const a = Buffer.from(signature);
const b = Buffer.from(expected);
return a.length === b.length && crypto.timingSafeEqual(a, b);
});
}
module.exports = { verifyWebhook };
<?php
// $body — тело запроса как есть: file_get_contents('php://input'); имена заголовков в нижнем регистре
function verify_webhook(string $secret, array $headers, string $body, int $tolerance = 300): bool
{
$id = $headers['webhook-id'];
$timestamp = $headers['webhook-timestamp'];
if (abs(time() - (int) $timestamp) > $tolerance) {
return false; // слишком старое сообщение
}
$key = base64_decode(substr($secret, strlen('whsec_')));
$expected = base64_encode(hash_hmac('sha256', "{$id}.{$timestamp}.{$body}", $key, true));
// В заголовке может быть несколько подписей через пробел: "v1,<подпись> v1,<подпись>"
foreach (explode(' ', $headers['webhook-signature']) as $part) {
[$version, $signature] = array_pad(explode(',', $part, 2), 2, '');
if ($version === 'v1' && hash_equals($expected, $signature)) {
return true;
}
}
return false;
}
from flask import Flask, request
from verify import verify_webhook # функция из примера выше
app = Flask(__name__)
SECRET = "whsec_ВАШ_СЕКРЕТ"
seen = set() # в настоящей системе — таблица в базе
@app.post("/hooks/reviews")
def reviews_hook():
body = request.get_data() # именно сырое тело: подпись считается по нему
headers = {name.lower(): value for name, value in request.headers.items()}
if not verify_webhook(SECRET, headers, body):
return "", 401
if headers["webhook-id"] in seen: # повтор уже принятого сообщения
return "", 204
seen.add(headers["webhook-id"])
event = request.get_json()
if event["type"] == "review.created":
review = event["data"]["review"]
print(f'Новый отзыв {review["rating"]}★ в «{event["location_name"]}»: {review["text"]}')
# Незнакомые типы событий просто пропускайте: со временем появятся новые
return "", 204 # отвечайте сразу, долгую обработку выносите в фон
С готовой библиотекой проверка занимает одну строку — например, Webhook(secret).verify(body, headers) в пакете standardwebhooks для Python.
Пути указаны относительно адреса https://api.review.cerebralabs.kz. Этот же справочник в машинном виде — описание OpenAPI.
/v1/organizationОрганизация, которой принадлежит ключ · любой действующий ключ
200 — JSON: Organization
/v1/locationsСписок локаций · любой действующий ключ
Действующие локации организации с рейтингом карточки 2GIS и числом отзывов.
200 — JSON: список: Location
/v1/locations/{location_id}Одна локация · любой действующий ключ
| Имя | Тип | Описание |
|---|---|---|
location_id | строка | в пути |
200 — JSON: Location
/v1/reviewsСписок отзывов · любой действующий ключ
Отзывы организации.
Лента. sort=created_desc (по умолчанию) — от новых к старым; листайте по next_cursor, пока has_more.
Синхронизация. sort=changed_asc отдаёт отзывы в порядке, в котором сервис замечал изменения (появление, правка, ответ компании, пропажа из 2GIS). Пройдите список до конца и сохраните последний next_cursor; следующий запрос с ним вернёт только то, что изменилось с тех пор.
| Имя | Тип | Описание |
|---|---|---|
location_id | список: строка | Одна или несколько локаций; по умолчанию все |
rating | список: целое число | Оценки от 1 до 5, можно несколько |
created_since | дата и время | Написанные не раньше этого момента (ISO 8601) |
created_until | дата и время | Написанные раньше этого момента |
changed_since | дата и время | Изменившиеся не раньше этого момента |
has_answer | да/нет | true — с ответом компании, false — без ответа |
search | строка | Поиск по тексту отзыва; до 200 символов |
include_removed | да/нет | Показывать отзывы, пропавшие из 2GIS. По умолчанию: нет для sort=created_desc, да для sort=changed_asc — иначе при синхронизации пропажа отзыва останется незамеченной |
sort | строка | created_desc — сначала новые; changed_asc — в порядке изменения, для синхронизации; одно из: created_desc, changed_asc; по умолчанию created_desc |
limit | целое число | от 1 до 200; по умолчанию 50 |
cursor | строка | Значение next_cursor из предыдущего ответа |
200 — JSON: ReviewList
/v1/reviews/{review_id}Один отзыв · любой действующий ключ
Отзыв по его ID, в том числе пропавший из 2GIS.
| Имя | Тип | Описание |
|---|---|---|
review_id | строка | в пути |
200 — JSON: Review
/v1/eventsЛента событий · любой действующий ключ
Что изменилось в отзывах и рейтингах: новые отзывы, правки, ответы компании, пропажи.
События идут в порядке появления. Запомните next_after из ответа и передайте его в after при следующем запросе — получите только новые события. Локация показывает события с момента её подключения к организации.
| Имя | Тип | Описание |
|---|---|---|
after | целое число | ID последнего полученного события; 0 — с начала; не меньше 0; по умолчанию 0 |
since | дата и время | Только события не раньше этого момента (ISO 8601) |
type | список: строка | Типы событий, можно несколько |
location_id | список: строка | Одна или несколько локаций; по умолчанию все |
limit | целое число | от 1 до 500; по умолчанию 100 |
200 — JSON: EventList
/v1/analytics/summaryСводка за период · любой действующий ключ
Показатели за период, те же показатели за предыдущий период и таблица локаций с тремя рейтингами.
В расчёты идут только отзывы, которые сейчас есть в 2GIS и учитываются им в рейтинге.
| Имя | Тип | Описание |
|---|---|---|
date_from | дата | Начало периода; по умолчанию 30 дней назад |
date_to | дата | Конец периода включительно; по умолчанию сегодня |
days | целое число | Последние N дней, включая сегодня; от 1 до 1098 |
location_id | список: строка | Локации; по умолчанию все |
200 — JSON: Summary
/v1/analytics/timeseriesДинамика по дням, неделям или месяцам · любой действующий ключ
Число отзывов, средняя оценка и негатив по дням, неделям или месяцам.
| Имя | Тип | Описание |
|---|---|---|
date_from | дата | |
date_to | дата | |
days | целое число | Последние N дней, включая сегодня; от 1 до 1098 |
location_id | список: строка | |
granularity | строка | одно из: day, week, month; по умолчанию day |
200 — JSON: список: TimeseriesPoint
/v1/locations/{location_id}/rating-historyИстория рейтинга карточки 2GIS · любой действующий ключ
Как менялся рейтинг карточки в 2GIS. Снимки делаются раз в сутки с момента подключения сбора.
| Имя | Тип | Описание |
|---|---|---|
location_id | строка | в пути |
date_from | дата | |
date_to | дата | |
days | целое число | Последние N дней, включая сегодня; от 1 до 1098 |
200 — JSON: список: RatingHistoryPoint
/v1/webhooksВебхуки этого ключа · любой действующий ключ
200 — JSON: список: Webhook
/v1/webhooksСоздать вебхук · любой действующий ключ
Сервис начнёт отправлять события организации на указанный адрес.
Сообщение — тот же объект, что отдаёт GET /v1/events. Оно подписано по спецификации Standard Webhooks (заголовки webhook-id, webhook-timestamp, webhook-signature); секрет для проверки подписи есть только в ответе на этот запрос. На сообщение нужно ответить кодом 2xx за 10 секунд, иначе оно будет отправлено повторно (до 9 попыток за двое суток).
JSON: WebhookInput
201 — JSON: WebhookCreated
/v1/webhooks/{webhook_id}Один вебхук · любой действующий ключ
| Имя | Тип | Описание |
|---|---|---|
webhook_id | целое число | в пути |
200 — JSON: Webhook
/v1/webhooks/{webhook_id}Изменить вебхук · любой действующий ключ
| Имя | Тип | Описание |
|---|---|---|
webhook_id | целое число | в пути |
JSON: WebhookPatch
200 — JSON: Webhook
/v1/webhooks/{webhook_id}Удалить вебхук · любой действующий ключ
| Имя | Тип | Описание |
|---|---|---|
webhook_id | целое число | в пути |
204 — без тела
/v1/webhooks/{webhook_id}/rotate-secretСменить секрет подписи · любой действующий ключ
Прежний секрет перестаёт действовать сразу.
| Имя | Тип | Описание |
|---|---|---|
webhook_id | целое число | в пути |
200 — JSON: WebhookSecret
/v1/webhooks/{webhook_id}/testОтправить проверочное сообщение · любой действующий ключ
На адрес уйдёт сообщение типа ping. Результат — в журнале доставок через несколько секунд.
| Имя | Тип | Описание |
|---|---|---|
webhook_id | целое число | в пути |
202 — JSON: Delivery
/v1/webhooks/{webhook_id}/deliveriesЖурнал доставок · любой действующий ключ
Что и когда отправлялось на адрес, от новых к старым.
| Имя | Тип | Описание |
|---|---|---|
webhook_id | целое число | в пути |
status | строка | одно из: pending, succeeded, failed |
before | целое число | Показать отправки старше этой (её id) |
limit | целое число | от 1 до 200; по умолчанию 50 |
200 — JSON: DeliveryList
| Поле | Тип | Описание |
|---|---|---|
id | целое число | |
event_id | целое число или null | ID события; null у проверочного сообщения |
type | строка | |
status | строка | pending | succeeded | failed |
attempts | целое число | |
next_attempt_at | строка или null | |
last_attempt_at | строка или null | |
last_status_code | целое число или null | |
last_error | строка или null | |
created_at | строка | |
delivered_at | строка или null |
| Поле | Тип | Описание |
|---|---|---|
data | список: Delivery | |
has_more | да/нет |
| Поле | Тип | Описание |
|---|---|---|
code | строка | Код ошибки для программы: unauthorized, invalid_api_key, insufficient_scope, not_found, validation_error, invalid_cursor, rate_limited, internal_error и др. |
message | строка | Пояснение для человека |
request_id | строка | Номер запроса — назовите его поддержке |
details | список: объект или null |
| Поле | Тип | Описание |
|---|---|---|
error | ErrorBody |
| Поле | Тип | Описание |
|---|---|---|
id | целое число | Растёт в порядке появления событий; годится как курсор (параметр after) |
type | строка | review.created | review.updated | review.answered | review.removed | review.restored | location.rating_changed |
occurred_at | строка | Когда сервис заметил изменение |
location_id | строка | |
location_name | строка | |
data | объект | Для событий review.*: review — отзыв на момент события; у review.updated и review.answered ещё changed (что изменилось) и previous (прежние значения). Для location.rating_changed: rating, previous_rating, rating_confirmed, reviews_count |
| Поле | Тип | Описание |
|---|---|---|
data | список: Event | |
has_more | да/нет | |
next_after | целое число | Передайте в параметре after, чтобы получить следующие события |
| Поле | Тип | Описание |
|---|---|---|
id | строка | ID локации — он же номер карточки в 2GIS |
name | строка | Название локации внутри организации |
card_name | строка или null | Название карточки по данным 2GIS, если оно известно |
city | строка или null | |
address | строка или null | |
rating_2gis | число или null | Рейтинг карточки в 2GIS, как на карте |
reviews_count_2gis | целое число или null | Число отзывов по данным 2GIS |
rating_2gis_updated_at | строка или null | |
rating_target | число или null | Цель по рейтингу, заданная владельцем |
reviews_count | целое число | Отзывов в сервисе (без пропавших из 2GIS) |
last_review_at | строка или null | |
initial_load_done | да/нет | false — отзывы новой локации ещё загружаются (до нескольких минут) |
| Поле | Тип | Описание |
|---|---|---|
location_id | строка | |
name | строка | |
city | строка или null | |
rating_2gis | число или null | Рейтинг карточки в 2GIS, как на карте |
reviews_count_2gis | целое число или null | |
rating_calculated | число или null | Расчётный рейтинг за последние 90 дней со сглаживанием |
avg_rating_90d | число или null | Обычное среднее за те же 90 дней, без сглаживания |
reviews_90d | целое число | |
rating_target | число или null | |
target_gap | число или null | Расчётный рейтинг минус цель; отрицательное — ниже цели |
target_gap_2gis | число или null | Рейтинг 2GIS минус цель |
period | PeriodMetrics | |
previous | PeriodMetrics |
| Поле | Тип | Описание |
|---|---|---|
id | строка | |
name | строка | |
locations_count | целое число | Число локаций, доступных этому ключу |
| Поле | Тип | Описание |
|---|---|---|
reviews | целое число | |
avg_rating | число или null | |
negative | целое число | Отзывов с оценкой 3★ и ниже |
negative_share | число или null | Доля негатива, от 0 до 1 |
response_rate | число или null | Доля отзывов с ответом компании, от 0 до 1 |
negative_response_rate | число или null | Доля негативных отзывов с ответом, от 0 до 1 |
unanswered_negative | целое число | |
median_response_hours | число или null | Медианное время до ответа компании, часы |
distribution | объект | Число отзывов по оценкам: ключи '1'..'5' |
| Поле | Тип | Описание |
|---|---|---|
date | дата | |
rating | число или null | |
reviews_count | целое число или null |
| Поле | Тип | Описание |
|---|---|---|
avg | число или null | |
reviews | целое число | |
days | целое число |
| Поле | Тип | Описание |
|---|---|---|
id | строка | |
location_id | строка | |
location_name | строка | |
author_name | строка или null | |
rating | целое число или null | Оценка от 1 до 5 |
text | строка или null | |
created_at | строка или null | Когда отзыв написан |
edited_at | строка или null | Когда автор его правил, по данным 2GIS |
changed_at | строка | Когда сервис заметил последнее изменение отзыва: появление, правку, ответ, пропажу, возврат |
is_rated | да/нет или null | Учитывает ли 2GIS отзыв в рейтинге карточки |
is_hidden | да/нет или null | |
likes_count | целое число | |
photo_urls | список: строка | |
answer | ReviewAnswer или null | Официальный ответ компании; null — ответа нет |
removed_at | строка или null | Когда отзыв пропал из 2GIS; null — отзыв на месте |
| Поле | Тип | Описание |
|---|---|---|
text | строка или null | |
answered_at | строка или null | Дата текущего ответа по данным 2GIS |
first_answered_at | строка или null | Когда компания ответила впервые; не меняется, если ответ переписали |
| Поле | Тип | Описание |
|---|---|---|
data | список: Review | |
has_more | да/нет | |
next_cursor | строка или null | Передайте в параметре cursor, чтобы получить продолжение. При sort=changed_asc возвращается всегда: сохраните его и в следующий раз получите только новые изменения |
| Поле | Тип | Описание |
|---|---|---|
date_from | дата | |
date_to | дата | |
previous_from | дата | |
previous_to | дата | |
timezone | строка | Часовой пояс, в котором считаются сутки |
period | PeriodMetrics | |
previous | PeriodMetrics | Те же показатели за предыдущий период такой же длины |
rating_window | RatingWindow | Средняя оценка по выбранным локациям за 90 дней |
locations | список: LocationSummary |
| Поле | Тип | Описание |
|---|---|---|
date | дата | Начало дня, недели (понедельник) или месяца |
reviews | целое число | |
avg_rating | число или null | |
negative | целое число |
| Поле | Тип | Описание |
|---|---|---|
id | целое число | |
url | строка | |
description | строка или null | |
event_types | список: строка | Пусто — все события |
location_ids | список: строка или null | null — все локации организации |
is_active | да/нет | |
disabled_reason | строка или null | manual — отключён вручную; failures — несколько дней ничего не удавалось доставить; gone — получатель ответил 410; key_revoked — отозван ключ |
failing_since | строка или null | С какого момента ничего не удаётся доставить |
last_success_at | строка или null | |
last_failure_at | строка или null | |
created_at | строка |
| Поле | Тип | Описание |
|---|---|---|
secret | строка | Секрет для проверки подписи (Standard Webhooks). Показывается один раз |
id | целое число | |
url | строка | |
description | строка или null | |
event_types | список: строка | Пусто — все события |
location_ids | список: строка или null | null — все локации организации |
is_active | да/нет | |
disabled_reason | строка или null | manual — отключён вручную; failures — несколько дней ничего не удавалось доставить; gone — получатель ответил 410; key_revoked — отозван ключ |
failing_since | строка или null | С какого момента ничего не удаётся доставить |
last_success_at | строка или null | |
last_failure_at | строка или null | |
created_at | строка |
| Поле | Тип | Описание |
|---|---|---|
url обязательное | строка | Адрес получателя: только https, публичный сервер. До 2000 символов |
description | строка или null | До 200 символов |
event_types | список: строка | Типы событий; пусто — все |
location_ids | список: строка или null | Локации; не задано — все доступные ключу |
| Поле | Тип | Описание |
|---|---|---|
url | строка или null | До 2000 символов |
description | строка или null | До 200 символов |
event_types | список: строка или null | |
location_ids | список: строка или null | Пустой список — все доступные ключу |
is_active | да/нет или null |
| Поле | Тип | Описание |
|---|---|---|
secret | строка | Секрет для проверки подписи (Standard Webhooks). Показывается один раз |
Версия API указана в пути: /v1. В пределах версии мы можем добавлять методы, необязательные параметры, поля в ответах и типы событий. Удалять и переименовывать поля, менять их смысл и тип — только в новой версии; прежняя при этом продолжит работать, а о сроках её отключения мы предупредим заранее.
| Дата | Что изменилось |
|---|---|
| 14 ноября 2026 | Первая версия: организация, локации, отзывы, аналитика, лента событий, вебхуки |