MelioraAPI EN
Ранний доступ. Ключи выдаются по запросу. Как получить ключ

Пять шагов от ключа до ленты событий. Понадобится терминал с 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, ключ может создать владелец или администратор кнопкой «Создать ключ».

Ключ показывается один раз. Сохраните его сразу: восстановить его нельзя, только перевыпустить.

#Сохраните ключ в окружении

Не вставляйте ключ в код и не передавайте его в адресе запроса. Положите его в переменную окружения:

curl
export MELIORA_API_KEY="mel_live_..."

#Проверьте доступ

Запрос GET /v1/me возвращает организацию, права и лимиты ключа. Он доступен с любым набором прав.

curl https://api.melioralab.io/v1/me \
  -H "Authorization: Bearer $MELIORA_API_KEY"

В ответе проверьте scopes и scope: это права и охват ключа. Если пришла ошибка, ее код и что делать описаны в руководстве Ошибки. Чаще всего это invalid_api_key: ключ скопирован не полностью или с лишним пробелом.

#Получите кампании и лидов

Список кампаний возвращается страницами, от старых к новым:

curl
curl -G https://api.melioralab.io/v1/campaigns \
  -H "Authorization: Bearer $MELIORA_API_KEY" \
  -d status=active

Возьмите id нужной кампании и запросите ее лидов:

curl
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
curl -G https://api.melioralab.io/v1/events \
  -H "Authorization: Bearer $MELIORA_API_KEY" \
  -d start=now

Сохраните next_cursor и раз в минуту запрашивайте GET /v1/events?cursor=.... Каждый ответ содержит новый курсор, даже если событий нет: сохраняйте его всегда.

#Что дальше