LanaChat

API: фанати, діалоги та повідомлення

Читання 7 хвОновлено Markdown

Fan, це користувач Telegram, який написав одній з ваших авторок. Conversation, це чат між цим фанатом і одним Telegram-акаунтом. Повідомлення надсилає AI, член команди або скрипт. Ці endpoints відповідають розділам 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 приймає такий самий body. Якщо список або фанат невідомі, 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, or mediaТекст, як авторка
mediaarrayNoVault media: 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

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