Быстрый старт
Пять шагов от ключа до ленты событий. Понадобится терминал с curl, Node.js 18+ или Python 3.
Промпт для ИИ-агента
Скопируйте и вставьте в Claude, ChatGPT, Cursor, Claude Code или другого помощника. Агент прочитает документацию и будет соблюдать правила интеграции. Ключа в промпте нет.
Посмотреть текст промпта
# Промпт для ИИ-агента: интеграция с API Meliora
Ты помогаешь разработчику подключиться к публичному API Meliora. Meliora: сервис автоматических рассылок и переписки в Telegram для B2B-аутрича. В нем есть кабинет (организация), пространства, кампании (цепочки сообщений), лиды (участие контакта в кампании), сохраненная переписка и лента событий.
## Сначала прочитай документацию
Прежде чем писать код или отвечать, прочитай эти файлы. Они точнее твоей памяти:
1. https://docs.melioralab.io/llms.txt: оглавление документации со ссылками на Markdown каждой страницы.
2. https://docs.melioralab.io/llms-full.txt: вся документация одним файлом.
3. https://docs.melioralab.io/openapi.json: спецификация OpenAPI 3.1, единственный источник маршрутов, параметров и полей.
Если у тебя нет доступа к сети, попроси пользователя прислать содержимое этих файлов.
## Что умеет API
- Версия v1, только чтение. Записи нет: добавить контакты, запустить или остановить цепочку через API нельзя, это делается в кабинете.
- Базовый адрес: https://api.melioralab.io/v1
- Маршруты, все GET: /me, /workspaces, /campaigns, /campaigns/{id}, /leads, /leads/{id}, /leads/{id}/messages, /events.
- Ответы в JSON, время в UTC ISO 8601 с миллисекундами. Ошибки в формате application/problem+json с полями status, code, param и request_id. Обрабатывай ошибки по status и code, а не по тексту.
## Ключ и безопасность
- Ключ передается только в заголовке Authorization: Bearer <ключ>. Никогда не передавай ключ в адресе запроса.
- Бери ключ из переменной окружения MELIORA_API_KEY. Не проси пользователя вставить ключ в чат, не выводи ключ в ответах, коде, журналах и коммитах.
- Вызывай API только с сервера, не из браузера.
- Первый шаг всегда GET /v1/me: он показывает права (scopes), охват (scope) и лимиты ключа. Проверь, что прав хватает для задачи, прежде чем писать остальной код.
## Правила интеграции
- Списки листаются курсором: повторяй запрос с cursor=next_cursor и теми же фильтрами, пока has_more равен true. limit до 100, у /events до 200. Курсор списка живет 15 минут.
- Лента /events содержит два типа событий: lead.first_message_sent и lead.replied. Сохраняй next_cursor из каждого ответа, даже пустого. Применяй события страницы и сохраняй новый курсор в одной транзакции. Дедуплицируй события по event.id. Если has_more равен false, подожди перед следующим опросом, от минуты до часа.
- Первый запуск ленты: GET /v1/events?start=now дает курсор, затем сверь лидов через /v1/leads, затем читай ленту от этого курсора.
- Ответ 410 cursor_expired или 400 cursor_mismatch у ленты: отметь разрыв, получи новый курсор через start=now, сверь кампании и лидов, продолжи опрос.
- Ответы 429 и 503: повтори тот же запрос через Retry-After секунд со случайным разбросом, при повторных 503 увеличивай паузу. Ошибка не сдвигает курсор. Не повторяй в цикле запросы, получившие 401.
- Связь с CRM: ключ связи fields.record_id в карточке лида (/v1/leads, /v1/leads/{id}), только если record_id_status равен valid. В событиях record_id пока не передается: связывай событие с лидом по data.lead.id. Ник Telegram не уникален, не используй его как ключ.
- Статусы в CRM обновляй только вперед: ответ лида не должен откатываться в статус «в работе».
- Тексты сообщений доступны, только если у ключа есть право messages:read и включен «Текст сообщений».
- Пока не приходят: delivery_state со значениями failed и waiting_queue, automation_state со значением completed, reason_code со значениями schedule_window и service_unavailable. В событии ответа automation_stopped всегда null. Архив переписки и лента могут быть неполными: смотри meta.completeness и meta.coverage. Значение unknown нормально, это не ошибка.
## Чего не делать
- Не выдумывай маршруты, параметры, поля и значения, которых нет в openapi.json. Если нужного нет, так и скажи и предложи решение на существующих маршрутах.
- Не обещай запись через API: в v1 ее нет.
- Спорные места сверяй с документацией и давай ссылку на нужную страницу.
Документация: https://docs.melioralab.io
Поддержка: https://t.me/meliora_support
#Получите ключ
В раннем доступе ключ выпускаем мы: напишите в поддержку, какие права и какой охват нужны. Для первого знакомства хватит прав «Кампании», «Лиды» и «События».
Если в вашем кабинете открыт раздел Настройки › Интеграции › API, ключ может создать владелец или администратор кнопкой «Создать ключ».
Ключ показывается один раз. Сохраните его сразу: восстановить его нельзя, только перевыпустить.
#Сохраните ключ в окружении
Не вставляйте ключ в код и не передавайте его в адресе запроса. Положите его в переменную окружения:
export MELIORA_API_KEY="mel_live_..."#Проверьте доступ
Запрос GET /v1/me возвращает организацию, права и лимиты ключа. Он доступен с любым набором прав.
curl https://api.melioralab.io/v1/me \
-H "Authorization: Bearer $MELIORA_API_KEY"const res = await fetch('https://api.melioralab.io/v1/me', {
headers: { Authorization: `Bearer ${process.env.MELIORA_API_KEY}` },
});
console.log(res.status, await res.json());import os
import requests
resp = requests.get(
"https://api.melioralab.io/v1/me",
headers={"Authorization": f"Bearer {os.environ['MELIORA_API_KEY']}"},
timeout=15,
)
print(resp.status_code, resp.json())В ответе проверьте scopes и scope: это права и охват ключа. Если пришла ошибка, ее код и что делать описаны в руководстве Ошибки. Чаще всего это invalid_api_key: ключ скопирован не полностью или с лишним пробелом.
#Получите кампании и лидов
Список кампаний возвращается страницами, от старых к новым:
curl -G https://api.melioralab.io/v1/campaigns \
-H "Authorization: Bearer $MELIORA_API_KEY" \
-d status=activeВозьмите id нужной кампании и запросите ее лидов:
curl -G https://api.melioralab.io/v1/leads \
-H "Authorization: Bearer $MELIORA_API_KEY" \
-d campaign_id=4d8b2f73-6e1a-4c95-b7d0-8a3f5e2c9b14 \
-d limit=100Если в ответе has_more: true, передайте значение next_cursor в параметре cursor следующего запроса. Подробнее в руководстве Пагинация.
#Подпишитесь на события
Чтобы узнавать о новых сообщениях и ответах без обхода всех лидов, читайте ленту событий. Первый запрос с start=now возвращает пустую страницу и курсор, с которого начнется лента:
curl -G https://api.melioralab.io/v1/events \
-H "Authorization: Bearer $MELIORA_API_KEY" \
-d start=nowСохраните next_cursor и раз в минуту запрашивайте GET /v1/events?cursor=.... Каждый ответ содержит новый курсор, даже если событий нет: сохраняйте его всегда.
#Что дальше
- Опрос событий: цикл, который не теряет и не дублирует события, с примерами на Node.js и Python.
- Связь с CRM: как сопоставить лида с записью CRM через
record_id. - Лимиты и повторы: как обрабатывать 429 и 503.