Для розробників
Sonny MCP Beta
Підключіть до свого робочого простору AI-асистентів, сумісних з MCP, — Claude та будь-який клієнт, що підтримує Model Context Protocol, — з тими самими областями доступу й обмеженнями, що й у публічному API.
Читати посібник із публічного APIШвидкий старт
- 01
Додайте Sonny до Claude
У Claude або Cowork додайте користувацький конектор з URL
https://www.usesonny.com/api/mcp. Sonny підтримує автоматичну реєстрацію клієнтів, тож копіювати client ID чи секрет не потрібно. - 02
Схваліть доступ до робочого простору
Claude відкриє Sonny у вашому браузері. Увійдіть, перегляньте запитувані дозволи й виберіть робочий простір для підключення. OAuth 2.1 із PKCE обмежує отримані токени доступу й оновлення саме цим схваленням.
- 03
Попросіть асистента скористатися Sonny
Інструменти самі себе описують, тож достатньо запиту на кшталт «Покажи мої відкриті розмови». Асистенти бачать, які інструменти лише читають дані, а які вносять руйнівні зміни, тож хороший клієнт запитає дозволу, перш ніж щось змінити.
Claude Code
claude mcp add --transport http sonny https://www.usesonny.com/api/mcpJSON-конфігурація клієнта
{
"mcpServers": {
"sonny": {
"url": "https://www.usesonny.com/api/mcp"
}
}
}Сумісність з API-ключами
Якщо клієнт не може пройти OAuth, створіть API-ключ з обмеженими областями доступу в розділі «Налаштування → Для розробників» і передавайте його в заголовку Authorization Bearer. API-ключі й надалі повністю підтримуються для інтеграцій «сервер — сервер» і старіших клієнтів.
"Authorization": "Bearer sonny_your_key"Як Sonny захищає виклики інструментів
- Один робочий простір, вибрані області доступу
- Кожен виклик виконується в межах робочого простору, вибраного під час надання згоди в OAuth, або робочого простору, якому належить API-ключ. Інструмент працює, лише якщо облікові дані мають потрібну область доступу.
- Чесні анотації інструментів
- Інструменти лише для читання позначено відповідно; інструменти, що оновлюють і видаляють дані, позначено як руйнівні, тож клієнт може запитати підтвердження, перш ніж діяти.
- Ті самі бізнес-правила
- Інструменти виконують ті самі робочі процеси, що й публічний API: історія аудиту, сповіщення й вебхуки працюють так, ніби зміну вніс колега.
Тримайте асистента в межах одних вхідних
Вибрані канали API-ключа автоматично застосовуються до кожного виклику інструментів. API-ключі й OAuth-підключення також враховують поточний доступ підключеного колеги до каналів. Для OAuth-підключень або ключів з доступом до всіх каналів: робочі простори часто мають кілька джерел — по одному на продукт чи бренд. Нехай асистент один раз викличе list_sources, щоб їх виявити, а потім передає sourceId у list_conversations — так запитання про один продукт повертатимуть лише розмови цього продукту. Кожна розмова також містить власний sourceId, тож результати можна перевірити.
Запустіть недорогий цикл підтримки
- Відстежуйте зміни: почніть зі стійкої стрічки
sync, зберігайте nextCursor після обробки кожної сторінки й відкидайте дублікати ID подій. Щоб вибрати роботу, викликайтеlist_conversationsіз sourceId, awaitingReply: true, snoozed: "false" і compact: true. Внутрішні нотатки не приховують повідомлень клієнтів без відповіді. - Читайте лише новий текст: для кожної зміненої розмови викликайте
list_messages, передаючи вafterID останнього повідомлення або позначку часу ISO, і встановлюйтеincludeHtml: false, якщо HTML листа справді не потрібен. - Чекайте на зображення й відео: коли
list_messagesповертаєreadsInProgress, виконайте виклик із йогоnextStep. ЙогоwaitSecondsутримує відповідь, доки не будуть готові розпізнавання зображень і транскрипти відео, тож чекати вручну не потрібно. - Завантажуйте контекст клієнта:
get_conversationповертаєidentityVerified, підписаніverifiedTraits, а також сторінку, з якої почалася розмова, і контекст клієнтського застосунку. Якщо в ній єcontact.id, передайте цей ID уlist_conversations, щоб завантажити попередні розмови клієнта. - Пробуджуйте на вимогу: використовуйте вебхук для
message.createdіз фільтром за джерелом, щоб негайно пробуджувати агента, а потім надолужуйте через sync. Стійка стрічка працює незалежно від доставки вебхуків. Щоб створити вебхук і обмежити його ID джерел, використовуйте облікові дані з доступом до всіх каналів; агент і далі працює зі своїми обліковими даними, обмеженими джерелом.
Каталог інструментів
Кожна операція публічного API доступна як інструмент. Потрібну область доступу вказано поруч із кожним.
- get_connection_info
- Read connection access
conversations:read- get_conversation_context
- Read support context
conversations:read- list_conversation_checks
- Read conversation checks
conversations:read- record_conversation_check
- Record a conversation check
conversations:write- get_status
- Check Sonny status
conversations:read- create_conversation
- Create a conversation from a form
conversations:write- import_conversations
- Import conversation history
conversations:write- upload_attachment
- Upload a message attachment
attachments:write- list_properties
- List custom properties
contacts:read- get_contact_properties
- Read contact properties
contacts:read- set_contact_property
- Set a contact property
contacts:write- list_contact_memories
- Read customer memories
contact-memory:read- create_contact_memory
- Save a customer memory
contact-memory:write- delete_contact_memory
- Remove a customer memory
contact-memory:write- get_report
- Read a support report
reporting:read- sync
- Read workspace changes
conversations:read- batch_update_conversations
- Update conversations in a batch
conversations:write- list_members
- List members
members:read- list_teams
- List teams
members:read- list_tags
- List tags
tags:read- create_tag
- Create a tag
tags:write- get_tag
- Get a tag
tags:read- update_tag
- Update a tag
tags:write- delete_tag
- Delete a tag
tags:write- add_conversation_tag
- Add a conversation tag
conversations:write- remove_conversation_tag
- Remove a conversation tag
conversations:write- list_contacts
- List contacts
contacts:read- create_contact
- Create a contact
contacts:write- get_contact
- Get a contact
contacts:read- update_contact
- Update a contact
contacts:write- archive_contact
- Archive a contact
contacts:write- erase_contact
- Permanently erase a contact
contacts:write- list_channels
- List conversation channels
conversations:read- list_sources
- List sources
conversations:read- list_conversations
- List conversations
conversations:read- get_conversation
- Get a conversation
conversations:read- update_conversation
- Update a conversation
conversations:write- list_messages
- List messages
messages:read- create_internal_note
- Create an internal note
messages:write- edit_message
- Edit a sent reply
messages:send- send_message
- Send a reply to the customer
messages:send- list_webhooks
- List webhook endpoints
webhooks:read- create_webhook
- Create a webhook endpoint
webhooks:write- list_webhook_events
- List webhook event types
webhooks:read- update_webhook
- Update a webhook endpoint
webhooks:write- delete_webhook
- Delete a webhook endpoint
webhooks:write- test_webhook
- Queue a test event
webhooks:write- list_webhook_deliveries
- List webhook deliveries
webhooks:read- retry_webhook_delivery
- Retry a failed delivery
webhooks:write- list_kb_articles
- List knowledge base articles
kb:read- create_kb_article
- Create a knowledge base article
kb:write- get_kb_article
- Get a knowledge base article
kb:read- update_kb_article
- Update a knowledge base article
kb:write- delete_kb_article
- Delete a knowledge base article
kb:write- list_kb_categories
- List knowledge base categories
kb:read- create_kb_category
- Create a knowledge base category
kb:write- update_kb_category
- Update a knowledge base category
kb:write- delete_kb_category
- Delete a knowledge base category
kb:write- get_csat_summary
- Get CSAT scores
csat:read- list_csat_ratings
- List CSAT ratings
csat:read- get_conversation_csat
- Get a conversation's CSAT rating
csat:read- reorder_kb_articles
- Reorder knowledge base articles
kb:write- upsert_kb_article
- Sync a knowledge base article
kb:write- reorder_kb_categories
- Reorder knowledge base categories
kb:write- upsert_kb_category
- Sync a knowledge base category
kb:write- get_kb_category
- Get a knowledge base category
kb:read- get_help_center
- Get help center settings
kb:read- update_help_center
- Update help center settings
kb:write- upload_kb_media
- Upload a help center image
kb:write- list_kb_audiences
- List audiences
kb:read- create_kb_audience
- Create audience
kb:write- update_kb_audience
- Update audience
kb:write- delete_kb_audience
- Delete audience
kb:write
Робочі процеси агентів
Сортування, дії та синхронізація
REST і MCP мають однакові дозволи й робочі процеси. Облікові дані можуть лише звужувати ваш поточний доступ до каналів; якщо канал вилучено з вашого членства, він зникає й з ваших інтеграцій.
Знаходьте розмови, що потребують уваги
Фільтруйте за awaitingReply, unread, unassigned, assigneeId, agentGroupId, snoozed, priority або tagIds. Фільтр «очікує відповіді» ігнорує внутрішні нотатки; «непрочитані» стосується конкретного автентифікованого колеги. «Не призначено» означає відсутність окремого відповідального, навіть якщо призначено команду. Теги збігаються з будь-яким переданим ID. Передайте propertyId (поле типу «Список» із list_properties) разом із propertyValues, щоб знайти контакти з будь-яким із цих варіантів; у REST повторюйте propertyValues для кожного варіанта.
list_conversations({ status: "open", awaitingReply: true, compact: true, sort: "waitingSince", direction: "asc" })Сортуйте за waitingSince, lastMessageAt, createdAt або бізнес-пріоритетом у напрямку asc чи desc. За однакових значень порядок визначають ID. Якщо фільтри не вказано, зберігаються compact=false і snoozed=any. У REST tagIds приймає ID через кому; MCP також приймає масив. waitingSince починається з першого вхідного повідомлення після останньої відповіді; подальші повідомлення та внутрішні нотатки його не скидають. Запускайте це сканування черги очікування за розкладом, навіть коли вебхуки не надходять, щоб старі гілки знову спливали.
Наздоганяйте зміни, не перечитуючи вхідні
Використовуйте sync з conversations:read. Надійна стрічка містить зміни розмов, теги, повідомлення, властивості контактів, спогади та записи про видалення. Кожен вміст також потребує власної області доступу на читання: тексти повідомлень — messages:read, а спогади — contact-memory:read. Облікові дані з обмеженнями отримують лише дозволені канали.
- Почніть без курсора, переходьте за nextCursor, доки hasMore не стане false, і збережіть цей курсор.
- Прочитайте поточні списки розмов і контактів та всю історію, потрібну для початкового стану.
- Відтворіть зміни від збереженого курсора, щоб охопити все, що змінилося під час цього читання. Обробіть кожну сторінку, а потім збережіть nextCursor.
Усувайте дублікати за id події: доставка відбувається за принципом «щонайменше один раз», тож подальші дії потребують власного захисту від дублікатів. Запит без курсора охоплює останню годину, а не повний знімок. Події зберігаються 30 днів; HTTP 410 resync_required означає, що потрібно знову завантажити початковий стан. Робіть це також після розширення областей доступу або доступу до каналів. Використовуйте limit до 100 і maxBodyChars до 10 000 (за замовчуванням 500). Установіть compact=true, щоб отримувати поля повідомлень textPreview/textTruncated з обмеженням 200 символів замість body/bodyTruncated. Вебхуки можуть «будити» агента; стрічка залишається доступною і без підписок на вебхуки, і тоді, коли доставка вебхуків затримується.
Записуйте перевірки один раз і діліться результатом
Перш ніж повторювати дослідження, прочитайте list_conversation_checks (GET /api/v1/conversations/{conversationId}/checks). Збережіть результат через record_conversation_check (PUT за тим самим шляхом), передавши key, result, checkedBy і необов’язковий reference для ID або URL картки. Наприклад: key=product-version, result=Shopstar Go verified, checkedBy=Engineer, reference=card-X. Sonny записує actorId автентифікованого користувача й позначку часу checkedAt. Повторне використання key замінює лише цю перевірку; це поточний стан, а не журнал історії. Читання потребує conversations:read, а запис — conversations:write, обидва в межах каналу розмови. Ці виклики не надсилають відповідь і не позначають, що продавець отримав відповідь.
Призначайте й оновлюйте роботу пакетами
Знаходьте активних колег і команди, яким можна призначати розмови, через list_members / list_teams (members:read). Відповіді містять доступність і фактичний доступ до каналів, без адрес ел. пошти. Використовуйте conversations:write, щоб змінювати status, priority, assigneeId, agentGroupId, snoozedUntil, snoozedUntilReply, addTagIds або removeTagIds.
batch_update_conversations({
conversationIds: ["conversation_1", "conversation_2"],
updates: { agentGroupId: "team_1", assignment: "round_robin" }
})Розподіл по черзі (round robin) вибирає доступного учасника команди, який має доступ до каналу розмови. Якщо відповідного учасника немає, одиночне оновлення повертає 409, а елемент пакета завершується помилкою. Кожен пакет приймає до 100 унікальних ID і атомарно застосовує одне оновлення до кожної розмови. Перевіряйте кожен результат { id, ok, error? }: деякі елементи можуть завершитися помилкою. Пакети підпадають під поточний ліміт за кількістю запитів, без зваженого врахування кількості елементів.
Діліться контекстом клієнта із Sonny AI
Переглядайте, зберігайте й видаляйте спогади про контакт з contact-memory:read/write. Передавайте і contactId, і доступний sourceId; контакт повинен мати розмову в цьому джерелі. Збережені факти проходять ту саму перевірку, обробку дублікатів і обмеження, що й у застосунку, та записуються як спогади, додані вручну.
Читайте визначення властивостей на /api/v1/properties, а значення читайте чи встановлюйте на /api/v1/contacts/{contactId}/properties. MCP надає list_properties, get_contact_properties і set_contact_property. Вони потребують contacts:read/write і доступу до всіх каналів. Укажіть рівно один із propertyId або propertyName з рядковим значенням або null, щоб очистити значення. Значення типів «текст», «число», «URL», «дата» й «вибір» перевіряються за визначенням поля.
set_contact_property({ contactId: "contact_1", propertyName: "Plan", value: "Pro" })
list_contacts({ property: { Plan: "Pro" } })Фільтри властивостей шукають точний збіг збережених рядків; якщо вказано кілька властивостей, мають збігатися всі. Значення, додані через API, позначаються як дані API в Co-Pilot і автовідповідачі. Наявні правила для верифікованих клієнтів і джерел і далі діють. Звичайні значення внутрішніх полів, введені вручну, як і раніше не входять до цього контексту AI.
Читайте ті самі звіти, що й ваша команда
З reporting:read викликайте get_report({ kind, filters }). Типи звітів: overview, volume, response-times, agents, sources, tags, csat, ai, knowledge, leads і online-hours. Overview поєднує кількості, час відповіді та CSAT. Фільтри: period (1–365 днів, за замовчуванням 30), парні дати from/to (to не включається), granularity (day/month), source, assigneeId і tagId. Source приймає all, all-chat, all-email, website:{id} або email:{id}.
Звіти використовують ті самі запити, що й панель, і поточні перевірки доступу. Knowledge враховує дати й дозволені канали незалежно від вибраного джерела, відповідального чи тегу. Online hours вимірює присутність доступних колег у робочому просторі; кількість розмов у ньому й надалі обмежена каналами. Наявні ендпоінти /csat зберігають окрему область доступу csat:read і можуть описувати іншу вибірку.
Надсилайте файли з відповідями чи внутрішніми нотатками
Надайте attachments:write і завантажте для розмови файл розміром до 25 МБ. upload_attachment приймає conversationId, fileName, contentType і dataBase64. Відповідь містить id і expiresAt. Передайте до 10 attachmentIds у відповідь чи нотатку протягом години. Кожне завантаження прив’язане до вашого користувача й розмови та може бути використане лише один раз. Невикористані завантаження видаляються після завершення терміну дії.
send_message({ conversationId: "conversation_1", attachmentIds: ["upload_1"] })Відповіді потребують messages:send; внутрішні нотатки потребують messages:write і ніколи не потрапляють до клієнтів. Підтримуються повідомлення лише з вкладеннями. Відповіді ел. поштою містять файли в межах ліміту розміру листа, а для решти — посилання на завантаження; листи з офлайн-чату містять посилання на файли. Посилання в листах працюють, доки існує вкладення, тож отримувачі можуть відкрити їх пізніше. Пересилання листа надає доступ до цих файлів. Перевіряйте emailDeliveryStatus, щоб виявити помилки доставки.
Авторизоване читання повідомлень містить downloadUrl, downloadExpiresAt, aiStatus, aiDescription та aiExtractedText, а також videoTranscripts для відео за посиланнями (Loom, Vimeo та інші). Посилання на завантаження діють 15 хвилин; щоб отримати нові, прочитайте повідомлення знову. Нові завантаження через API/MCP зберігаються приватно. Старіші вкладення залишаються публічними й позначаються access=legacy_public: їхня початкова URL-адреса не має терміну дії. Читання повідомлення запускає розпізнавання його зображень, якщо робочий простір має Sonny AI. Розпізнавання зображень і розшифровки відео завершуються невдовзі після надходження повідомлення: поки якісь із них ще тривають, відповідь починається з readsInProgress, де nextStep вказує точний виклик, який потрібно зробити. Передайте waitSeconds (до 30), щоб дочекатися їх в одному запиті. Повідомлення у віджеті й у реальному часі, які бачать клієнти, ніколи не містять витягнутого тексту чи розшифровок.
База знань
Синхронізація із зовнішнього джерела
Синхронізуйте статті й категорії за стабільними зовнішніми ID, імпортуйте Markdown або HTML, завантажуйте зображення, задавайте порядок і керуйте аудиторіями читачів. Повторний upsert оновлює наявний вміст.
- Виберіть sourceId свого каналу й надайте kb:read і kb:write. Для необов’язкового пошуку джерел
list_sourcesтакож потребує conversations:read. - Створіть категорію, а потім синхронізуйте статтю як чернетку. Перед публікацією перевірте її форматування й доступ.
- Налаштуйте доступ до довідкового центру, опублікуйте статтю й перевірте, як її бачить читач. Для подальших оновлень використовуйте пагінацію та стабільні зовнішні ID.
Керуйте аудиторіями клієнтів
Створюйте групи за атрибутами верифікованих клієнтів і застосовуйте їх до довідкового центру, категорії чи статті. Мають виконуватися всі успадковані обмеження. Облікові дані API та MCP діють як персонал у межах своїх областей доступу; щоб перевірити доступ читача, скористайтеся попереднім переглядом і протестуйте справжній сеанс клієнта.
Налаштування й перевірка аудиторій довідкового центруПов’язані посібники
- Публічний APIBeta
Сортуйте й синхронізуйте розмови, діліться контекстом клієнтів, читайте звіти й надсилайте файли за допомогою API-ключів з обмеженими правами.
- ВебхукиBeta
Підписуйтеся на підписані події робочого простору й перевіряйте спроби доставки.
- Команда та ролі
Запрошуйте користувачів, створюйте команди й розберіться, який доступ мають власник, адміністратор, агент і спостерігач.