LanaChat

API: фанаты, переписки и сообщения

Чтение 7 минОбновлено Markdown

Фанат, это пользователь Telegram, который написал одному из ваших авторов. Переписка, это чат между этим фанатом и одним аккаунтом Telegram. Сообщения отправляются AI, участником команды или скриптом. Эти эндпоинты соответствуют разделам Live Convs и Fans в Console.

Endpoints #

MethodPathDescriptionPermissionStatus
GET/fansСписок фанатов (creator_id=, status=, list_id=, q=, spent_min=)can_fan_readPlanned
GET/fans/{id}Один фанат: языки, траты, статус, списки, заметкиcan_fan_readPlanned
PATCH/fans/{id}Изменить псевдоним фаната, язык ответа или заметкиcan_chatPlanned
GET/fans/{id}/salesПокупки фанатаcan_sales_readPlanned
POST/fans/importИмпортировать прошлых фанатов и сообщения (ничего не отправляет)can_fan_importPlanned
GET/fan-listsСписки (VIP, win back…)can_fan_readPlanned
POST/fan-listsСоздать списокcan_chatPlanned
POST/fan-lists/{id}/membersДобавить фанатов в списокcan_chatPlanned
DELETE/fan-lists/{id}/membersУдалить фанатов из спискаcan_chatPlanned
GET/conversationsСписок переписок (creator_id=, account_id=, state=, unread=true)can_fan_readPlanned
GET/conversations/{id}Одна переписка и кто отвечаетcan_fan_readPlanned
GET/conversations/{id}/messagesСообщения, сначала новые (translate=en добавляет перевод)can_fan_readPlanned
POST/conversations/{id}/messagesОтправить сообщение от имени автора (текст, медиа, offer)can_chatPlanned
POST/conversations/{id}/reactionsДобавить или убрать реакцию на сообщение фанатаcan_chatPlanned
POST/conversations/{id}/takeoverЧеловек берет переписку: AI перестает отвечать этому фанатуcan_chatPlanned
POST/conversations/{id}/releaseВернуть переписку AIcan_chatPlanned
POST/conversations/{id}/scriptЗапустить скрипт в этой перепискеcan_chatPlanned
POST/conversations/{id}/readОтметить переписку как прочитаннуюcan_chatPlanned

The fan object #

{
  "id": "fan_921",
  "display_name": "Marco",
  "username": "marco_dl",
  "creator_id": "cr_lea",
  "purchases": 9,
  "spent": { "stars": 1450, "net_cents": 1885 },
  "lists": ["vip"]
}
FieldTypeDescription
idstringНачинается с fan_
display_namestringИмя фаната в Telegram
usernamestring or nullTelegram @username фаната, без @
creator_idstringАвтор, которому написал этот фанат
purchasesnumberПодтвержденные покупки
spentobjectВсего потрачено: stars и net_cents в центах США после комиссии Telegram и возвратов
listsarray of stringsId списков фанатов, в которых состоит этот фанат

У фаната также есть языки, на которых он пишет, статус, заметки команды, псевдоним и язык ответа, как на странице Fans.

The conversation object #

{
  "id": "conv_1001_88231",
  "fan_id": "fan_921",
  "creator_id": "cr_lea",
  "account_id": "acc_1001",
  "state": "ai",
  "status": { "tag": "active", "reason": null },
  "unread": 2,
  "last_message_at": "2026-10-06T14:02:51Z",
  "spent": { "stars": 1450, "net_cents": 1885 },
  "source_link_id": "lnk_3"
}
FieldTypeDescription
idstringНачинается с conv_
fan_id, creator_id, account_idstringКто с кем общается и через какой Telegram аккаунт
statestringКто отвечает: ai, human (взята человеком), script (идет скрипт) или off
statusobjecttag (статусы как на странице Fans) и reason, если есть
unreadnumberСообщения фаната, которые еще не прочитаны
last_message_atstringISO 8601, UTC
spentobjectСколько фанат потратил в этой переписке: stars и net_cents
source_link_idstring or nullТрек-ссылка, с которой пришел фанат

status.tag соответствует статусам на странице Fans (review, safety_hold, converted, lost, underage…). Переписку в статусе off по причине безопасности нельзя вернуть AI (409).

The message object #

{
  "id": "msg_77120",
  "from": "creator",
  "sent_by": "ai",
  "text": "Made this one this morning…",
  "media": [ { "id": "med_5521", "locked": true, "stars": 300 } ],
  "at": "2026-10-06T14:02:51Z"
}
FieldTypeDescription
idstringНачинается с msg_
fromstringcreator или fan
sent_bystringДля сообщений автора: ai, human или script
member_idstringУчастник команды, если sent_by, human из Console
token_idstringТокен доступа, если отправлено через API
textstringТекст сообщения
mediaarrayОтправленные медиа: id, locked (платное и еще не куплено) и цена в stars
reactionsarrayРеакции на сообщение фаната
statusstringДля ваших сообщений: queued, sent, read или failed
atstringISO 8601, UTC

sent_by определяет комиссию с продажи, поэтому выставляется сервером и не может быть задан в вашем запросе.

The sale object #

{
  "sale_id": "sale_8812",
  "fan_id": "fan_921",
  "creator_id": "cr_lea",
  "account_id": "acc_1001",
  "conversation_id": "conv_1001_88231",
  "stars": 300,
  "net_cents": 390,
  "sent_by": "ai",
  "kind": "offer"
}
FieldTypeDescription
sale_idstringНачинается с sale_
fan_id, creator_id, account_id, conversation_idstringКто купил, у кого и где
starsnumberЦена в Telegram Stars
net_centsnumberЧистая сумма в центах США (1 Star = $0.013)
sent_bystringai, human или script: кто отправил offer, влияет на комиссию
kindstringЧто куплено, например offer

Такой же объект приходит через webhook, событие sale.completed.

Fans #

List fans #

GET /fans · can_fan_read

ParameterTypeRequiredDescription
creator_idstringNoТолько фанаты этого автора
statusstringNoСтатус со страницы Fans, например converted
list_idstringNoТолько фанаты из этого списка
qstringNoЧасть имени или username фаната
spent_minnumberNoТолько фанаты, потратившие не меньше Stars
limit, cursornumber, stringNoПагинация
curl "https://api.lanachat.ai/v1/fans?creator_id=cr_lea&spent_min=1000&limit=50" \
  -H "Authorization: Bearer $LANACHAT_TOKEN"
{
  "data": [
    { "id": "fan_921", "display_name": "Marco", "username": "marco_dl", "creator_id": "cr_lea", "purchases": 9, "spent": { "stars": 1450, "net_cents": 1885 }, "lists": ["vip"] }
  ],
  "next_cursor": null
}

Get a fan #

GET /fans/{id} · can_fan_read

curl https://api.lanachat.ai/v1/fans/fan_921 \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

Ответ, это fan object. Неизвестный id вернет 404.

Update a fan #

PATCH /fans/{id} · can_chat

Передавайте только изменяемые поля: псевдоним, язык ответа или заметки фаната. Ответ, обновленный фанат.

curl -X PATCH https://api.lanachat.ai/v1/fans/fan_921 \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"notes": "Likes beach sets, buys at night"}'

List a fan's purchases #

GET /fans/{id}/sales · can_sales_read

curl https://api.lanachat.ai/v1/fans/fan_921/sales \
  -H "Authorization: Bearer $LANACHAT_TOKEN"
{
  "data": [
    { "sale_id": "sale_8812", "fan_id": "fan_921", "creator_id": "cr_lea", "account_id": "acc_1001", "conversation_id": "conv_1001_88231", "stars": 300, "net_cents": 390, "sent_by": "ai", "kind": "offer" }
  ],
  "next_cursor": null
}

Постраничный список sale objects. Для итогов по дням, ссылкам или источникам используйте stats.

Import fan history #

POST /fans/import · can_fan_import

Добавляет прошлых фанатов и их сообщения в вашу базу, например из другого сервиса. Никогда не отправляет сообщения фанатам и не подтверждает покупки.

curl -X POST https://api.lanachat.ai/v1/fans/import \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @fans-history.json

Fan lists #

List fan lists #

GET /fan-lists · can_fan_read

curl https://api.lanachat.ai/v1/fan-lists \
  -H "Authorization: Bearer $LANACHAT_TOKEN"
{
  "data": [ { "id": "vip", "name": "VIP" } ],
  "next_cursor": null
}

Create a list #

POST /fan-lists · can_chat

ParameterTypeRequiredDescription
namestringYesИмя, отображаемое на странице Fans
curl -X POST https://api.lanachat.ai/v1/fan-lists \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"name": "Win back"}'

Ответ, новый список (201).

Add or remove fans #

POST /fan-lists/{id}/members и DELETE /fan-lists/{id}/members · can_chat

ParameterTypeRequiredDescription
fan_idsarray of stringsYesФанаты для добавления или удаления
curl -X POST https://api.lanachat.ai/v1/fan-lists/vip/members \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"fan_ids": ["fan_921"]}'

DELETE принимает такое же тело запроса. Неизвестный список или фанат вернет 404.

Conversations #

List conversations #

GET /conversations · can_fan_read

ParameterTypeRequiredDescription
creator_idstringNoТолько этот автор
account_idstringNoТолько этот Telegram аккаунт
statestringNoai, human, script или off
unreadbooleanNotrue: только переписки с непрочитанными сообщениями фаната
limit, cursornumber, stringNoПагинация
curl "https://api.lanachat.ai/v1/conversations?creator_id=cr_lea&unread=true" \
  -H "Authorization: Bearer $LANACHAT_TOKEN"
{
  "data": [
    { "id": "conv_1001_88231", "fan_id": "fan_921", "creator_id": "cr_lea", "account_id": "acc_1001", "state": "ai", "status": { "tag": "active", "reason": null }, "unread": 2, "last_message_at": "2026-10-06T14:02:51Z", "spent": { "stars": 1450, "net_cents": 1885 }, "source_link_id": "lnk_3" }
  ],
  "next_cursor": null
}

Get a conversation #

GET /conversations/{id} · can_fan_read

curl https://api.lanachat.ai/v1/conversations/conv_1001_88231 \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

Ответ, conversation object; state показывает, кто отвечает.

Read messages #

GET /conversations/{id}/messages · can_fan_read

ParameterTypeRequiredDescription
translatestringNoКод языка, например en: каждое сообщение также получит перевод
limit, cursornumber, stringNoПагинация, сначала новые
curl "https://api.lanachat.ai/v1/conversations/conv_1001_88231/messages?limit=2" \
  -H "Authorization: Bearer $LANACHAT_TOKEN"
{
  "data": [
    { "id": "msg_77120", "from": "creator", "sent_by": "ai", "text": "Made this one this morning…", "media": [ { "id": "med_5521", "locked": true, "stars": 300 } ], "at": "2026-10-06T14:02:51Z" },
    { "id": "msg_77119", "from": "fan", "text": "show me more 😍", "reactions": [], "at": "2026-10-06T14:02:10Z" }
  ],
  "next_cursor": "eyJpZCI6Im1zZ183NzExOCJ9"
}

sent_by может быть ai, human (с member_id) или script.

Send a message #

POST /conversations/{id}/messages · can_chat

ParameterTypeRequiredDescription
textstringYes, или mediaТекст от имени автора
mediaarrayNoМедиа из Vault: id и stars для продажи платно по этой цене
send_atstring or nullNoВремя по ISO 8601 для отложенной отправки (до 7 дней вперед); null, отправить сейчас
curl -X POST https://api.lanachat.ai/v1/conversations/conv_1001_88231/messages \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"text": "Only for you, tonight 🔥", "media": [{"id": "med_5522", "stars": 250}], "send_at": null}'
{ "id": "msg_77121", "from": "creator", "sent_by": "human", "token_id": "tok_31", "status": "queued", "at": "2026-10-06T14:03:30Z" }
  • Сообщение, отправленное через API, считается отправленным человеком (sent_by: "human", с токеном, который его отправил) и переводит переписку в режим человека (state: "human") до возврата.
  • status меняется: queued, sent, затем read; failed содержит причину от Telegram (например flood wait).
  • send_at позволяет запланировать отправку (до 7 дней вперед).

React to a message #

POST /conversations/{id}/reactions · can_chat

ParameterTypeRequiredDescription
message_idstringYesСообщение фаната
emojistringYesРеакция
onbooleanYestrue, добавить, false, убрать
curl -X POST https://api.lanachat.ai/v1/conversations/conv_1001_88231/reactions \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"message_id": "msg_77119", "emoji": "❤️", "on": true}'

Take over #

POST /conversations/{id}/takeover · can_chat

curl -X POST https://api.lanachat.ai/v1/conversations/conv_1001_88231/takeover \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
{ "id": "conv_1001_88231", "state": "human", "taken_by": "tok_31", "taken_at": "2026-10-06T14:04:00Z" }

AI перестает отвечать этому фанату, пока вы не вернете переписку.

Give back to the AI #

POST /conversations/{id}/release · can_chat

curl -X POST https://api.lanachat.ai/v1/conversations/conv_1001_88231/release \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Ответ, переписка с state: "ai". Переписку в статусе off по причине безопасности вернуть нельзя (409).

Run a script #

POST /conversations/{id}/script · can_chat

ParameterTypeRequiredDescription
script_idstringYesСкрипт этого же автора, см. Scripts
curl -X POST https://api.lanachat.ai/v1/conversations/conv_1001_88231/script \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"script_id": "scr_204"}'

Пока скрипт выполняется, state переписки, script.

Mark as read #

POST /conversations/{id}/read · can_chat

curl -X POST https://api.lanachat.ai/v1/conversations/conv_1001_88231/read \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Параметр unread в переписке сбрасывается в 0.

Последние новости о Lana в Telegram

Новые релизы и приглашения в бету, первыми в канале.