LanaChat

API: fani, conversații și mesaje

7 min de cititActualizat Markdown

Un fan este un utilizator Telegram care a scris uneia dintre creatoarele tale. O conversație este chatul dintre acel fan și un cont Telegram. Mesajele sunt trimise de AI, de un coleg sau de un script. Aceste endpointuri corespund cu Live Convs și Fans din Console.

Endpoints #

MethodPathDescriptionPermissionStatus
GET/fansListează fanii (creator_id=, status=, list_id=, q=, spent_min=)can_fan_readPlanned
GET/fans/{id}Un fan: limbi, cheltuieli, status, liste, notițecan_fan_readPlanned
PATCH/fans/{id}Schimbă aliasul fanului, limba de răspuns sau notițelecan_chatPlanned
GET/fans/{id}/salesAchizițiile fanuluican_sales_readPlanned
POST/fans/importImportează fani și mesaje din trecut (nu trimite niciodată nimic)can_fan_importPlanned
GET/fan-listsListe (VIP, win back…)can_fan_readPlanned
POST/fan-listsCreează o listăcan_chatPlanned
POST/fan-lists/{id}/membersAdaugă fani într-o listăcan_chatPlanned
DELETE/fan-lists/{id}/membersElimină fani dintr-o listăcan_chatPlanned
GET/conversationsListează conversațiile (creator_id=, account_id=, state=, unread=true)can_fan_readPlanned
GET/conversations/{id}O conversație și cine răspundecan_fan_readPlanned
GET/conversations/{id}/messagesMesaje, cele mai noi primele (translate=en adaugă traducere)can_fan_readPlanned
POST/conversations/{id}/messagesTrimite un mesaj ca și creator (text, media, ofertă)can_chatPlanned
POST/conversations/{id}/reactionsAdaugă sau elimină o reacție la mesajul unui fancan_chatPlanned
POST/conversations/{id}/takeoverO persoană preia: AI-ul nu mai răspunde acestui fancan_chatPlanned
POST/conversations/{id}/releaseDă conversația înapoi la AIcan_chatPlanned
POST/conversations/{id}/scriptRulează un script pe această conversațiecan_chatPlanned
POST/conversations/{id}/readMarchează conversația ca citităcan_chatPlanned

Obiectul fan #

{
  "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Începe cu fan_
display_namestringNumele fanului pe Telegram
usernamestring sau null@username-ul fanului pe Telegram, fără @
creator_idstringCreatoarea căreia i-a scris acest fan
purchasesnumberAchiziții verificate până acum
spentobjectTotal cheltuit: stars și net_cents în cenți SUA după comisionul Telegram și refunduri
listsarray of stringsID-urile listelor de fani în care se află acest fan

Un fan are și limbile în care scrie, tagul de status, notițele echipei, un alias și limba de răspuns, ca pe pagina Fans.

Obiectul conversație #

{
  "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Începe cu conv_
fan_id, creator_id, account_idstringCine vorbește cu cine, pe ce cont Telegram
statestringCine răspunde: ai, human (preluat), script (rulează un script) sau off
statusobjecttag (tagurile de status de pe pagina Fans) și reason dacă există
unreadnumberMesaje de la fan necitite încă
last_message_atstringISO 8601, UTC
spentobjectCât a cheltuit fanul în această conversație: stars și net_cents
source_link_idstring sau nullLinkul de tracking de unde a venit fanul

status.tag corespunde tagurilor de status de pe pagina Fans (review, safety_hold, converted, lost, underage…). O conversație off din motive de siguranță nu poate fi dată înapoi la AI (409).

Obiectul mesaj #

{
  "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Începe cu msg_
fromstringcreator sau fan
sent_bystringPentru mesajele creatoarei: ai, human sau script
member_idstringColegul care a trimis, când sent_by este human din Console
token_idstringTokenul de acces care a trimis, când vine din API
textstringTextul mesajului
mediaarrayMedia trimisă: id, locked (plătită și încă nebought) și prețul în stars
reactionsarrayReacții la un mesaj de fan
statusstringPentru mesajele trimise: queued, sent, read sau failed
atstringISO 8601, UTC

sent_by stabilește comisionul unei vânzări, deci este setat de server și nu de cererea ta.

Obiectul vânzare #

{
  "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Începe cu sale_
fan_id, creator_id, account_id, conversation_idstringCine a cumpărat, de la cine, unde
starsnumberPrețul plătit în Telegram Stars
net_centsnumberValoarea netă în cenți SUA (un Star valorează $0.013)
sent_bystringai, human sau script: cine a trimis oferta, stabilește comisionul
kindstringCe s-a cumpărat, de exemplu offer

Același obiect vine prin webhook, evenimentul sale.completed.

Fani #

Listează fanii #

GET /fans · can_fan_read

ParameterTypeRequiredDescription
creator_idstringNuDoar fanii acestei creatoare
statusstringNuUn tag de status de pe pagina Fans, de exemplu converted
list_idstringNuDoar fanii acestei liste
qstringNuParte din numele sau username-ul fanului
spent_minnumberNuDoar fanii care au cheltuit cel puțin atâția Stars
limit, cursornumber, stringNuPaginare
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
}

Obține un fan #

GET /fans/{id} · can_fan_read

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

Răspunsul este obiectul fan. Un id necunoscut răspunde cu 404.

Actualizează un fan #

PATCH /fans/{id} · can_chat

Trimite doar ce se schimbă: aliasul fanului, limba de răspuns sau notițele. Răspunsul este fanul actualizat.

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"}'

Listează achizițiile unui fan #

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
}

O listă paginată de obiecte vânzare. Pentru totaluri pe zi, link sau sursă, folosește stats.

Importează istoricul fanilor #

POST /fans/import · can_fan_import

Adaugă fani din trecut și mesajele lor în baza ta, de exemplu din altă unealtă. Nu trimite niciodată mesaje fanilor și nu confirmă vreo achiziție.

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

Liste de fani #

Listează listele de fani #

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
}

Creează o listă #

POST /fan-lists · can_chat

ParameterTypeRequiredDescription
namestringDaNumele afișat pe pagina 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"}'

Răspunsul este noua listă (201).

Adaugă sau elimină fani #

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

ParameterTypeRequiredDescription
fan_idsarray of stringsDaFanii de adăugat sau eliminat
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 folosește același body. O listă sau un fan necunoscut răspunde cu 404.

Conversații #

Listează conversațiile #

GET /conversations · can_fan_read

ParameterTypeRequiredDescription
creator_idstringNuDoar această creatoare
account_idstringNuDoar acest cont Telegram
statestringNuai, human, script sau off
unreadbooleanNutrue: doar conversațiile cu mesaje necitite de la fani
limit, cursornumber, stringNuPaginare
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
}

Obține o conversație #

GET /conversations/{id} · can_fan_read

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

Răspunsul este obiectul conversație; state arată cine răspunde.

Citește mesajele #

GET /conversations/{id}/messages · can_fan_read

ParameterTypeRequiredDescription
translatestringNuUn cod de limbă, de exemplu en: fiecare mesaj primește și traducere
limit, cursornumber, stringNuPaginare, cele mai noi primele
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 poate fi ai, human (cu member_id) sau script.

Trimite un mesaj #

POST /conversations/{id}/messages · can_chat

ParameterTypeRequiredDescription
textstringDa, sau mediaTextul, ca și creatoare
mediaarrayNuMedia din Vault: id și stars pentru a o vinde blocată la acel preț
send_atstring sau nullNuOra ISO 8601 pentru programare, maxim 7 zile în avans; null trimite acum
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" }
  • Un mesaj trimis prin API este considerat trimis de o persoană (sent_by: "human", cu tokenul care l-a trimis) și preia conversația (state: "human") până o eliberezi.
  • status trece prin queued, sent, apoi read; failed conține motivul Telegram (de exemplu flood wait).
  • send_at programează mesajul (maxim 7 zile în avans).

Reacționează la un mesaj #

POST /conversations/{id}/reactions · can_chat

ParameterTypeRequiredDescription
message_idstringDaMesajul fanului
emojistringDaReacția
onbooleanDatrue o adaugă, false o elimină
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}'

Preia conversația #

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-ul nu mai răspunde acestui fan până când dai conversația înapoi.

Dă conversația înapoi la 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)"

Răspunsul este conversația cu state: "ai". O conversație off din motive de siguranță nu poate fi eliberată (409).

Rulează un script #

POST /conversations/{id}/script · can_chat

ParameterTypeRequiredDescription
script_idstringDaUn script al aceleiași creatoare, vezi 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"}'

Cât timp rulează, state al conversației este script.

Marchează ca citit #

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 al conversației revine la 0.

Ultimele noutăți despre Lana pe Telegram

Noutăți și invitații în beta, mai întâi pe canal.