1. Главная
  2. Документация
  3. API компании

API: компания, сотрудники, интеграции и профиль

Настройки компании, права, сотрудники и приглашения, ключи, интеграции и профиль через API.

Всё, что администратор делает в «Настройках компании», а сотрудник в «Профиле», доступно и через API: настройки компании, права доступа, сотрудники и приглашения, услуги и быстрые ссылки, API-ключи, подключение и настройка Telegram, MAX и виджета, профиль, уведомления, компании и приглашения, обращения в поддержку. Заявки, звонки, почта и чаты описаны в документации API; там же общие правила: аутентификация, формат, ошибки, лимиты и идемпотентность.

Содержание

  1. Общие правила
  2. Области
  3. Компания
  4. Сотрудники
  5. Приглашения
  6. Права доступа
  7. Быстрые ссылки и услуги
  8. API-ключи
  9. Интеграции: Telegram, MAX, виджет
  10. Профиль, уведомления, компании
  11. Поддержка
  12. Примеры

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/companycompany: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/companycompany:writeЛюбые из name, timezone, outgoing_calls_create_leads, transcribe_calls; ответ как у GET
POST /api/v1/company/transfer-ownershipcompany:transfer, владелец{"user": "<uuid>", "confirm": true}: новый владелец; ответ {owner}. Сотрудник не найден: 404; у получателя предел компаний во владении: 409
POST /api/v1/company/leaveprofile:writeПокинуть компанию: {"transfer_to": "<uuid>" | "none", "revoke_keys": bool, "confirm": true}. Без transfer_to открытые заявки уходят менеджеру по умолчанию (или владельцу), как в профиле. Ответ {left, moved, keys_revoked}; после ответа ключ не действует. Владелец уйти не может: 403

4. Сотрудники

Метод и путьОбластьЧто делает
GET /api/v1/memberscompany: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}/roleteam:write{"role": "admin" | "manager", "revoke_keys": bool}; ответ {member, changed, invites_dropped, keys_revoked}. Владельца и последнего администратора понизить нельзя: 403
POST /api/v1/members/{uuid}/permissionsteam: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}/defaultteam:write{"on": true}: менеджер по умолчанию; {"on": false} снимает (если назначен другой: 409). Ответ {default_manager}
POST /api/v1/members/{uuid}/removeteam: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/invitescompany:readДействующие приглашения: uuid, email, role, invited_by, inviter_not_admin, expires_at, created_at
POST /api/v1/invitesteam:write{"email": "...", "role": "admin" | "manager"}; ответ 201 {invite, renewed, deduped, mailed, mail_capped, cap_reason} (201 и при продлении прежнего приглашения). Уже в компании или нет мест: 409. Поддерживает Idempotency-Key
POST /api/v1/invites/{uuid}/resendteam:writeОтправить письмо ещё раз и продлить срок; ответ как у создания (200)
POST /api/v1/invites/{uuid}/revoketeam:writeОтозвать приглашение; ответ {revoked: true}

6. Права доступа

Метод и путьОбластьЧто делает
GET /api/v1/permissionscompany:readПрава компании для менеджеров: visibility (own, all), actions ({"<право>": bool}), chats_mode, chats_available
PATCH /api/v1/permissionscompany:writeЛюбые из visibility, actions, chats_mode; неуказанное не меняется (право api.keys меняется, только если передано). Ответ как у GET

7. Быстрые ссылки и услуги

Метод и путьОбластьЧто делает
GET /api/v1/sidebar-linksleads:read или company:readБыстрые ссылки бокового меню {items: [{title, url}]}; видит любой сотрудник
PUT /api/v1/sidebar-linkscompany:write{"items": [{"title": "...", "url": "https://..."}]}, до 20; заменяет весь список
PUT /api/v1/services/itemscompany:write{"items": ["Монтаж", "Доставка"]}, до 50; заменяет весь список, пустой список скрывает поле «Услуга». Ответ {items: [{name}]}. Прочитать услуги: GET /api/v1/services

8. API-ключи

Метод и путьОбластьЧто делает
GET /api/v1/api-keyscompany: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-keyskeys:write, администратор{"name": "...", "user": "<uuid>", "scopes": [...]}; ответ 201 {key, uuid}. Сырой ключ показывается один раз; повтор по Idempotency-Key здесь не работает намеренно (ключ не хранится). Потолки ключей: 409
POST /api/v1/api-keys/{uuid}/revokekeys:write, администраторОтозвать любой ключ компании, в том числе подключение ИИ-ассистента; ответ {revoked: true}

Свои ключи сотрудник выпускает и отзывает адресами /api/v1/me/api-keys (раздел 10), если у него есть право «Выпускать себе API-ключи в профиле».

9. Интеграции: Telegram, MAX, виджет

Каналы, которые компания может подключать, перечислены в поле kinds ответа GET /api/v1/integrations; канал другого вида отвечает 404. Токены ботов передаются только в теле запроса и в ответах не возвращаются.

Метод и путьОбластьЧто делает
GET /api/v1/integrationscompany: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/telegramintegrations:write{"token": "..."}; ответ 202 {integration, unchanged}: бота проверяет служба, итог в status
POST /api/v1/integrations/maxintegrations:write{"token": "..."}; ответ 202 {integration, unchanged}
POST /api/v1/integrations/widgetintegrations:writeПодключить виджет; ответ 201 {integration, created: true} (уже подключён: 200, created: false)
POST /api/v1/integrations/{uuid}/confirmintegrations:write«Подтвердить подключение» бота, занятого другим сервисом
POST /api/v1/integrations/{uuid}/max-takeoverintegrations:writeЗабрать бота MAX у другого сервиса
POST /api/v1/integrations/{uuid}/disconnectintegrations:write{"confirm": true}: отключить канал
PATCH /api/v1/integrations/{uuid}/settingsintegrations:writeНастройки канала (ниже); неуказанное не меняется
POST /api/v1/integrations/{uuid}/widget-keyintegrations:write{"confirm": true}: новый код вставки виджета, старый перестаёт работать
POST /api/v1/integrations/{uuid}/avatarintegrations:writeФото оператора виджета: multipart/form-data, поле file
POST /api/v1/integrations/{uuid}/avatar/removeintegrations:writeУбрать фото оператора
PUT /api/v1/integrations/lead-settingsintegrations:write{"assign_mode": "...", "first_reply_in_progress": bool}: ответственный по заявкам из чатов и смена статуса по первому ответу
GET /api/v1/integrations/{uuid}/stickerscompany:readСтикеры бота Telegram: наборы sets, полученные от клиентов received
POST /api/v1/integrations/{uuid}/sticker-setsintegrations:write{"link": "https://t.me/addstickers/..."}: добавить набор; ответ 201 {set}
POST /api/v1/integrations/sticker-sets/{uuid}/removeintegrations:writeУбрать набор
POST /api/v1/integrations/stickers/{uuid}/hideintegrations: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/profileprofile:readuuid, name, email, avatar_url, telegram (linked), companies (uuid, name, role, is_key_company), invites (uuid, company_name, role, expires_at)
PATCH /api/v1/me/profileprofile:write{"name": "..."}; ответ как у GET
POST /api/v1/me/avatarprofile:writeФото профиля: multipart/form-data, поле avatar, JPG, PNG, GIF или WebP до 2 МБ; ответ {avatar_url}
POST /api/v1/me/avatar/removeprofile:writeУбрать фото
GET /api/v1/me/notificationsprofile:readУведомления в Telegram по компании ключа: telegram_linked, new_own, new_all, comments_own, chat_own, chat_all, chat_sound, chats_available
PATCH /api/v1/me/notificationsprofile:writeЛюбые из этих полей, кроме telegram_linked и chats_available; другие компании не меняются
POST /api/v1/me/telegram/unlinkprofile:writeОтвязать Telegram; ответ {linked: false}. Привязать Telegram через API нельзя: это делает человек в Telegram
POST /api/v1/me/sessions/revoke-allprofile:write{"confirm": true}: выйти на всех устройствах; ответ {removed}. API-ключи и подключения ИИ-ассистентов не отзываются
GET /api/v1/me/api-keysprofile:readСвои ключи в компании ключа (include_revoked=1)
POST /api/v1/me/api-keyskeys:write{"name": "...", "scopes": [...]}: ключ себе; ответ 201 {key, uuid}. Нужно право api.keys
POST /api/v1/me/api-keys/{uuid}/revokekeys:writeОтозвать свой ключ этой компании
POST /api/v1/me/companiesprofile:write{"name": "...", "user_name": "..."}: создать компанию; ответ 201 {company: {uuid, name, url}}
POST /api/v1/me/invites/{uuid}/acceptprofile:writeПринять приглашение (user_name необязательно); ответ {company}
POST /api/v1/me/invites/{uuid}/declineprofile:writeОтклонить приглашение
GET /api/v1/users/{uuid}/avatarleads:readФото сотрудника компании ключа (ссылка author.avatar_url в ленте заявки)

Покинуть компанию: POST /api/v1/company/leave (раздел 3). Вход по коду, выход из текущей сессии и переключение компании через API не делаются: ключ работает без сессии и привязан к одной компании.

11. Поддержка

Метод и путьОбластьЧто делает
POST /api/v1/support/requestssupport: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 не сможет.