Go
Типизированный клиент для Pachca API на Go. Синхронный, с контекстами (context.Context), автопагинацией и обработкой retry. Требуется Go 1.24+.
Быстрый старт
Установка
Создание клиента
Клиенту нужен токен бота или персональный токен. Какой выбрать и кто может его выпустить, описано в разделе Какой токен выбрать.
Первый запрос
Инициализация
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token | string | — | Bearer-токен для авторизации |
opts | ...ClientOption | — | Необязательные настройки. pachca.WithBaseURL(url) меняет базовый URL API, по умолчанию https://api.pachca.com/api/shared/v1. |
Все методы принимают context.Context первым аргументом — используйте его для таймаутов и отмены:
Все методы
| Метод | Метод API |
|---|---|
client.Oauth.RevokeToken() | POSTОтзыв токена |
client.Oauth.ExchangeToken() | POSTОбмен кода на токен |
client.Oauth.GetTokenInfo() | GETИнформация о токене |
client.Chats.CreateChat() | POSTНовый чат |
client.Chats.RequestExport() | POSTЭкспорт сообщений |
client.Chats.ListChats() | GETСписок чатов |
client.Chats.DownloadExport() | GETСкачать архив экспорта |
client.Chats.GetChat() | GETИнформация о чате |
client.Chats.ListCompanyChats() | GETСписок чатов пространства |
client.Chats.UpdateChat() | PUTРедактирование чата |
client.Chats.ArchiveChat() | PUTАрхивация чата |
client.Chats.UpdateChatAvatar() | PUTЗагрузка аватара чата |
client.Chats.UnarchiveChat() | PUTРазархивация чата |
client.Chats.MarkChatUnread() | PUTОтметка чата непрочитанным |
client.Chats.DeleteChatAvatar() | DELETEУдаление аватара чата |
client.Profile.GetProfile() | GETСвой профиль |
client.Profile.GetStatus() | GETСвой статус |
client.Profile.UpdateProfileAvatar() | PUTЗагрузка своего аватара |
client.Profile.UpdateStatus() | PUTНовый свой статус |
client.Profile.DeleteProfileAvatar() | DELETEУдаление своего аватара |
client.Profile.DeleteStatus() | DELETEУдаление своего статуса |
client.Users.CreateUser() | POSTНовый сотрудник |
client.Users.ListUsers() | GETСписок сотрудников |
client.Users.GetUser() | GETИнформация о сотруднике |
client.Users.GetUserStatus() | GETСтатус сотрудника |
client.Users.UpdateUser() | PUTРедактирование сотрудника |
client.Users.UpdateUserAvatar() | PUTЗагрузка аватара сотрудника |
client.Users.UpdateUserStatus() | PUTНовый статус сотрудника |
client.Users.DeleteUser() | DELETEУдаление сотрудника |
client.Users.DeleteUserAvatar() | DELETEУдаление аватара сотрудника |
client.Users.DeleteUserStatus() | DELETEУдаление статуса сотрудника |
client.GroupTags.CreateTag() | POSTНовый тег |
client.GroupTags.ListTags() | GETСписок тегов |
client.GroupTags.GetTag() | GETИнформация о теге |
client.GroupTags.GetTagUsers() | GETСписок сотрудников тега |
client.GroupTags.UpdateTag() | PUTРедактирование тега |
client.GroupTags.DeleteTag() | DELETEУдаление тега |
client.Members.AddTags() | POSTДобавление тегов |
client.Members.AddMembers() | POSTДобавление участников |
client.Members.ListMembers() | GETСписок участников чата |
client.Members.UpdateMemberRole() | PUTРедактирование роли участника |
client.Members.RemoveTag() | DELETEИсключение тега из чата |
client.Members.LeaveChat() | DELETEВыход из чата |
client.Members.RemoveMember() | DELETEИсключение участника |
client.Threads.CreateThread() | POSTНовый тред |
client.Threads.CreateStandaloneThread() | POSTНовый самостоятельный тред |
client.Threads.ListThreads() | GETСписок тредов |
client.Threads.GetThread() | GETИнформация о треде |
client.Messages.CreateMessage() | POSTНовое сообщение |
client.Messages.Unfurl() | POSTUnfurl (разворачивание ссылок) |
client.Messages.PinMessage() | POSTЗакрепление сообщения |
client.Messages.ListChatMessages() | GETСписок сообщений чата |
client.Messages.GetMessage() | GETИнформация о сообщении |
client.Messages.UpdateMessage() | PUTРедактирование сообщения |
client.Messages.DeleteMessage() | DELETEУдаление сообщения |
client.Messages.UnpinMessage() | DELETEОткрепление сообщения |
client.ReadMembers.ListReadMembers() | GETСписок прочитавших сообщение |
client.Reactions.AddReaction() | POSTДобавление реакции |
client.Reactions.ListReactions() | GETСписок реакций |
client.Reactions.RemoveReaction() | DELETEУдаление реакции |
client.ImportantMessages.AddMessageToImportant() | POSTДобавление сообщения в важные |
client.ImportantMessages.ListImportantMessages() | GETСписок важных сообщений |
client.ImportantMessages.RemoveMessageFromImportant() | DELETEУдаление сообщения из важных |
client.Search.SearchChats() | GETПоиск чатов |
client.Search.SearchMessages() | GETПоиск сообщений |
client.Search.SearchUsers() | GETПоиск сотрудников |
client.Tasks.CreateTask() | POSTНовое напоминание |
client.Tasks.ListTasks() | GETСписок напоминаний |
client.Tasks.GetTask() | GETИнформация о напоминании |
client.Tasks.UpdateTask() | PUTРедактирование напоминания |
client.Tasks.DeleteTask() | DELETEУдаление напоминания |
client.Drafts.CreateDraft() | POSTНовый черновик |
client.Drafts.ListDrafts() | GETСписок черновиков |
client.Drafts.GetDraft() | GETИнформация о черновике |
client.Drafts.UpdateDraft() | PUTРедактирование черновика |
client.Drafts.DeleteDraft() | DELETEУдаление черновика |
client.Views.OpenView() | POSTОткрытие представления |
client.Views.SubmitViewResponse() | POSTОтвет на отправку формы |
client.Bots.SelfRecreateBotToken() | POSTРотация собственного токена бота |
client.Bots.CreateBot() | POSTНовый бот |
client.Bots.RecreateBotToken() | POSTРотация токена бота |
client.Bots.RotateBotClientSecret() | POSTРотация секрета клиента |
client.Bots.CreateBotToken() | POSTНовый токен бота |
client.Bots.ReissueBotToken() | POSTПеревыпуск токена бота |
client.Bots.ListBots() | GETСписок ботов |
client.Bots.GetBot() | GETИнформация о боте |
client.Bots.GetBotScopes() | GETКаталог прав бота |
client.Bots.ListBotTokens() | GETСписок токенов бота |
client.Bots.ListCompanyBots() | GETСписок ботов пространства |
client.Bots.GetWebhookEvents() | GETИстория событий |
client.Bots.GetWebhookEventsStream() | GETПоток событий |
client.Bots.SelfUpdateBotWebhook() | PUTСаморегистрация вебхука бота |
client.Bots.UpdateBot() | PUTРедактирование бота |
client.Bots.UpdateBotAvatar() | PUTЗагрузка аватара бота |
client.Bots.UpdateBotToken() | PUTИзменение токена бота |
client.Bots.DeleteBot() | DELETEУдаление бота |
client.Bots.DeleteBotAvatar() | DELETEУдаление аватара бота |
client.Bots.DeleteBotToken() | DELETEУдаление токена бота |
client.Bots.DeleteWebhookEvent() | DELETEУдаление события истории |
client.Security.GetAuditEvents() | GETЖурнал аудита событий |
client.CustomProperties.ListProperties() | GETСписок дополнительных полей |
client.Files.UploadFile() | POSTЗагрузка файла |
client.Files.GetUploadParams() | POSTПолучение подписи, ключа и других параметров |
client.Files.DownloadFile() | GETСкачивание файла |
Запросы
Все методы — синхронные и возвращают (*T, error).
GET с параметрами:
POST с телом запроса:
Простой вызов по ID:
Указатели для необязательных полей
Для необязательных полей используйте функцию Ptr():
Поле, которое не задано, в запрос не попадает, поэтому метод обновления меняет только то, что вы передали.
Значение null
Некоторые поля API принимают null: например, null в oauth_client выключает у бота авторизацию от имени сотрудника, а в webhook.kind удаляет входящий вебхук. Чтобы отправить null, назовите поле в NullFields той же модели запроса так, как оно называется в Go:
NullFields есть у моделей запроса с такими полями, а в комментарии к нему перечислены имена, которые в нём можно указать. С другим именем SDK возвращает ошибку и запрос не отправляет.
Пагинация
Поля пагинации называются как в API, но в PascalCase: Meta.Paginate.NextPage, PrevPage, HasNext и HasPrev, а у методов поиска ещё Meta.Total. Необязательные поля, в том числе HasNext, приходят указателями. Какие поля приходят у каждого метода и как понять, что страницы закончились, описано в разделе Пагинация.
Ручная пагинация
Цикл заканчивается на HasNext, равном false, или на пустой странице. Так же обходят страницы методы *All().
Автопагинация
Для каждого метода с пагинацией есть *All() вариант:
Доступные методы автопагинации:
| Метод | Возвращает |
|---|---|
Security.GetAuditEventsAll() | []AuditEvent |
Bots.ListBotsAll() | []BotResponse |
Bots.ListBotTokensAll() | []BotAccessToken |
Bots.ListCompanyBotsAll() | []CompanyBotResponse |
Bots.GetWebhookEventsAll() | []WebhookEvent |
Chats.ListChatsAll() | []Chat |
Chats.ListCompanyChatsAll() | []Chat |
Drafts.ListDraftsAll() | []Draft |
GroupTags.ListTagsAll() | []GroupTag |
GroupTags.GetTagUsersAll() | []User |
ImportantMessages.ListImportantMessagesAll() | []Message |
Members.ListMembersAll() | []User |
Messages.ListChatMessagesAll() | []Message |
Reactions.ListReactionsAll() | []Reaction |
Search.SearchChatsAll() | []Chat |
Search.SearchMessagesAll() | []Message |
Search.SearchUsersAll() | []User |
Tasks.ListTasksAll() | []Task |
Threads.ListThreadsAll() | []Thread |
Users.ListUsersAll() | []User |
Обработка ошибок
SDK возвращает два типа ошибок (реализуют интерфейс error):
ApiError
Возникает при ошибках 400, 403, 404, 409, 410, 422 с массивом errors в теле:
Поля ApiErrorItem:
| Поле | Тип | Описание |
|---|---|---|
Key | string | Поле, вызвавшее ошибку |
Value | any | Переданное значение |
Message | string | Текст ошибки |
Code | ValidationErrorCode | Код валидации |
Payload | map[string]any | Дополнительные данные |
Код статуса ответа — в поле StatusCode. Если ответ с ошибкой пришёл без тела или не в JSON, SDK тоже возвращает *ApiError: с кодом статуса и пустым Errors. Так бывает с ответом 404 без тела от метода GETПоток событий, когда история событий выключена, и со страницей прокси при 502.
OAuthError
Возникает при ошибке авторизации: 401, а также 403 с кодом insufficient_scope или role_forbidden и отказе при обмене кода на токен. Код — в поле error, список кодов — в разделе Ошибки авторизации:
Поле Err — перечисление OAuthErrorCode: его сравнивают с константой, например pachca.OAuthErrorCodeInsufficientScope, а строкой оно становится через string(oauthErr.Err). Если у ответа 401 нет тела в формате OAuth, SDK возвращает *ApiError с кодом статуса 401.
Повторные запросы
Паузы между попытками, к каждой SDK добавляет случайную величину до 25%:
- 429 с заголовком
Retry-After: срок из заголовка - 429 без заголовка: 1 сек, 2 сек, 4 сек
- 5xx: ~10 сек, ~20 сек, ~40 сек
Сетевую ошибку без ответа сервера SDK не повторяет и сразу возвращает её из метода. Тело запроса для каждой попытки SDK создаёт заново через req.GetBody().
Общие правила повторов — в разделе Повторные запросы.
Типы
Все типы экспортируются из пакета:
Перечисление — строковый тип, поэтому значение, которого SDK ещё не знает, приходит в ответе как есть.
Все перечисления SDK: AuditEventKey, AuditLoginGrantDenyReason, AuditLoginGrantDevicePlatform, BotCanEdit, BotEventName, BotTemplateEngine, BotTriggerOn, BotWebhookKind, BotWhoCanAdd, ChatActivity, ChatAvailability, ChatMemberRole, ChatMemberRoleFilter, ChatSortField, ChatSubtype, CustomPropertyDataType, DraftRepetitionInterval, DraftType, FileTarget, FileType, InviteStatus, MemberEventType, MessageEntityType, MessageSearchSort, MessageSortField, OAuthErrorCode, OAuthScope, OAuthTokenTypeHint, ReactionEventType, SearchEntityType, SearchSortOrder, SortOrder, TaskKind, TaskStatus, UserCreateRole, UserEventType, UserRole, UserRoleInput, ValidationErrorCode, VideoCallEventType, VoiceTranscriptStatus и WebhookEventType.
Тело вебхука
Тела событий вебхука описаны типами MessageWebhookPayload, ReactionWebhookPayload, ButtonWebhookPayload, ViewSubmitWebhookPayload, ChatMemberWebhookPayload, CompanyMemberWebhookPayload, LinkSharedWebhookPayload и VideoCallWebhookPayload. Тип WebhookPayloadUnion объединяет их: при разборе JSON он выбирает тип по полям type и event и заполняет одно поле-указатель.
Подпись проверяйте по исходному телу до разбора, как в разделе Безопасность. Те же типы отдают методы PollWebhookEvents и PollWebhookPayloads, которые забирают события из истории: пример — в разделе Пример поллинга.
Примеры
Отправка сообщения:
Список сотрудников:
Создание напоминания: