- Главная
- Документация
- API компании
API: компания, сотрудники, интеграции и профиль
Настройки компании, права, сотрудники и приглашения, ключи, интеграции и профиль через API.
Всё, что администратор делает в «Настройках компании», а сотрудник в «Профиле», доступно и через API: настройки компании, права доступа, сотрудники и приглашения, услуги и быстрые ссылки, API-ключи, подключение и настройка Telegram, MAX и виджета, профиль, уведомления, компании и приглашения, обращения в поддержку. Заявки, звонки, почта и чаты описаны в документации API; там же общие правила: аутентификация, формат, ошибки, лимиты и идемпотентность.
Содержание
- Общие правила
- Области
- Компания
- Сотрудники
- Приглашения
- Права доступа
- Быстрые ссылки и услуги
- API-ключи
- Интеграции: Telegram, MAX, виджет
- Профиль, уведомления, компании
- Поддержка
- Примеры
1. Общие правила
- Все адреса работают только с ключом сотрудника и от его имени: те же проверки прав, что в кабинете. Ключ компании (выпущенный до появления ключей сотрудников) получает
403 SCOPE_REQUIRED. - Адреса компании, сотрудников, приглашений, прав, ключей компании и интеграций доступны только администратору или владельцу компании. Ключ менеджера получает
403 PERMISSION_DENIEDс полемpermission: "company.admin"и текстом «Действие доступно только администратору компании». Передача владения доступна только владельцу (permission: "company.owner"). - Ключ привязан к одной компании. Данные других компаний сотрудника видны только в профиле: их список (название, роль) и приглашения этого человека.
- Тело записи: JSON-объект. Неуказанные поля в
PATCHне меняются. Неизвестное поле тела в адресах компании и интеграций:400 VALIDATION_ERRORс перечнем допустимых полей вdetails. Логические поля принимаютtrue/false,1/0,"true"/"false". - Необратимые действия (передача владения, уход из компании, исключение сотрудника, отключение канала, новый код виджета, завершение сессий) требуют в теле
"confirm": true. Без него:400 CONFIRM_REQUIRED«Действие необратимо: передайте confirm: true». - Сотрудники, приглашения, ключи и каналы обозначаются
uuid. Время в ответах: ISO-8601 в UTC сZ. - Ошибки:
400 VALIDATION_ERRORс текстом, который видит кабинет;403 PERMISSION_DENIEDс полемpermission;404 NOT_FOUND(чужое и несуществующее неотличимы);409 CONFLICT(потолки, гонки, уже сделано);503 SERVICE_UNAVAILABLE(временный сбой, повторите позже). - Токены ботов, пароли и сырые ключи не попадают в ответы и журналы никогда.
2. Области
Новые области выдаются только по выбору при выпуске ключа: прежние ключи их не получают. Полная таблица областей: раздел 1 документации API.
| Область | Что даёт | Кому |
|---|---|---|
company:read | просмотр настроек компании, сотрудников, приглашений, прав, ключей и интеграций | администратор |
company:write | настройки компании, права доступа, услуги и быстрые ссылки; включает company:read | администратор, только себе |
team:write | приглашения, роли, личные права, менеджер по умолчанию, исключение сотрудников; включает company:read | администратор, только себе |
integrations:write | подключение и настройка Telegram, MAX и виджета; включает company:read | администратор, только себе |
keys:write | выпуск и отзыв API-ключей, не шире областей этого ключа | только себе |
company:transfer | передача владения компанией | владелец, только себе |
profile:read | профиль: имя, компании, приглашения, уведомления, свои ключи | только себе |
profile:write | имя и фото, уведомления, отвязка Telegram, компании и приглашения, уход из компании, завершение сессий; включает profile:read | только себе |
support:write | обращения в поддержку: отправка и статус | только себе |
Только себе. Области управления компанией и профилем сотрудник выпускает только себе: в профиле или администратор себе на вкладке «API-ключи». Выпуск такой области на ключ другого сотрудника отклоняется (в API: 403 PERMISSION_DENIED, permission: "keys.self_only"), а у ключа, выпущенного за другого, эти области не действуют и при вызове. Так никто не действует через API от чужого имени.
Ключ не выпускает ключ шире себя. Ключ с keys:write выпускает ключи только с теми областями, которые есть у него самого (с учётом включённых). Иначе 403 PERMISSION_DENIED, permission: "keys.scopes", «Ключ не может выпустить ключ с областями шире своих».
3. Компания
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/company | company:read | Настройки компании: uuid, name, timezone, outgoing_calls_create_leads, transcribe_calls (available, configured, enabled), chats (assign_mode, first_reply_in_progress или null без чатов), storage (used_bytes, limit_bytes), members (used, limit), owner, default_manager |
PATCH /api/v1/company | company:write | Любые из name, timezone, outgoing_calls_create_leads, transcribe_calls; ответ как у GET |
POST /api/v1/company/transfer-ownership | company:transfer, владелец | {"user": "<uuid>", "confirm": true}: новый владелец; ответ {owner}. Сотрудник не найден: 404; у получателя предел компаний во владении: 409 |
POST /api/v1/company/leave | profile:write | Покинуть компанию: {"transfer_to": "<uuid>" | "none", "revoke_keys": bool, "confirm": true}. Без transfer_to открытые заявки уходят менеджеру по умолчанию (или владельцу), как в профиле. Ответ {left, moved, keys_revoked}; после ответа ключ не действует. Владелец уйти не может: 403 |
4. Сотрудники
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/members | company:read | Сотрудники: uuid, name, email, role (owner, admin, manager), status, is_default, is_online, last_seen_at, joined_at, open_leads, overrides (личные права) |
GET /api/v1/members/{uuid} | company:read | Карточка: member, permissions (overrides и итоговые права effective с источником company, member или role), действующие ключи сотрудника api_keys |
POST /api/v1/members/{uuid}/role | team:write | {"role": "admin" | "manager", "revoke_keys": bool}; ответ {member, changed, invites_dropped, keys_revoked}. Владельца и последнего администратора понизить нельзя: 403 |
POST /api/v1/members/{uuid}/permissions | team:write | Личные права: visibility (inherit, own, all), actions ({"leads.create": "inherit" | "allow" | "deny", ...}), chats_mode (inherit, all, reply_owner, own_only); неуказанное не меняется. Ответ {permissions} |
POST /api/v1/members/{uuid}/default | team:write | {"on": true}: менеджер по умолчанию; {"on": false} снимает (если назначен другой: 409). Ответ {default_manager} |
POST /api/v1/members/{uuid}/remove | team:write | Исключить: {"transfer_to": "<uuid>" | "none", "revoke_keys": bool, "confirm": true}; ответ {moved, invites_dropped, keys_revoked}. Владельца исключить нельзя: 403 |
Права действий: leads.create, leads.edit, leads.status, leads.archive, leads.reassign, leads.merge, leads.comment, leads.export, leads.import (действия с заявками) и api.keys («Выпускать себе API-ключи в профиле»). Права компании, от которых считаются личные: раздел 6.
5. Приглашения
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/invites | company:read | Действующие приглашения: uuid, email, role, invited_by, inviter_not_admin, expires_at, created_at |
POST /api/v1/invites | team:write | {"email": "...", "role": "admin" | "manager"}; ответ 201 {invite, renewed, deduped, mailed, mail_capped, cap_reason} (201 и при продлении прежнего приглашения). Уже в компании или нет мест: 409. Поддерживает Idempotency-Key |
POST /api/v1/invites/{uuid}/resend | team:write | Отправить письмо ещё раз и продлить срок; ответ как у создания (200) |
POST /api/v1/invites/{uuid}/revoke | team:write | Отозвать приглашение; ответ {revoked: true} |
6. Права доступа
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/permissions | company:read | Права компании для менеджеров: visibility (own, all), actions ({"<право>": bool}), chats_mode, chats_available |
PATCH /api/v1/permissions | company:write | Любые из visibility, actions, chats_mode; неуказанное не меняется (право api.keys меняется, только если передано). Ответ как у GET |
7. Быстрые ссылки и услуги
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/sidebar-links | leads:read или company:read | Быстрые ссылки бокового меню {items: [{title, url}]}; видит любой сотрудник |
PUT /api/v1/sidebar-links | company:write | {"items": [{"title": "...", "url": "https://..."}]}, до 20; заменяет весь список |
PUT /api/v1/services/items | company:write | {"items": ["Монтаж", "Доставка"]}, до 50; заменяет весь список, пустой список скрывает поле «Услуга». Ответ {items: [{name}]}. Прочитать услуги: GET /api/v1/services |
8. API-ключи
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/api-keys | company:read | Ключи компании постранично (limit, cursor, include_revoked=1): uuid, name, prefix, user, user_state, scopes, created_by, author_state, created_at, last_used_at, revoked_at, mcp ({client_name} у подключений ИИ-ассистентов, иначе null). Сам ключ и его отпечаток не выдаются |
POST /api/v1/api-keys | keys:write, администратор | {"name": "...", "user": "<uuid>", "scopes": [...]}; ответ 201 {key, uuid}. Сырой ключ показывается один раз; повтор по Idempotency-Key здесь не работает намеренно (ключ не хранится). Потолки ключей: 409 |
POST /api/v1/api-keys/{uuid}/revoke | keys:write, администратор | Отозвать любой ключ компании, в том числе подключение ИИ-ассистента; ответ {revoked: true} |
Свои ключи сотрудник выпускает и отзывает адресами /api/v1/me/api-keys (раздел 10), если у него есть право «Выпускать себе API-ключи в профиле».
9. Интеграции: Telegram, MAX, виджет
Каналы, которые компания может подключать, перечислены в поле kinds ответа GET /api/v1/integrations; канал другого вида отвечает 404. Токены ботов передаются только в теле запроса и в ответах не возвращаются.
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/integrations | company:read | Каналы items, доступные виды kinds, настройки заявок из чатов lead_settings (assign_mode: previous, default, none; first_reply_in_progress) |
GET /api/v1/integrations/{uuid} | company:read | Один канал: {integration} |
POST /api/v1/integrations/telegram | integrations:write | {"token": "..."}; ответ 202 {integration, unchanged}: бота проверяет служба, итог в status |
POST /api/v1/integrations/max | integrations:write | {"token": "..."}; ответ 202 {integration, unchanged} |
POST /api/v1/integrations/widget | integrations:write | Подключить виджет; ответ 201 {integration, created: true} (уже подключён: 200, created: false) |
POST /api/v1/integrations/{uuid}/confirm | integrations:write | «Подтвердить подключение» бота, занятого другим сервисом |
POST /api/v1/integrations/{uuid}/max-takeover | integrations:write | Забрать бота MAX у другого сервиса |
POST /api/v1/integrations/{uuid}/disconnect | integrations:write | {"confirm": true}: отключить канал |
PATCH /api/v1/integrations/{uuid}/settings | integrations:write | Настройки канала (ниже); неуказанное не меняется |
POST /api/v1/integrations/{uuid}/widget-key | integrations:write | {"confirm": true}: новый код вставки виджета, старый перестаёт работать |
POST /api/v1/integrations/{uuid}/avatar | integrations:write | Фото оператора виджета: multipart/form-data, поле file |
POST /api/v1/integrations/{uuid}/avatar/remove | integrations:write | Убрать фото оператора |
PUT /api/v1/integrations/lead-settings | integrations:write | {"assign_mode": "...", "first_reply_in_progress": bool}: ответственный по заявкам из чатов и смена статуса по первому ответу |
GET /api/v1/integrations/{uuid}/stickers | company:read | Стикеры бота Telegram: наборы sets, полученные от клиентов received |
POST /api/v1/integrations/{uuid}/sticker-sets | integrations:write | {"link": "https://t.me/addstickers/..."}: добавить набор; ответ 201 {set} |
POST /api/v1/integrations/sticker-sets/{uuid}/remove | integrations:write | Убрать набор |
POST /api/v1/integrations/stickers/{uuid}/hide | integrations:write | {"hidden": bool}: скрыть или вернуть стикер |
Объект канала: uuid, kind (telegram, max, widget), status (состояние как на вкладке «Интеграции»: status, status_text, last_error и др.), bot_username, bot_url, deep_link_template (ссылка с меткой: {param} подставляет клиент), settings; у виджета ещё widget (key, embed_code, chat_url, avatar_url, settings), у MAX max (состояние подписки).
Настройки Telegram и MAX: title, default_manager (uuid или null), greeting (enabled, text), offhours (enabled, text), schedule (timezone, week: {"mon": [["09:00","18:00"]], ...}, exceptions: [{date, intervals}]), contact_button (enabled, text: просьба поделиться номером, caption: подпись кнопки). У виджета дополнительно appearance (title, color, position, offset_y, welcome, offline_text, operator_name), prechat (name, phone, email), consent (mode: notice, checkbox, off; policy_url), files (enabled, max_mb), visitor_mail (enabled), sites (mode: soft, strict; domains). Тексты согласия на обработку персональных данных сохраняются как переданы, без подстановки умолчаний.
10. Профиль, уведомления, компании
| Метод и путь | Область | Что делает |
|---|---|---|
GET /api/v1/me/profile | profile:read | uuid, name, email, avatar_url, telegram (linked), companies (uuid, name, role, is_key_company), invites (uuid, company_name, role, expires_at) |
PATCH /api/v1/me/profile | profile:write | {"name": "..."}; ответ как у GET |
POST /api/v1/me/avatar | profile:write | Фото профиля: multipart/form-data, поле avatar, JPG, PNG, GIF или WebP до 2 МБ; ответ {avatar_url} |
POST /api/v1/me/avatar/remove | profile:write | Убрать фото |
GET /api/v1/me/notifications | profile:read | Уведомления в Telegram по компании ключа: telegram_linked, new_own, new_all, comments_own, chat_own, chat_all, chat_sound, chats_available |
PATCH /api/v1/me/notifications | profile:write | Любые из этих полей, кроме telegram_linked и chats_available; другие компании не меняются |
POST /api/v1/me/telegram/unlink | profile:write | Отвязать Telegram; ответ {linked: false}. Привязать Telegram через API нельзя: это делает человек в Telegram |
POST /api/v1/me/sessions/revoke-all | profile:write | {"confirm": true}: выйти на всех устройствах; ответ {removed}. API-ключи и подключения ИИ-ассистентов не отзываются |
GET /api/v1/me/api-keys | profile:read | Свои ключи в компании ключа (include_revoked=1) |
POST /api/v1/me/api-keys | keys:write | {"name": "...", "scopes": [...]}: ключ себе; ответ 201 {key, uuid}. Нужно право api.keys |
POST /api/v1/me/api-keys/{uuid}/revoke | keys:write | Отозвать свой ключ этой компании |
POST /api/v1/me/companies | profile:write | {"name": "...", "user_name": "..."}: создать компанию; ответ 201 {company: {uuid, name, url}} |
POST /api/v1/me/invites/{uuid}/accept | profile:write | Принять приглашение (user_name необязательно); ответ {company} |
POST /api/v1/me/invites/{uuid}/decline | profile:write | Отклонить приглашение |
GET /api/v1/users/{uuid}/avatar | leads:read | Фото сотрудника компании ключа (ссылка author.avatar_url в ленте заявки) |
Покинуть компанию: POST /api/v1/company/leave (раздел 3). Вход по коду, выход из текущей сессии и переключение компании через API не делаются: ключ работает без сессии и привязан к одной компании.
11. Поддержка
| Метод и путь | Область | Что делает |
|---|---|---|
POST /api/v1/support/requests | support:write | {"subject": "...", "message": "...", "client_request_id": "<uuid v4>"}; ответ 202 {request, state, ticket, text, duplicate}. client_request_id обязателен: повтор того же обращения не создаёт второе. Не чаще 60 обращений в час (429 с Retry-After) |
GET /api/v1/support/requests/{uuid} | support:write | Состояние обращения: {request, state, ticket, text} |
12. Примеры
Переименовать компанию и сменить часовой пояс
curl -X PATCH https://crm.linkodium.com/api/v1/company \
-H "X-API-Key: $CRM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Окна Урала", "timezone": "Asia/Yekaterinburg"}'
Пригласить сотрудника
curl -X POST https://crm.linkodium.com/api/v1/invites \
-H "X-API-Key: $CRM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2a9e-0d4b-4b8e-9a37-2f5c8d1e7b40" \
-d '{"email": "manager@example.com", "role": "manager"}'
# 201 Created
{ "success": true, "data": { "invite": { "uuid": "...", "email": "manager@example.com", "role": "manager", ... },
"renewed": false, "deduped": false, "mailed": true, "mail_capped": false, "cap_reason": null } }
Включить приветствие бота Telegram
curl -X PATCH https://crm.linkodium.com/api/v1/integrations/0b8e4f3a-6c1d-4e2b-9f7a-3d5c8e1b2a90/settings \
-H "X-API-Key: $CRM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"greeting": {"enabled": true, "text": "Здравствуйте! Ответим в течение 10 минут."}}'
Остальные настройки канала остаются прежними.
Выпустить ключ для формы сайта
curl -X POST https://crm.linkodium.com/api/v1/api-keys \
-H "X-API-Key: $CRM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Форма на сайте", "user": "5d2f8a1c-3b4e-4f6a-8c9d-1e2f3a4b5c6d", "scopes": ["leads:create"]}'
# 201 Created
{ "success": true, "data": { "key": "crm_3f9a...", "uuid": "..." } }
Сохраните key сразу: показать его ещё раз CRM не сможет.