LanaChat

API : fans, conversations et messages

Lecture de 7 minMis à jour Markdown

Un fan est un utilisateur Telegram qui a écrit à l’une de vos créatrices. Une conversation est le chat entre ce fan et un compte Telegram. Les messages sont envoyés par l’IA, par un membre de l’équipe ou par un script. Ces endpoints correspondent à Live Convs et Fans dans la Console.

Endpoints #

MethodPathDescriptionPermissionStatus
GET/fansLister les fans (creator_id=, status=, list_id=, q=, spent_min=)can_fan_readPlanned
GET/fans/{id}Un fan : langues, dépenses, statut, listes, notescan_fan_readPlanned
PATCH/fans/{id}Modifier l’alias, la langue de réponse ou les notes du fancan_chatPlanned
GET/fans/{id}/salesLes achats du fancan_sales_readPlanned
POST/fans/importImporter des fans et messages passés (n’envoie jamais rien)can_fan_importPlanned
GET/fan-listsListes (VIP, win back…)can_fan_readPlanned
POST/fan-listsCréer une listecan_chatPlanned
POST/fan-lists/{id}/membersAjouter des fans à une listecan_chatPlanned
DELETE/fan-lists/{id}/membersRetirer des fans d’une listecan_chatPlanned
GET/conversationsLister les conversations (creator_id=, account_id=, state=, unread=true)can_fan_readPlanned
GET/conversations/{id}Une conversation et qui répondcan_fan_readPlanned
GET/conversations/{id}/messagesMessages, du plus récent au plus ancien (translate=en ajoute une traduction)can_fan_readPlanned
POST/conversations/{id}/messagesEnvoyer un message en tant que créatrice (texte, média, offre)can_chatPlanned
POST/conversations/{id}/reactionsAjouter ou retirer une réaction sur un message de fancan_chatPlanned
POST/conversations/{id}/takeoverPrendre la main : l’IA arrête de répondre à ce fancan_chatPlanned
POST/conversations/{id}/releaseRedonner la conversation à l’IAcan_chatPlanned
POST/conversations/{id}/scriptLancer un script sur cette conversationcan_chatPlanned
POST/conversations/{id}/readMarquer la conversation comme luecan_chatPlanned

L’objet 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
idstringCommence par fan_
display_namestringNom du fan sur Telegram
usernamestring or null@username Telegram du fan, sans le @
creator_idstringLa créatrice à qui ce fan a écrit
purchasesnumberAchats vérifiés à ce jour
spentobjectTotal dépensé : stars, et net_cents en cents US après la part Telegram et les remboursements
listsarray of stringsIds des listes de fans auxquelles ce fan appartient

Un fan contient aussi les langues utilisées, son tag de statut, les notes de l’équipe, un alias et une langue de réponse, comme sur la page Fans.

L’objet conversation #

{
  "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
idstringCommence par conv_
fan_id, creator_id, account_idstringQui parle à qui, sur quel compte Telegram
statestringQui répond : ai, human (prise en main), script (un script tourne) ou off
statusobjecttag (tags de statut de la page Fans) et reason s’il y en a une
unreadnumberMessages du fan non lus
last_message_atstringISO 8601, UTC
spentobjectDépenses du fan dans cette conversation : stars et net_cents
source_link_idstring or nullLe lien de tracking d’où vient le fan

status.tag correspond aux tags de statut de la page Fans (review, safety_hold, converted, lost, underage…). Une conversation en off pour raison de sécurité ne peut pas être rendue à l’IA (409).

L’objet message #

{
  "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
idstringCommence par msg_
fromstringcreator ou fan
sent_bystringPour les messages de créatrice : ai, human ou script
member_idstringLe membre de l’équipe qui l’a envoyé, si sent_by est human depuis la Console
token_idstringLe token d’accès qui l’a envoyé, si cela vient de l’API
textstringTexte du message
mediaarrayMédias envoyés : id, locked (payant et pas encore acheté) et prix en stars
reactionsarrayRéactions sur un message de fan
statusstringPour les messages envoyés : queued, sent, read ou failed
atstringISO 8601, UTC

sent_by détermine la commission sur une vente, il est donc fixé côté serveur et jamais par votre requête.

L’objet sale #

{
  "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_idstringCommence par sale_
fan_id, creator_id, account_id, conversation_idstringQui a acheté, à qui, où
starsnumberPrix payé en Telegram Stars
net_centsnumberValeur nette en cents US (un Star vaut $0.013)
sent_bystringai, human ou script : qui a envoyé l’offre, cela détermine la commission
kindstringCe qui a été acheté, par exemple offer

Le même objet arrive par webhook, événement sale.completed.

Fans #

Lister les fans #

GET /fans · can_fan_read

ParameterTypeRequiredDescription
creator_idstringNonSeulement les fans de cette créatrice
statusstringNonUn tag de statut de la page Fans, par exemple converted
list_idstringNonSeulement les fans de cette liste
qstringNonPartie du nom ou username du fan
spent_minnumberNonSeulement les fans ayant dépensé au moins ce nombre de Stars
limit, cursornumber, stringNonPagination
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
}

Obtenir un fan #

GET /fans/{id} · can_fan_read

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

La réponse est l’objet fan. Un id inconnu répond 404.

Mettre à jour un fan #

PATCH /fans/{id} · can_chat

Envoyez uniquement ce qui change : alias, langue de réponse ou notes du fan. La réponse est le fan mis à jour.

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

Lister les achats d’un 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
}

Une liste paginée d’objets sale. Pour les totaux par jour, lien ou source, utilisez stats.

Importer l’historique des fans #

POST /fans/import · can_fan_import

Ajoute des fans passés et leurs messages à vos données, par exemple depuis un autre outil. Cela n’envoie jamais de message à un fan et ne confirme jamais un achat.

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

Listes de fans #

Lister les listes de fans #

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
}

Créer une liste #

POST /fan-lists · can_chat

ParameterTypeRequiredDescription
namestringOuiLe nom affiché sur la page 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"}'

La réponse est la nouvelle liste (201).

Ajouter ou retirer des fans #

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

ParameterTypeRequiredDescription
fan_idsarray of stringsOuiLes fans à ajouter ou retirer
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 prend le même body. Une liste ou un fan inconnu répond 404.

Conversations #

Lister les conversations #

GET /conversations · can_fan_read

ParameterTypeRequiredDescription
creator_idstringNonSeulement cette créatrice
account_idstringNonSeulement ce compte Telegram
statestringNonai, human, script ou off
unreadbooleanNontrue : seulement les conversations avec des messages de fan non lus
limit, cursornumber, stringNonPagination
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
}

Obtenir une conversation #

GET /conversations/{id} · can_fan_read

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

La réponse est l’objet conversation ; state indique qui répond.

Lire les messages #

GET /conversations/{id}/messages · can_fan_read

ParameterTypeRequiredDescription
translatestringNonUn code langue, par exemple en : chaque message reçoit aussi une traduction
limit, cursornumber, stringNonPagination, du plus récent au plus ancien
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 vaut ai, human (avec member_id) ou script.

Envoyer un message #

POST /conversations/{id}/messages · can_chat

ParameterTypeRequiredDescription
textstringOui, ou mediaLe texte, en tant que créatrice
mediaarrayNonMédias du Vault : id, et stars pour le vendre verrouillé à ce prix
send_atstring or nullNonHeure ISO 8601 pour programmer l’envoi, jusqu’à 7 jours ; null envoie tout de suite
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 message envoyé via l’API est considéré comme envoyé par une personne (sent_by: "human", avec le token utilisé) et prend la main sur la conversation (state: "human") jusqu’à ce que vous la rendiez.
  • status passe par queued, sent, puis read ; failed contient la raison Telegram (par exemple flood wait).
  • send_at programme le message (jusqu’à 7 jours à l’avance).

Réagir à un message #

POST /conversations/{id}/reactions · can_chat

ParameterTypeRequiredDescription
message_idstringOuiLe message du fan
emojistringOuiLa réaction
onbooleanOuitrue l’ajoute, false la retire
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}'

Prendre la main #

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

L’IA arrête de répondre à ce fan jusqu’à ce que vous rendiez la conversation.

Redonner à l’IA #

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)"

La réponse est la conversation avec state: "ai". Une conversation en off pour raison de sécurité ne peut pas être rendue (409).

Lancer un script #

POST /conversations/{id}/script · can_chat

ParameterTypeRequiredDescription
script_idstringOuiUn script de la même créatrice, voir 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"}'

Pendant l’exécution, le state de la conversation est script.

Marquer comme lu #

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)"

Le unread de la conversation repasse à 0.

Les dernières nouvelles de Lana sur Telegram

Nouveautés et invitations à la bêta, en premier sur le canal.