API: Fans, Konversationen und Nachrichten
Ein fan ist ein Telegram-Nutzer, der einer Ihrer Creatorinnen geschrieben hat. Eine conversation ist der Chat zwischen diesem Fan und einem Telegram-Account. Nachrichten werden von der KI, einem Teammitglied oder einem Skript gesendet. Diese Endpunkte entsprechen Live Convs und Fans in der Console.
Endpunkte #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /fans | Fans auflisten (creator_id=, status=, list_id=, q=, spent_min=) | can_fan_read | Planned |
| GET | /fans/{id} | Ein Fan: Sprachen, Ausgaben, Status, Listen, Notizen | can_fan_read | Planned |
| PATCH | /fans/{id} | Alias, Antwortsprache oder Notizen des Fans ändern | can_chat | Planned |
| GET | /fans/{id}/sales | Käufe des Fans | can_sales_read | Planned |
| POST | /fans/import | Frühere Fans und Nachrichten importieren (sendet nie etwas) | can_fan_import | Planned |
| GET | /fan-lists | Listen (VIPs, Win back…) | can_fan_read | Planned |
| POST | /fan-lists | Liste erstellen | can_chat | Planned |
| POST | /fan-lists/{id}/members | Fans zu einer Liste hinzufügen | can_chat | Planned |
| DELETE | /fan-lists/{id}/members | Fans aus einer Liste entfernen | can_chat | Planned |
| GET | /conversations | Konversationen auflisten (creator_id=, account_id=, state=, unread=true) | can_fan_read | Planned |
| GET | /conversations/{id} | Eine Konversation und wer antwortet | can_fan_read | Planned |
| GET | /conversations/{id}/messages | Nachrichten, neueste zuerst (translate=en fügt Übersetzung hinzu) | can_fan_read | Planned |
| POST | /conversations/{id}/messages | Nachricht als Creatorin senden (Text, Medien, Angebot) | can_chat | Planned |
| POST | /conversations/{id}/reactions | Reaktion auf eine Fan-Nachricht hinzufügen oder entfernen | can_chat | Planned |
| POST | /conversations/{id}/takeover | Eine Person übernimmt: Die KI antwortet diesem Fan nicht mehr | can_chat | Planned |
| POST | /conversations/{id}/release | Die Konversation an die KI zurückgeben | can_chat | Planned |
| POST | /conversations/{id}/script | Skript auf diese Konversation ausführen | can_chat | Planned |
| POST | /conversations/{id}/read | Konversation als gelesen markieren | can_chat | Planned |
Das Fan-Objekt #
{
"id": "fan_921",
"display_name": "Marco",
"username": "marco_dl",
"creator_id": "cr_lea",
"purchases": 9,
"spent": { "stars": 1450, "net_cents": 1885 },
"lists": ["vip"]
}
| Field | Type | Description |
|---|---|---|
id | string | Beginnt mit fan_ |
display_name | string | Name des Fans auf Telegram |
username | string or null | Telegram-@username des Fans, ohne das @ |
creator_id | string | Die Creatorin, an die dieser Fan geschrieben hat |
purchases | number | Bisher bestätigte Käufe |
spent | object | Gesamt ausgegeben: stars und net_cents in US-Cent nach Telegram-Anteil und Rückerstattungen |
lists | array of strings | IDs der Fan-Listen, in denen dieser Fan ist |
Ein Fan enthält außerdem die verwendeten Sprachen, das Status-Tag, Teamnotizen, einen Alias und eine Antwortsprache wie auf der Fans-Seite.
Das Konversationsobjekt #
{
"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"
}
| Field | Type | Description |
|---|---|---|
id | string | Beginnt mit conv_ |
fan_id, creator_id, account_id | string | Wer mit wem spricht, auf welchem Telegram-Account |
state | string | Wer antwortet: ai, human (übernommen), script (Skript läuft) oder off |
status | object | tag (Status-Tags der Fans-Seite) und der reason, falls vorhanden |
unread | number | Noch nicht gelesene Fan-Nachrichten |
last_message_at | string | ISO 8601, UTC |
spent | object | Was der Fan in dieser Konversation ausgegeben hat: stars und net_cents |
source_link_id | string or null | Der Tracking-Link, über den der Fan kam |
status.tag entspricht den Status-Tags der Fans-Seite (review, safety_hold, converted, lost, underage…). Eine off-Konversation aus Sicherheitsgründen kann nicht an die KI zurückgegeben werden (409).
Das Nachrichtenobjekt #
{
"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"
}
| Field | Type | Description |
|---|---|---|
id | string | Beginnt mit msg_ |
from | string | creator oder fan |
sent_by | string | Bei Creator-Nachrichten: ai, human oder script |
member_id | string | Das Teammitglied, das gesendet hat, wenn sent_by human aus der Console ist |
token_id | string | Das Zugriffstoken, das gesendet hat, wenn es von der API kam |
text | string | Text der Nachricht |
media | array | Gesendete Medien: id, locked (bezahlt und noch nicht gekauft) und Preis in stars |
reactions | array | Reaktionen auf eine Fan-Nachricht |
status | string | Für gesendete Nachrichten: queued, sent, read oder failed |
at | string | ISO 8601, UTC |
sent_by bestimmt die Provisionsrate eines Verkaufs, wird also vom Server gesetzt und nie von Ihrer Anfrage.
Das Verkaufsobjekt #
{
"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"
}
| Field | Type | Description |
|---|---|---|
sale_id | string | Beginnt mit sale_ |
fan_id, creator_id, account_id, conversation_id | string | Wer gekauft hat, von wem, wo |
stars | number | Bezahlt in Telegram Stars |
net_cents | number | Nettowert in US-Cent (ein Star zählt $0.013) |
sent_by | string | ai, human oder script: Wer das Angebot gesendet hat, bestimmt die Provision |
kind | string | Was gekauft wurde, z.B. offer |
Das gleiche Objekt kommt per webhook, Event sale.completed.
Fans #
Fans auflisten #
GET /fans · can_fan_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | No | Nur die Fans dieser Creatorin |
status | string | No | Ein Status-Tag der Fans-Seite, z.B. converted |
list_id | string | No | Nur die Fans dieser Liste |
q | string | No | Teil des Namens oder Usernamens des Fans |
spent_min | number | No | Nur Fans, die mindestens so viele Stars ausgegeben haben |
limit, cursor | number, string | No | Paginierung |
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
}
Einen Fan abrufen #
GET /fans/{id} · can_fan_read
curl https://api.lanachat.ai/v1/fans/fan_921 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort ist das Fan-Objekt. Eine unbekannte ID ergibt 404.
Fan aktualisieren #
PATCH /fans/{id} · can_chat
Senden Sie nur, was sich ändert: Alias, Antwortsprache oder Notizen des Fans. Die Antwort ist der aktualisierte Fan.
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"}'
Käufe eines Fans auflisten #
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
}
Eine paginierte Liste von Verkaufsobjekten. Für Summen pro Tag, Link oder Quelle nutzen Sie stats.
Fan-Historie importieren #
POST /fans/import · can_fan_import
Fügt frühere Fans und deren Nachrichten zu Ihren Daten hinzu, z.B. aus einem anderen Tool. Es wird nie eine Nachricht an einen Fan gesendet und nie ein Kauf bestätigt.
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-Listen #
Fan-Listen auflisten #
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
}
Liste erstellen #
POST /fan-lists · can_chat
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Der Name, der auf der Fans-Seite angezeigt wird |
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"}'
Die Antwort ist die neue Liste (201).
Fans hinzufügen oder entfernen #
POST /fan-lists/{id}/members und DELETE /fan-lists/{id}/members · can_chat
| Parameter | Type | Required | Description |
|---|---|---|---|
fan_ids | array of strings | Yes | Die hinzuzufügenden oder zu entfernenden Fans |
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 verwendet denselben Body. Eine unbekannte Liste oder ein unbekannter Fan ergibt 404.
Konversationen #
Konversationen auflisten #
GET /conversations · can_fan_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | No | Nur diese Creatorin |
account_id | string | No | Nur dieser Telegram-Account |
state | string | No | ai, human, script oder off |
unread | boolean | No | true: nur Konversationen mit ungelesenen Fan-Nachrichten |
limit, cursor | number, string | No | Paginierung |
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
}
Eine Konversation abrufen #
GET /conversations/{id} · can_fan_read
curl https://api.lanachat.ai/v1/conversations/conv_1001_88231 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort ist das Konversationsobjekt; state zeigt, wer antwortet.
Nachrichten lesen #
GET /conversations/{id}/messages · can_fan_read
| Parameter | Type | Required | Description |
|---|---|---|---|
translate | string | No | Sprachcode, z.B. en: jede Nachricht erhält eine Übersetzung |
limit, cursor | number, string | No | Paginierung, neueste zuerst |
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 ist ai, human (mit member_id) oder script.
Nachricht senden #
POST /conversations/{id}/messages · can_chat
| Parameter | Type | Required | Description |
|---|---|---|---|
text | string | Yes, or media | Der Text, als Creatorin |
media | array | No | Vault-Medien: id und stars, um es zu diesem Preis gesperrt zu verkaufen |
send_at | string or null | No | ISO 8601-Zeit zur Planung, bis zu 7 Tage im Voraus; null sendet sofort |
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" }
- Eine Nachricht, die über die API gesendet wird, zählt als von einer Person gesendet (
sent_by: "human", mit dem Token, das sie gesendet hat) und übernimmt die Konversation (state: "human"), bis Sie sie freigeben. statusdurchläuftqueued,sent, dannread;failedenthält den Telegram-Grund (z.B. Flood-Wait).- Mit
send_atplanen Sie die Nachricht (bis zu 7 Tage im Voraus).
Auf eine Nachricht reagieren #
POST /conversations/{id}/reactions · can_chat
| Parameter | Type | Required | Description |
|---|---|---|---|
message_id | string | Yes | Die Nachricht des Fans |
emoji | string | Yes | Die Reaktion |
on | boolean | Yes | true fügt sie hinzu, false entfernt sie |
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}'
Übernehmen #
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" }
Die KI antwortet diesem Fan nicht mehr, bis Sie die Konversation zurückgeben.
An die KI zurückgeben #
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)"
Die Antwort ist die Konversation mit state: "ai". Eine off-Konversation aus Sicherheitsgründen kann nicht freigegeben werden (409).
Skript ausführen #
POST /conversations/{id}/script · can_chat
| Parameter | Type | Required | Description |
|---|---|---|---|
script_id | string | Yes | Ein Skript derselben Creatorin, siehe 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"}'
Während das Skript läuft, ist der state der Konversation script.
Als gelesen markieren #
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)"
Das unread der Konversation wird auf 0 gesetzt.