Переход с API v2 на v3

Здесь собраны только методы, где кроме адреса поменялось что-то ещё. Для каждого — что изменилось и что поправить. Нажмите на метод, чтобы раскрыть.

v2 продолжает работать как раньше — переходить можно постепенно, метод за методом.

Сначала — три вещи, общие для всех методов

  1. Группа теперь называется объектом. В адресе /v2/groups становится /v3/objects, а group_id и group_idsobject_id и object_ids: в параметрах, в теле запроса и в ответе. Это то же самое, что вы уже создавали, — поменялось только слово: у нас объект везде значит одну единицу бизнеса, и договор говорит так же.
  2. Авторизация не меняется: тот же заголовок X-API-Key и те же ключи.
  3. Конверты списков не менялись. Постраничные методы отдают {data, total, limit, offset, has_next}, «отдать всё» — {data}, синхронизация — {data, next_cursor, has_next}. Методы, которых нет в этом списке, переносятся только заменой адреса.

Площадки

GET/v3/sources

Тело ответа

У площадки переименованы четыре поля:

БылоСталоЧто это
nameslugмашинное имя площадки: yandex_travel, 2gis
display_namenameназвание для показа человеку: 2ГИС
has_replysupports_repliesплощадка вообще поддерживает ответы организации
has_imagessupports_imagesотзывы на площадке могут содержать картинки

Первые два поменялись местами не случайно: теперь name — это всегда название для человека, а машинное имя всегда slug. По этому же правилу читаются source_name и source_slug в остальных методах.

Два прежних имени has_reply и has_images значили у площадки одно, а в фильтрах отзывов — другое. Теперь у площадки это supports_* («умеет вообще»), а у отзыва остаётся has_* («есть у этого отзыва»). can_publish_reply не менялся: он про нас, а не про площадку.

Объекты (бывшие группы)

GET/v3/objects

Тело ответа

Поля объекта те же, что были у группы: id, name, is_active, scrape_status, last_scraped_at, created_at, links. Постраничность тоже не менялась — по 100 за раз.

PUT/v3/objects

Тело запроса

БылоСталоЧто это
group_idsobject_idsкакие объекты включить или выключить одним вызовом

Поведение не менялось: недоступные идентификаторы молча пропускаются, в ответе — те объекты, которые удалось тронуть.

DELETE/v3/objects/{object_id}

Было

{
  "id": 20,
  "name": "Националь",
  "deleted": true
}

Стало

{
  "id": 20,
  "name": "Националь"
}

Поле deleted убрано: оно всегда было true. Если объект не удалился, придёт ошибка, а не false. То же самое в DELETE /v3/folders/{folder_id}.

Ссылки

DELETE/v3/objects/{object_id}/links/{link_id}

Тело ответа

БылоСталоЧто это
detailmessageчеловекочитаемый итог операции
group_idobject_idобъект, из которого удалена ссылка

Слово detail освободилось: теперь оно встречается только в ошибках. Если ваш код отличал успех от ошибки по наличию detail — в v3 это работает без исключений.

POST/v3/objects/{object_id}/links

Тело ответа

БылоСталоЧто это
source_namesource_slugмашинное имя площадки, определённой по URL

Значение то же самое (2gis, yandex_travel) — прежнее имя обещало название, а отдавало слаг.

Отзывы

GET/v3/reviews

Параметры запроса

БылоСталоЧто это
group_idobject_idчьи отзывы отдать
include_deletedshow_deletedпоказывать и удалённые площадкой отзывы
separate_pos_negsplit_pros_consотдать «достоинства» и «недостатки» отдельными полями
sort_by=datesort_by=review_dateсортировка по дате публикации отзыва

show_hidden и show_pinned не менялись — теперь все три фильтра выдачи начинаются одинаково. Значения sort_by=rating и sort_by=reply_date тоже прежние: переименовано только date, потому что рядом стояло reply_date и было не видно, какая дата имеется в виду.

Параметр include_raw в v3 не поддерживается.

Тело ответа

В отзыве переименованы два поля — они приходят при split_pros_cons=true:

БылоСталоЧто это
positiveprosблок «достоинства»
negativeconsблок «недостатки»

И блок collecting, который приходит, пока идёт первый сбор:

БылоСтало
links_totallink_count
collecting_totallinks_collecting
failed_totallinks_failed

Остальные поля отзыва не менялись: author, text, rating, review_date, images, videos — всё как было. Блок access и его hidden_total тоже прежние.

GET/v3/reviews/sync

Параметры запроса

БылоСталоЧто это
group_idobject_idчто синхронизировать в первом запросе

Курсор адресат запоминает: со вторым и дальнейшими запросами по-прежнему достаточно cursor. Курсоры, выданные в v2, продолжают работать в v3 — закладка указывает место в данных, а не в версии, поэтому обход не нужно начинать заново.

Аналитика

GET/v3/analytics

Параметры запроса

БылоСталоЧто это
group_idobject_idпо какому объекту считать

Тело ответа

Переименованы счётчики — так, чтобы одна и та же величина везде называлась одинаково:

БылоСталоЧто это
total_reviewsreview_countстолько же, сколько в разбивке по площадкам
avg_ratingaverage_ratingтак же, как в вебхуках
total_with_replyreviews_with_replyрядом с reviews_with_images и reviews_with_text
unanswered_negativeunanswered_negative_countэто число, теперь имя об этом говорит
meta.group_idsmeta.object_idsкакие объекты вошли в расчёт

Правило простое: total остаётся только в постраничном конверте («сколько всего подходит под запрос»), любой другой счётчик — *_count, а «сколько из них с чем-то» — reviews_with_*. source_name не менялся и по-прежнему содержит название площадки для показа.

GET/v3/analytics/timeseries

Тело ответа

БылоСталоЧто это
series[].timeseriesseries[].pointsточки конкретного ряда

Было:

{ "series": [ { "source_id": 3, "timeseries": [ ...точки... ] } ] }

Стало:

{ "series": [ { "source_id": 3, "points": [ ...точки... ] } ] }

Раньше «ряд» лежал внутри «рядов» и назывался тем же словом. Сами точки и их поля не менялись, кроме счётчиков из таблицы выше.

Скрытые и закреплённые отзывы

POST/v3/objects/{object_id}/hidden-reviews

Тело ответа

БылоСталоЧто это
detailmessageчеловекочитаемый итог операции

hidden_count не менялся. То же самое в DELETE того же адреса — «вернуть отзывы из скрытых».

GET/v3/objects/{object_id}/hidden-reviews

Параметры запроса

Те же изменения, что у GET /v3/reviews: include_deletedshow_deleted, sort_by=datesort_by=review_date. Адрес объекта — {object_id}. Списки закреплённых отзывов меняются так же.

Папки

POST/v3/folders

Тело запроса и ответа

БылоСталоЧто это
group_idsobject_idsполный состав папки, присылается целиком
groupsobjectsсостав в ответе, объектами {id, name}
ignored_group_idsignored_object_idsчто не попало в состав: чужое, удалённое, несуществующее

Правила не менялись: состав всегда заменяется целиком, глубина — две ступени, один объект может лежать в скольких угодно папках. То же самое в PATCH /v3/folders/{folder_id}.

Вебхуки

POST/v3/webhooks

Тело запроса

БылоСталоЧто это
filters.group_idsfilters.object_idsприсылать события только по этим объектам

Остальная настройка не менялась: target, event_types, bucket_window, is_active.

Что придёт на ваш адрес

Подписка, созданная через v3, получает тело версии "3". Подписки, созданные раньше, продолжают получать версию "2" без единого изменения — переключение происходит только тогда, когда вы сами создадите подписку заново.

Было (schema_version: "2")Стало (schema_version: "3")
groupsobjects
group_idobject_id
object_namename
summary.negative_countsummary.negative_rating_count
sourcesource_id + source_slug

Стало:

{
  "schema_version": "3",
  "event": "reviews.new",
  "objects": [
    {
      "object_id": 20,
      "name": "Националь",
      "review_count": 2,
      "reviews": [ ... ]
    }
  ],
  "summary": { "review_count": 2, "average_rating": 4.5, "negative_rating_count": 0 }
}

Из отзыва внутри события убраны поля title и language: они всегда приходили пустыми. Счётчики приведены к общему правилу: total_reviewsreview_count, average_rating — как в аналитике.

Коды ошибок

GETполе code в теле ошибки

Что переименовано

БылоСталоКогда приходит
group_or_folder_requiredobject_or_folder_requiredне указан ни объект, ни папка
group_and_folder_conflictobject_and_folder_conflictуказаны оба сразу
not_foundreview_not_found, api_key_not_foundтеперь код всегда называет сущность
api_key_limitapi_key_limit_reachedисчерпан лимит ключей
pinned_limit_exceededpinned_limit_reachedисчерпан лимит закреплённых

Правило: <сущность>_not_found и <что>_limit_reached, без исключений — по имени кода видно, что произошло, даже если вы его раньше не встречали. Остальные коды не менялись.

Не нашли свой метод? Значит, у него поменялся только адрес: /v2//v3/ и groupsobjects. Если что-то не сходится — напишите нам, мы поправим инструкцию.