API: Cuentas de Telegram, pools e historias
Una cuenta de Telegram es una cuenta de una creadora, conectada a LanaChat mediante una conexión comercial (un bot que ella añade en la configuración de Telegram). Las cuentas se agrupan en pools: un pool es una creadora, un mercado y una fuente de tráfico, y las nuevas conversaciones de un enlace de seguimiento se distribuyen entre las cuentas emisoras del pool correcto. Las historias se publican en una o más cuentas a la vez.
Endpoints #
| Método | Ruta | Descripción | Permiso | Estado |
|---|---|---|---|---|
| GET | /accounts | Listar cuentas (creator_id=, health=connected,pending,expired) | can_setup | Planned |
| POST | /accounts | Añadir una cuenta con su token de bot; verificado con Telegram antes de guardar | can_setup | Planned |
| GET | /accounts/{id} | Una cuenta, su estado y su carga esta hora | can_setup | Planned |
| PATCH | /accounts/{id} | Cambiar su brain, mercado, tráfico, alias o idioma de respuesta; activarla o desactivarla | can_setup | Planned |
| DELETE | /accounts/{id} | Desconectar la cuenta (se mantienen sus conversaciones) | can_setup | Planned |
| POST | /accounts/{id}/check | Probar la conexión ahora en lugar de esperar la comprobación horaria | can_setup | Planned |
| GET | /pools | Todos los pools con sus cuentas, capacidad y estado | can_tracking | Planned |
| GET | /pools/settings | Límite horario del workspace y reglas de distribución | can_tracking | Planned |
| PUT | /pools/settings | Cambiar el límite horario (100 a 100,000) y la distribución | can_tracking | Planned |
| PATCH | /pools/accounts/{account_id} | Incluir o excluir una cuenta del pool, pausarla, ajustar su peso o límite horario | can_tracking | Planned |
| GET | /pools/events | Registro del pool: esperas por flood, pausas, reanudaciones, enlaces retenidos | can_tracking | Planned |
| GET | /stories | Historias publicadas y programadas (creator_id=, status=) | can_setup | Planned |
| POST | /stories | Publicar una historia ahora o programarla en una o más cuentas | can_setup | Planned |
| GET | /stories/{id} | Una historia con sus vistas, reacciones y clics en enlaces | can_setup | Planned |
| DELETE | /stories/{id} | Cancelar una historia programada | can_setup | Planned |
El objeto cuenta #
{
"id": "acc_1001",
"creator_id": "cr_lea",
"username": "lea_officiel",
"bot_username": "lea_helper_bot",
"health": "connected",
"active": true,
"brain_id": "br_lea_main",
"pool_id": "pool_lea_fr_instagram",
"market": "fr",
"traffic": "instagram",
"story_rights": true,
"last_activity_at": "2026-10-06T13:58:20Z"
}
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Empieza con acc_ |
creator_id | string | La creadora a la que pertenece esta cuenta |
username | string | El @username de Telegram de la cuenta, sin el @ |
bot_username | string | El bot vinculado mediante la conexión comercial |
health | string | connected, pending o expired |
active | boolean | false cuando la cuenta está apagada: la IA no responde en ella |
brain_id | string o null | El AI Brain que responde en esta cuenta |
pool_id | string | El pool al que pertenece según sus etiquetas market y traffic |
market | string | Mercado de idioma, por ejemplo fr, en, pt-BR o all |
traffic | string | Fuente de tráfico, por ejemplo instagram o tiktok |
story_rights | boolean | Si la conexión comercial permite a LanaChat publicar historias |
last_activity_at | string | Último mensaje enviado o recibido, ISO 8601 UTC |
healthpuede serconnected,pending(la conexión comercial aún no está confirmada) oexpired(el bot perdió acceso; reconéctalo).- El token del bot nunca se devuelve. LanaChat nunca pide número de teléfono, contraseña ni código 2FA.
Cuentas #
Listar cuentas #
GET /accounts · can_setup
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
creator_id | string | No | Solo las cuentas de esta creadora |
health | string | No | connected, pending o expired; varios separados por comas |
limit, cursor | number, string | No | Paginación |
curl "https://api.lanachat.ai/v1/accounts?creator_id=cr_lea&health=connected,expired" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [
{ "id": "acc_1001", "creator_id": "cr_lea", "username": "lea_officiel", "bot_username": "lea_helper_bot", "health": "connected", "active": true, "brain_id": "br_lea_main", "pool_id": "pool_lea_fr_instagram", "market": "fr", "traffic": "instagram", "story_rights": true, "last_activity_at": "2026-10-06T13:58:20Z" },
{ "id": "acc_1004", "creator_id": "cr_lea", "username": "lea_backup", "bot_username": "lea_helper2_bot", "health": "connected", "active": true, "brain_id": "br_lea_main", "pool_id": "pool_lea_fr_instagram", "market": "fr", "traffic": "instagram", "story_rights": false, "last_activity_at": "2026-10-06T13:51:02Z" }
],
"next_cursor": null
}
Añadir una cuenta #
POST /accounts · can_setup
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
creator_id | string | Sí | La creadora a la que pertenece la cuenta |
bot_token | string | Sí | El token del bot que vinculó en la configuración Business de Telegram |
market | string | No | Mercado de idioma, por ejemplo fr |
traffic | string | No | Fuente de tráfico, por ejemplo instagram |
curl -X POST https://api.lanachat.ai/v1/accounts \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"creator_id": "cr_lea", "bot_token": "<bot token>", "market": "fr", "traffic": "instagram"}'
{
"id": "acc_1007",
"creator_id": "cr_lea",
"username": "lea_officiel",
"bot_username": "lea_helper_bot",
"health": "pending",
"active": true,
"brain_id": "br_lea_main",
"pool_id": "pool_lea_fr_instagram",
"market": "fr",
"traffic": "instagram",
"story_rights": false,
"last_activity_at": null
}
La respuesta es la cuenta (201) con health: "pending" hasta que la creadora confirme la conexión comercial en Telegram. El token del bot se verifica con Telegram antes de guardar nada: un token rechazado por Telegram responde 400. Una cuenta ya activa en otro workspace es rechazada (409). Cada cuenta necesita una licencia para responder: ver Billing.
Obtener una cuenta #
GET /accounts/{id} · can_setup
curl https://api.lanachat.ai/v1/accounts/acc_1001 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta es el objeto cuenta, con su carga esta hora. Un id desconocido responde 404.
Actualizar una cuenta #
PATCH /accounts/{id} · can_setup
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
brain_id | string | No | El brain que responde en esta cuenta |
market | string | No | Mercado de idioma; mueve la cuenta al pool correspondiente |
traffic | string | No | Fuente de tráfico; mueve la cuenta al pool correspondiente |
active | boolean | No | false apaga la cuenta, true la enciende |
El alias y el idioma de respuesta de la cuenta pueden cambiarse igual.
curl -X PATCH https://api.lanachat.ai/v1/accounts/acc_1004 \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"traffic": "tiktok", "active": true}'
La respuesta es la cuenta actualizada. Apagar la última cuenta emisora de una creadora con enlaces activos responde 409.
Desconectar una cuenta #
DELETE /accounts/{id} · can_setup
curl -X DELETE https://api.lanachat.ai/v1/accounts/acc_1004 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Se mantienen sus conversaciones. Quitar la última cuenta emisora de una creadora con enlaces activos responde 409.
Comprobar la conexión ahora #
POST /accounts/{id}/check · can_setup
curl -X POST https://api.lanachat.ai/v1/accounts/acc_1001/check \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)"
LanaChat comprueba cada cuenta una vez por hora; esta llamada la prueba ahora. La respuesta es la cuenta con su estado health actualizado.
Pools #
Un pool se forma por las etiquetas de sus cuentas (market y traffic); no hay nada que crear. Una nueva conversación va al pool cuyo tráfico coincide con la fuente del enlace y cuyo mercado coincide con el idioma del fan, luego al pool "All traffic" de la creadora, luego a cualquiera de sus pools que aún envíen. Las conversaciones existentes siempre permanecen en su cuenta.
Listar pools #
GET /pools · can_tracking
curl https://api.lanachat.ai/v1/pools \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [
{
"id": "pool_lea_fr_instagram",
"name": "French · Instagram",
"creator_id": "cr_lea",
"accounts": ["acc_1001", "acc_1004"],
"sent_last_hour": 312,
"capacity_per_hour": 400,
"status": "near"
}
],
"next_cursor": null
}
status es sending, near (80% de su capacidad), saturated (95%) o none (sin cuenta emisora).
Obtener la configuración del pool #
GET /pools/settings · can_tracking
curl https://api.lanachat.ai/v1/pools/settings \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"cap_per_hour": 2000,
"default_limit_per_hour": 200,
"distribution": { "mode": "weighted", "warmup": true, "hold_when_saturated": true }
}
| Campo | Tipo | Descripción |
|---|---|---|
cap_per_hour | number | Mensajes que todo el workspace puede enviar en una hora móvil, 100 a 100,000 |
default_limit_per_hour | number | Límite horario dado a una cuenta nueva en el pool |
distribution.mode | string | weighted (aleatorio, proporcional al peso de cada cuenta), round_robin (cada cuenta por turno) o least_loaded (la cuenta más alejada de su límite) |
distribution.warmup | boolean | Una cuenta nueva empieza con 50 mensajes/hora y alcanza su límite completo en 7 días |
distribution.hold_when_saturated | boolean | Cuando ninguna cuenta puede tomar un fan nuevo, retener al fan hasta que una se libere, el más antiguo primero; si no, dar el fan a la cuenta menos cargada aunque supere su límite |
Cuando el workspace alcanza cap_per_hour, los enlaces siguen redirigiendo pero las nuevas conversaciones se retienen hasta que la hora baje del límite.
Cambiar la configuración del pool #
PUT /pools/settings · can_tracking
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
cap_per_hour | number | Sí | 100 a 100,000, número entero |
default_limit_per_hour | number | Sí | 10 a 1,000, número entero |
distribution | object | Sí | mode, warmup y hold_when_saturated, como arriba |
curl -X PUT https://api.lanachat.ai/v1/pools/settings \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"cap_per_hour": 3000, "default_limit_per_hour": 200, "distribution": {"mode": "least_loaded", "warmup": true, "hold_when_saturated": true}}'
La respuesta es la nueva configuración. Un límite fuera de 100 a 100,000 responde 400.
Cambiar una cuenta en el pool #
PATCH /pools/accounts/{account_id} · can_tracking
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
in_pool | boolean | No | false saca la cuenta del pool: mantiene sus conversaciones pero no recibe fans nuevos |
paused | boolean | No | true la pausa en el pool |
weight | number | No | 0 a 100; proporción de fans nuevos en modo weighted (0 permitido: sin fans nuevos) |
limit_per_hour | number | No | 10 a 1,000 mensajes por hora para esta cuenta |
curl -X PATCH https://api.lanachat.ai/v1/pools/accounts/acc_1004 \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"weight": 40, "limit_per_hour": 300}'
{
"account_id": "acc_1004",
"creator_id": "cr_lea",
"username": "lea_backup",
"in_pool": true,
"paused": false,
"weight": 40,
"limit_per_hour": 300,
"sent_last_hour": 88,
"new_conversations_today": 41,
"state": "active",
"flood_wait_until": null,
"warmup_day": 7,
"added_at": "2026-09-20T10:00:00Z"
}
stateesactiveoflood_wait: en un flood wait de Telegram la cuenta se pausa hastaflood_wait_until, luego se reanuda sola.- Durante el calentamiento (
warmup_day1 a 7) la cuenta envía menos que sulimit_per_hour: 50 por hora el día 1, el límite completo el día 7. - Sacar, pausar o eliminar la última cuenta emisora de una creadora con enlaces activos es rechazado (
409).
Leer el registro del pool #
GET /pools/events · can_tracking
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
creator_id | string | No | Solo eventos de las cuentas de esta creadora |
limit, cursor | number, string | No | Paginación |
curl "https://api.lanachat.ai/v1/pools/events?creator_id=cr_lea&limit=2" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [
{ "at": "2026-10-06T13:40:12Z", "kind": "resumed", "creator_id": "cr_lea", "account_id": "acc_1004", "text": "@lea_backup is sending again." },
{ "at": "2026-10-06T13:25:12Z", "kind": "flood_wait", "creator_id": "cr_lea", "account_id": "acc_1004", "text": "@lea_backup hit a Telegram flood wait of 900 seconds." }
],
"next_cursor": "eyJhdCI6IjIwMjYtMTAtMDZUMTM6MjU6MTJaIn0"
}
kind es flood_wait, account_paused, resumed, link_paused (se alcanzó el límite del workspace, se retienen fans nuevos), account_added, account_removed o settings. text es una frase en inglés simple.
Historias #
Listar historias #
GET /stories · can_setup
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
creator_id | string | No | Solo las historias de esta creadora |
status | string | No | Por ejemplo scheduled |
limit, cursor | number, string | No | Paginación |
curl "https://api.lanachat.ai/v1/stories?creator_id=cr_lea&status=scheduled" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [ { "id": "sto_88", "status": "scheduled", "run_at": "2026-10-06T19:00:00Z", "account_ids": ["acc_1001", "acc_1004"] } ],
"next_cursor": null
}
Publicar una historia #
POST /stories · can_setup
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
account_ids | array de strings | Sí | Las cuentas que la publican |
media_id | string | Sí | Una foto o video del Vault de la creadora |
text | string | No | Pie de foto |
link_id | string | No | Un tracking link mostrado en la historia |
duration_hours | number | No | Cuánto tiempo permanece la historia |
run_at | string o null | No | Cuándo publicarla (ISO 8601 UTC); omitir para publicar ahora |
curl -X POST https://api.lanachat.ai/v1/stories \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"account_ids": ["acc_1001", "acc_1004"], "media_id": "med_5521", "text": "New set tonight", "link_id": "lnk_3", "duration_hours": 24, "run_at": "2026-10-06T19:00:00Z"}'
{ "id": "sto_88", "status": "scheduled", "run_at": "2026-10-06T19:00:00Z", "account_ids": ["acc_1001", "acc_1004"] }
Una cuenta sin el derecho "manage stories" en su conexión comercial (story_rights: false) es rechazada, con la razón en message.
Obtener una historia #
GET /stories/{id} · can_setup
curl https://api.lanachat.ai/v1/stories/sto_88 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta es la historia con sus vistas, reacciones y clics en enlaces una vez publicada.
Cancelar una historia programada #
DELETE /stories/{id} · can_setup
curl -X DELETE https://api.lanachat.ai/v1/stories/sto_88 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Solo se puede cancelar una historia programada.