Общие сведения об API¶
Назначение¶
LocalHub Robot API — публичный API для автоматизации действий пользователя и подключения внешних интеграций к платформе LocalHub.
Пользователь создаёт программного агента («робота»), назначает ему ограниченный набор разрешений и использует токен для выполнения доступных операций от имени своего аккаунта.
Robot API подходит для:
- внешних интеграций;
- автоматизации рабочих сценариев;
- получения доступных пользователю данных;
- сервисных сценариев и скриптов автоматизации;
- пользовательских инструментов поверх платформы.
Базовый адрес¶
Все методы текущей версии API публикуются под префиксом /v1/.
Модель доступа¶
Доступ к API строится вокруг объекта Robot.
Robot¶
Robot — агент, созданный пользователем в своём аккаунте LocalHub. Робот действует от имени аккаунта-владельца, но только в пределах выданных ему разрешений.
У каждого робота есть:
- имя;
- набор разрешений (
scope); - один или несколько токенов доступа;
- лимиты на использование API.
Token¶
Токен — секрет, которым клиент авторизуется при каждом запросе. Токен
имеет вид lhrk_<секретная-часть> и передаётся в заголовке:
Токен:
- связан с конкретным роботом и аккаунтом;
- действует строго в пределах прав этого робота;
- показывается полностью только один раз при выпуске;
- не может быть просмотрен повторно после закрытия окна выпуска.
Если токен утрачен, отзовите его и выпустите новый.
Scope / Permissions¶
Роботу назначаются разрешения (scope), которые определяют доступные
методы API. Без нужного scope метод вернёт 403 permission_denied.
Доступные scopes:
| Scope | Что разрешает |
|---|---|
account.read |
чтение информации об аккаунте |
chats.read |
чтение списка чатов и обновлений |
Новые scopes будут публиковаться в документации по мере появления соответствующих методов в публичном API.
Доступные методы¶
Робот¶
GET /v1/robot— получить информацию о текущем роботе и токене: имя, scopes, состояние, префикс токена и срок действия. Достаточно авторизации токеном.GET /v1/robot/limits— получить текущее состояние лимитов по всем окнам: минута, час, сутки и месяц.
Аккаунт¶
GET /v1/account— профиль аккаунта, к которому привязан робот: имя пользователя, отображаемое имя, описание, аватар, статус верификации и дата создания. Персональные контактные данные и закрытые сведения аккаунта не возвращаются.
Требуемый scope: account.read.
Чаты¶
Робот может читать список доступных аккаунту групповых чатов и получать новые сообщения и события из тех чатов, на которые подписался. Чат доступен роботу, если владелец-аккаунт либо имеет право добавлять администраторов в этот чат, либо является создателем чата.
GET /v1/chats— список групповых чатов, в которых владелец-аккаунт имеет право добавлять администраторов или является создателем чата.POST /v1/chats/{chat_id}/subscribe— подписать робота на обновления конкретного чата.DELETE /v1/chats/{chat_id}/subscribe— отписаться от чата. После отписки неподтверждённые обновления по этому чату больше не возвращаются роботу.GET /v1/chats/subscriptions— список активных подписок робота.POST /v1/chats/updates— получение новых сообщений и событий чата: новое сообщение, вход или выход участника. Клиент передаётoffsetдля подтверждения уже обработанных обновлений и опрашивает endpoint с интервалом.
Все методы группы требуют scope chats.read. Подписка действует с
момента создания: сообщения, отправленные в чат до подписки, в
обновления не попадают. Если владелец-аккаунт не является создателем
чата и не имеет права добавлять администраторов, этот чат недоступен ни
в списке, ни для подписки.
На текущей стадии проекта действует ограничение «один чат — один робот»: к одному чату может быть привязан не более одного робота.
Подробное описание контракта, структуры обновлений и шаблонов цикла получения событий приведено в разделе Чаты.
Авторизация¶
Каждый запрос должен содержать заголовок Authorization с токеном
робота:
Если заголовок отсутствует, токен невалиден, отозван или истёк, API
возвращает 401.
Если у робота нет требуемого scope, API возвращает
403 permission_denied с указанием недостающего scope в
details.required_scope.
Ограничения по количеству¶
Для аккаунта и токенов действуют ограничения на количество активных объектов. Эти ограничения относятся к жизненному циклу роботов и токенов и не связаны с rate limits на запросы.
Роботы¶
На одном аккаунте может быть не более 3 активных роботов.
Активным считается робот в состоянии active. Роботы в состоянии
disabled не занимают слот. Чтобы создать ещё одного робота, отключите
одного из существующих активных роботов.
Токены¶
У одного робота может быть не более 3 активных токенов.
Активным считается токен, который не отозван и не истёк. Истёкшие и отозванные токены не занимают слот; место освобождается сразу после истечения срока действия или отзыва токена.
Лимиты¶
Для каждого робота действуют четыре одновременных бюджета запросов:
- в минуту;
- в час;
- в сутки;
- в месяц.
Текущее остающееся значение по каждому окну приходит в заголовках
ответа X-RateLimit-Remaining-*. При исчерпании любого из бюджетов API
возвращает 429 с заголовком Retry-After. Клиент должен подождать
указанное число секунд и повторить запрос.
Дополнительно действует общий лимит на запросы по IP-адресу клиента —
независимо от наличия токена. При превышении API возвращает 429
rate_limit_exceeded с заголовком Retry-After.
Ошибки¶
Все ошибки имеют единый JSON-формат:
{
"error": {
"code": "permission_denied",
"message": "Robot is not permitted to perform this action.",
"request_id": "req_a1b2c3d4...",
"details": { "required_scope": "chats.read" }
}
}
code— машинно-читаемый код ошибки.message— короткое человекочитаемое описание.request_id— идентификатор запроса для диагностики.details— дополнительные сведения, если они применимы к ошибке.
request_id также возвращается в заголовке X-Request-ID. Если клиент
передал X-Request-ID в запросе, API возвращает это значение обратно.
Для подписки на чат дополнительно используется ошибка
409 chat_already_subscribed: чат уже привязан к другому роботу.
Версионирование¶
В рамках одной major-версии API контракт не ломается:
- существующие поля ответа не удаляются и не меняют смысл;
- новые поля могут появляться, поэтому клиент должен игнорировать неизвестные поля;
- новые опциональные параметры запроса могут добавляться.
Ломающие изменения публикуются под новой версией (/v2/). Для
предыдущей major-версии заранее объявляется период поддержки и график
вывода из эксплуатации.
Принципы публичного контракта¶
Robot API спроектирован как:
- явный — поведение методов, права, ошибки и лимиты задокументированы;
- стабильный — контракт не меняется без предупреждения;
- версионируемый — ломающие изменения выходят под новой major-версией;
- безопасный — робот не получает больше полномочий, чем ему выдал владелец;
- предсказуемый — ошибки, лимиты и права работают единообразно.