Для розробників
Публічний API Beta
Створюйте інтеграції з робочим простором за допомогою захищених API-ключів з обмеженими областями доступу та стабільного версіонованого JSON-контракту.
Відкрити інтерактивний довідник APIШвидкий старт
- 01
Відкрийте API-ключі
Відкрийте Налаштування, виберіть Для розробників, знайдіть API-ключі, а потім виберіть Створити ключ. Створювати ключі можуть власники й адміністратори.
- 02
Створіть API-ключ
Заповніть поле Назва, виберіть Термін дії (днів), укажіть Доступ до каналів — Усі канали або Вибрані канали — і виберіть у розділі Області доступу мінімальний набір, потрібний вашій інтеграції. Запит буде успішним, лише якщо ключ має саме ту дію над ресурсом, якої вимагає ендпоінт. Виберіть Створити ключ.
- 03
Збережіть API-ключ
Повний ключ показується лише один раз. Скопіюйте його в менеджер секретів, а потім виберіть Ключ збережено.
- 04
Надсилайте ключ
Використовуйте Bearer-токен або надсилайте те саме значення в заголовку
x-api-key. Ніколи не додавайте ключі до рядків запиту чи коду в браузері.
cURL
curl https://www.usesonny.com/api/v1/contacts?limit=25 \
--header "Authorization: Bearer sonny_your_key"Ключі в безпеці
- Безпека ключів
- Ключ складається з префікса
sonny_і 64 випадкові символи. Ключі зберігаються лише як односторонній хеш, мають налаштовуваний термін дії та ліміт у 1 800 запитів на хвилину для кожного ключа. Ключ прив’язаний до одного робочого простору. - Щоб відкликати ключ, натисніть кнопку кошика поруч із ним. Підтвердьте Відкликати API-ключ?, вибравши Видалити. Ключ миттєво перестане працювати.
- Авторизація під час кожного виклику
- Sonny перевіряє хеш і області доступу, а потім повторно перевіряє активне членство творця ключа в робочому просторі, його роль і стан оплати. Якщо цього користувача видалити або деактивувати, його ключі одразу перестануть працювати.
- Обмеження вибраними каналами застосовується до кожного виклику REST API та MCP. Ендпоінти контактів, властивостей, тегів і керування вебхуками потребують доступу до всіх каналів. Для створення розмов із форм можна використовувати contacts:write разом із conversations:write на вибраних каналах; окремі ендпоінти контактів і далі охоплюють увесь робочий простір.
Області доступу
contacts:readcontacts:writetags:readtags:writeconversations:readconversations:writemessages:readmessages:writemessages:sendwebhooks:readwebhooks:writekb:readkb:writecsat:readattachments:writemembers:readcontact-memory:readcontact-memory:writereporting:read
Ресурси
- Контакти
- Керуйте контактами, типізованими властивостями, фільтрами за точним значенням і спогадами про клієнтів. Архівуйте контакт або остаточно видаліть його разом з усіма розмовами на запит щодо захисту даних.
- Джерела
- Дізнавайтеся, які джерела налаштовано і чи підтримує кожне з них чат, ел. пошту або обидва.
- Розмови
- Створюйте звернення з форм, фільтруйте розмови, що потребують уваги, призначайте агентів чи команди, відкладайте, додавайте теги й оновлюйте пакетно.
- Синхронізація
- Відтворюйте зміни робочого простору з надійної стрічки та записи про видалення за збереженим курсором.
- Учасники та команди
- Знаходьте колег, яким можна призначати розмови, і дізнавайтеся про їхню доступність і фактичний доступ до каналів.
- Звіти
- Читайте звіти про підтримку, команду, AI, знання, ліди й доступність.
- Повідомлення
- Читайте історію повідомлень і текст, витягнутий із вкладень, завантажуйте приватні файли, додавайте внутрішні нотатки, надсилайте й редагуйте відповіді клієнтам.
- Вебхуки
- Керуйте ендпоінтами, підписками, тестами, доставками й повторними спробами.
- База знань
- Створюйте, читайте, оновлюйте й видаляйте статті та категорії довідкового центру для кожного джерела.
- Задоволеність клієнтів
- Читайте оцінки CSAT для робочого простору, кожного каналу й кожної розмови та переглядайте окремі оцінки з фільтрами за значенням оцінки, коментарем, відповідальним або періодом.
Використання Sonny з AI-інструментів
Sonny MCP надає кожну операцію публічного API як інструмент. Клієнти підключаються через вхід за OAuth 2.1 — або за API-ключем з обмеженими областями доступу, — і кожен виклик зберігає ті самі області доступу, межі робочого простору та бізнес-правила.
Прочитати посібник із Sonny MCPВідповіді та помилки
Відповіді з колекціями використовують data і за потреби містять пагінацію. Кожна відповідь містить x-request-id; ви можете передати власний безпечний ID запиту, і Sonny поверне його. Помилки повертають безпечне повідомлення, не розкриваючи чутливих деталей реалізації.
{
"error": {
"type": "validation_error",
"message": "Invalid email address",
"requestId": "req_01J..."
}
}400- Неправильні вхідні дані, JSON, запит або курсор.
401- API-ключ відсутній, недійсний, прострочений або не має потрібної області доступу.
402- Стан оплати робочого простору блокує цей запит.
403- Роль творця ключа в робочому просторі не дозволяє цю дію.
404- Ресурс не існує в робочому просторі ключа.
409- Запит конфліктує з наявним ресурсом.
410- Термін дії курсора синхронізації минув. Завантажте поточний стан і відтворюйте зміни з нового курсора.
413- Завантажений файл перевищує дозволений розмір.
422- Джерело не має каналу ел. пошти, або надіслане значення поля недійсне.
429- Перевищено ліміт запитів для ключа.
500- Сталася неочікувана помилка. Повторіть спробу з ID запиту.
503- Черга доставки вебхуків переповнена. Повторіть спробу пізніше.
Ліміти запитів
Кожен API-ключ може надсилати до 1 800 запитів на хвилину. Кожна відповідь повідомляє про поточне вікно через стандартні заголовки RateLimit-Limit, RateLimit-Remaining і RateLimit-Reset, тож клієнти можуть самі регулювати частоту запитів, а не вгадувати. Коли ліміт перевищено, API повертає 429 із заголовком Retry-After — зачекайте вказану кількість секунд, перш ніж повторити спробу.
Версіонування та застарівання
Версія API вказується в шляху URL (/api/v1). У межах версії ми вносимо лише зворотно сумісні доповнення — нові ендпоінти, нові необов’язкові поля, нові значення enum. Несумісні зміни виходять у новій версії, а перш ніж вивести з ужитку будь-який ендпоінт v1, ми попереджаємо щонайменше за шість місяців: на цій сторінці, листом власникам робочих просторів з активними API-ключами та через заголовки Deprecation і Sunset на відповідних ендпоінтах.
Редагування надісланої відповіді
- Надайте API-ключу або MCP-підключенню області доступу
messages:readіmessages:send, а також доступ до каналу відповіді. - Прочитайте повідомлення розмови й скопіюйте ID надісланої вами відповіді, написаної людиною. API-ключ діє від імені свого творця; OAuth — від імені підключеного колеги.
- Надішліть новий текст за допомогою запиту нижче або викличте в MCP
edit_messageзconversationId,messageIdіbody. - Перевірте повернене повідомлення. Його ID, вкладення, позначка про прочитання та початковий час надсилання залишаються незмінними.
curl --request PATCH \
https://www.usesonny.com/api/v1/conversations/conversation_1/messages/message_1 \
--header "Authorization: Bearer sonny_your_key" \
--header "Content-Type: application/json" \
--data '{"body":"The corrected reply"}'Редагування виправляє історію розмови та підключені чат-клієнти. Воно не надсилає ще один лист чи сповіщення, а вже доставлені листи залишаються без змін. Редагувати можна лише власні відповіді клієнтам, написані людиною; вхідні повідомлення, відповіді бота, внутрішні нотатки та відповіді інших колег — не можна. Перш ніж редагувати, дочекайтеся завершення доставки листа. Новий текст має містити від 1 до 50 000 символів; попередній HTML і попередній перегляд посилань очищаються. Інтеграції отримують вебхук message.updated і подію синхронізації. Якщо опитувати лише новіші ID повідомлень, редагування не буде знайдено; використовуйте надійну стрічку синхронізації.
Створення розмови з форми
Надішліть дані форми на POST /api/v1/conversations. Sonny знаходить або створює контакт за ел. поштою, зберігає відповіді та відкриває вхідну розмову в каналі ел. пошти вибраного джерела. Застосовуються команда каналу, правила призначення та сповіщення. Агенти відповідають ел. поштою.
- Створіть ключ з
conversations:writeіcontacts:write. Можна обмежити його вибраними каналами клієнта. ID джерела можна знайти черезGET /api/v1/sources, для чого також потрібнаconversations:read. - У n8n додайте вузол HTTP Request: метод POST, URL
https://www.usesonny.com/api/v1/conversations. Збережіть ключ в облікових даних типу Header Auth:Authorizationзі значеннямBearer sonny_your_key. - Увімкніть Send Body, виберіть JSON і Using JSON, а потім перемкніть усе поле JSON у режим Expression і вставте цей приклад. Замініть ID джерела й зіставте вхідні поля з вашою формою. Використовуйте стабільний унікальний ID надсилання форми, щоб повторна спроба мала те саме значення.
{{ {
sourceId: "YOUR_CLIENT_SOURCE_ID",
contact: { email: $json.email, name: $json.name },
subject: "Website enquiry",
message: $json.message,
fields: {
Company: String($json.company ?? ""),
Budget: String($json.budget ?? ""),
Service: String($json.service ?? "")
},
externalId: "website-form-" + $json.submissionId
} }}Більше параметрів вузла — у посібнику n8n щодо HTTP Request. Відповідний інструмент MCP — create_conversation з тим самим вмістом запиту й дозволами.
Нові назви полів стають текстовими властивостями. Наявні поля типу «число», «URL», «дата» й «вибір» мають отримувати коректні рядкові значення; неправильне значення повертає 422 із назвою поля, і нічого не зберігається. Дати приймаються у форматі ISO або як мітки часу; значення вибору мають збігатися з одним із варіантів. Приймається до 50 полів із назвами до 100 символів і значеннями до 5000. Властивості відображаються в контакті й на бічній панелі розмови. Обидва варіанти тексту повідомлення містять копію відповідей, зокрема коли ви передаєте необов’язковий htmlMessage.
Необов’язкове поле tags приймає до 20 ID наявних тегів робочого простору. Відповідь містить conversation, короткі дані contact, message і deduplicated. Нові надсилання повертають 201. Повторне використання externalId у тому самому джерелі повертає 200 з початковими ID і deduplicated: true; змінений вміст ігнорується. Без зовнішнього ID кожен виклик створює нову розмову. Вкладення під час створення та автовідповіді AI не підтримуються.
Робочі процеси агентів
Сортування, дії та синхронізація
REST і MCP мають однакові дозволи й робочі процеси. Облікові дані можуть лише звужувати ваш поточний доступ до каналів; якщо канал вилучено з вашого членства, він зникає й з ваших інтеграцій.
Знаходьте розмови, що потребують уваги
Фільтруйте за awaitingReply, unread, unassigned, assigneeId, agentGroupId, snoozed, priority або tagIds. Фільтр «очікує відповіді» ігнорує внутрішні нотатки; «непрочитані» стосується конкретного автентифікованого колеги. «Не призначено» означає відсутність окремого відповідального, навіть якщо призначено команду. Теги збігаються з будь-яким переданим ID. Передайте propertyId (поле типу «Список» із list_properties) разом із propertyValues, щоб знайти контакти з будь-яким із цих варіантів; у REST повторюйте propertyValues для кожного варіанта.
GET /api/v1/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 починається з першого вхідного повідомлення після останньої відповіді; подальші повідомлення та внутрішні нотатки його не скидають. Запускайте це сканування черги очікування за розкладом, навіть коли вебхуки не надходять, щоб старі гілки знову спливали.
Наздоганяйте зміни, не перечитуючи вхідні
Використовуйте GET /api/v1/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, обидва в межах каналу розмови. Ці виклики не надсилають відповідь і не позначають, що продавець отримав відповідь.
Призначайте й оновлюйте роботу пакетами
Знаходьте активних колег і команди, яким можна призначати розмови, через GET /api/v1/members and /teams (members:read). Відповіді містять доступність і фактичний доступ до каналів, без адрес ел. пошти. Використовуйте conversations:write, щоб змінювати status, priority, assigneeId, agentGroupId, snoozedUntil, snoozedUntilReply, addTagIds або removeTagIds.
POST /api/v1/conversations/batch
{
"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», «дата» й «вибір» перевіряються за визначенням поля.
PUT /api/v1/contacts/contact_1/properties
{ "propertyName": "Plan", "value": "Pro" }
GET /api/v1/contacts?property[Plan]=ProФільтри властивостей шукають точний збіг збережених рядків; якщо вказано кілька властивостей, мають збігатися всі. Значення, додані через API, позначаються як дані API в Co-Pilot і автовідповідачі. Наявні правила для верифікованих клієнтів і джерел і далі діють. Звичайні значення внутрішніх полів, введені вручну, як і раніше не входять до цього контексту AI.
Читайте ті самі звіти, що й ваша команда
З reporting:read викликайте GET /api/v1/reporting/{kind}. Типи звітів: 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 МБ. POST /api/v1/attachments приймає поля multipart file і conversationId. Відповідь містить id і expiresAt. Передайте до 10 attachmentIds у відповідь чи нотатку протягом години. Кожне завантаження прив’язане до вашого користувача й розмови та може бути використане лише один раз. Невикористані завантаження видаляються після завершення терміну дії.
POST /api/v1/conversations/conversation_1/reply
{ "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. Зберігайте API-ключ на своєму сервері й обмежте для нього доступ до каналів.
- Створіть категорію, а потім синхронізуйте статтю як чернетку. Перед публікацією перевірте її форматування й доступ.
- Налаштуйте доступ до довідкового центру, опублікуйте статтю й перевірте, як її бачить читач. Для подальших оновлень використовуйте пагінацію та стабільні зовнішні ID.
Керуйте аудиторіями клієнтів
Створюйте групи за атрибутами верифікованих клієнтів і застосовуйте їх до довідкового центру, категорії чи статті. Мають виконуватися всі успадковані обмеження. Облікові дані API та MCP діють як персонал у межах своїх областей доступу; щоб перевірити доступ читача, скористайтеся попереднім переглядом і протестуйте справжній сеанс клієнта.
Налаштування й перевірка аудиторій довідкового центруПов’язані посібники
- Sonny MCPBeta
Підключайте AI-асистентів до роботи з вхідними, пам’яті про клієнтів, звітів і файлів через OAuth або ключі з обмеженими правами.
- ВебхукиBeta
Підписуйтеся на підписані події робочого простору й перевіряйте спроби доставки.
- Контакти
Як у Sonny створюються контакти, як ними керувати, позначати тегами й об’єднувати.
- Вхідні
Статуси, пріоритети, призначення, відкладення, масові дії та клавіатурні скорочення.