API: Contas do Telegram, pools e stories
Uma conta do Telegram é uma conta de uma criadora, conectada ao LanaChat por meio de uma conexão comercial (um bot que ela adiciona nas configurações do Telegram). As contas são agrupadas em pools: um pool é uma criadora, um mercado e uma fonte de tráfego, e novas conversas de um link de rastreamento são distribuídas entre as contas de envio do pool correto. Stories são postados em uma ou mais contas ao mesmo tempo.
Endpoints #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /accounts | Lista contas (creator_id=, health=connected,pending,expired) | can_setup | Planned |
| POST | /accounts | Adiciona uma conta com seu token de bot; verificado com o Telegram antes de salvar | can_setup | Planned |
| GET | /accounts/{id} | Uma conta, seu status e sua carga nesta hora | can_setup | Planned |
| PATCH | /accounts/{id} | Altera seu brain, mercado, tráfego, alias ou idioma de resposta; liga ou desliga | can_setup | Planned |
| DELETE | /accounts/{id} | Desconecta a conta (suas conversas são mantidas) | can_setup | Planned |
| POST | /accounts/{id}/check | Testa a conexão agora em vez de esperar pela verificação horária | can_setup | Planned |
| GET | /pools | Todos os pools com suas contas, capacidade e status | can_tracking | Planned |
| GET | /pools/settings | Limite horário do workspace e regras de distribuição | can_tracking | Planned |
| PUT | /pools/settings | Altera o limite horário (100 a 100.000) e a distribuição | can_tracking | Planned |
| PATCH | /pools/accounts/{account_id} | Coloca ou tira uma conta do pool, pausa, define peso ou limite horário | can_tracking | Planned |
| GET | /pools/events | Log do pool: esperas por flood, pausas, retomadas, links retidos | can_tracking | Planned |
| GET | /stories | Stories postados e agendados (creator_id=, status=) | can_setup | Planned |
| POST | /stories | Posta um story agora ou agenda em uma ou mais contas | can_setup | Planned |
| GET | /stories/{id} | Um story com suas visualizações, reações e cliques no link | can_setup | Planned |
| DELETE | /stories/{id} | Cancela um story agendado | can_setup | Planned |
O objeto conta #
{
"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"
}
| Field | Type | Description |
|---|---|---|
id | string | Começa com acc_ |
creator_id | string | A criadora a quem esta conta pertence |
username | string | O @username do Telegram da conta, sem o @ |
bot_username | string | O bot vinculado pela conexão comercial |
health | string | connected, pending ou expired |
active | boolean | false quando a conta está desligada: a IA não responde nela |
brain_id | string ou null | O AI Brain que responde nesta conta |
pool_id | string | O pool em que suas tags market e traffic a colocam |
market | string | Mercado de idioma, por exemplo fr, en, pt-BR ou all |
traffic | string | Fonte de tráfego, por exemplo instagram ou tiktok |
story_rights | boolean | Se a conexão comercial permite que LanaChat poste stories |
last_activity_at | string | Última mensagem enviada ou recebida, ISO 8601 UTC |
healthéconnected,pending(a conexão comercial ainda não confirmada) ouexpired(o bot perdeu acesso; reconecte).- O token do bot nunca é retornado. LanaChat nunca pede número de telefone, senha ou código 2FA.
Contas #
Listar contas #
GET /accounts · can_setup
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Não | Apenas as contas desta criadora |
health | string | Não | connected, pending ou expired; vários separados por vírgulas |
limit, cursor | number, string | Não | Paginação |
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
}
Adicionar uma conta #
POST /accounts · can_setup
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Sim | A criadora a quem a conta pertence |
bot_token | string | Sim | O token do bot que ela vinculou nas configurações comerciais do Telegram |
market | string | Não | Mercado de idioma, por exemplo fr |
traffic | string | Não | Fonte de tráfego, por exemplo 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
}
A resposta é a conta (201) com health: "pending" até a criadora confirmar a conexão comercial no Telegram. O token do bot é verificado com o Telegram antes de salvar: um token recusado pelo Telegram responde 400. Uma conta já ativa em outro workspace é recusada (409). Cada conta precisa de uma licença para responder: veja Billing.
Obter uma conta #
GET /accounts/{id} · can_setup
curl https://api.lanachat.ai/v1/accounts/acc_1001 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
A resposta é o objeto conta, com sua carga nesta hora. Um id desconhecido responde 404.
Atualizar uma conta #
PATCH /accounts/{id} · can_setup
| Parameter | Type | Required | Description |
|---|---|---|---|
brain_id | string | Não | O brain que responde nesta conta |
market | string | Não | Mercado de idioma; move a conta para o pool correspondente |
traffic | string | Não | Fonte de tráfego; move a conta para o pool correspondente |
active | boolean | Não | false desliga a conta, true liga novamente |
O alias e o idioma de resposta da conta podem ser alterados da mesma forma.
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}'
A resposta é a conta atualizada. Desligar a última conta de envio de uma criadora que tem links ativos responde 409.
Desconectar uma conta #
DELETE /accounts/{id} · can_setup
curl -X DELETE https://api.lanachat.ai/v1/accounts/acc_1004 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Suas conversas são mantidas. Remover a última conta de envio de uma criadora com links ativos responde 409.
Testar a conexão agora #
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 verifica cada conta uma vez por hora; esta chamada testa agora. A resposta é a conta com seu health atualizado.
Pools #
Um pool é formado pelas tags das suas contas (market e traffic); não há nada a criar. Uma nova conversa vai para o pool cujo tráfego corresponde à fonte do link e cujo mercado corresponde ao idioma do fã, depois para o pool "All traffic" da criadora, depois para qualquer um de seus pools que ainda envia. Conversas existentes sempre permanecem em sua conta.
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 é sending, near (80% da capacidade), saturated (95%) ou none (sem conta enviando).
Obter configurações do 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 }
}
| Field | Type | Description |
|---|---|---|
cap_per_hour | number | Mensagens que todo o workspace pode enviar em uma hora móvel, 100 a 100.000 |
default_limit_per_hour | number | Limite horário dado a uma nova conta no pool |
distribution.mode | string | weighted (aleatório, proporcional ao peso de cada conta), round_robin (cada conta por vez) ou least_loaded (a conta mais distante do limite) |
distribution.warmup | boolean | Uma conta nova começa com 50 mensagens por hora e alcança o limite total no dia 7 |
distribution.hold_when_saturated | boolean | Quando nenhuma conta pode receber um novo fã, segura o fã até liberar, pelo mais antigo; senão dá para a conta menos carregada mesmo acima do limite |
Quando o workspace atinge cap_per_hour, os links continuam redirecionando, mas novas conversas são retidas até a hora cair abaixo do limite.
Alterar configurações do pool #
PUT /pools/settings · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
cap_per_hour | number | Sim | 100 a 100.000, número inteiro |
default_limit_per_hour | number | Sim | 10 a 1.000, número inteiro |
distribution | object | Sim | mode, warmup e hold_when_saturated, como acima |
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}}'
A resposta são as novas configurações. Um limite fora de 100 a 100.000 responde 400.
Alterar uma conta no pool #
PATCH /pools/accounts/{account_id} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
in_pool | boolean | Não | false tira a conta do pool: mantém suas conversas mas não recebe novos fãs |
paused | boolean | Não | true pausa a conta no pool |
weight | number | Não | 0 a 100; participação de novos fãs no modo weighted (0 é permitido: nenhum fã novo) |
limit_per_hour | number | Não | 10 a 1.000 mensagens por hora para esta conta |
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"
}
stateéactiveouflood_wait: em espera por flood do Telegram, a conta se pausa atéflood_wait_until, depois retoma sozinha.- Durante o aquecimento (
warmup_day1 a 7) a conta envia menos que seulimit_per_hour: 50 por hora no dia 1, limite total no dia 7. - Tirar, pausar ou remover a última conta de envio de uma criadora com links ativos é recusado (
409).
Ler o log do pool #
GET /pools/events · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Não | Apenas eventos das contas desta criadora |
limit, cursor | number, string | Não | Paginação |
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 é flood_wait, account_paused, resumed, link_paused (limite do workspace atingido, novos fãs retidos), account_added, account_removed ou settings. text é uma frase simples em inglês.
Stories #
Listar stories #
GET /stories · can_setup
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Não | Apenas stories desta criadora |
status | string | Não | Por exemplo scheduled |
limit, cursor | number, string | Não | Paginação |
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
}
Postar um story #
POST /stories · can_setup
| Parameter | Type | Required | Description |
|---|---|---|---|
account_ids | array de strings | Sim | As contas que postam |
media_id | string | Sim | Uma foto ou vídeo do Vault da criadora |
text | string | Não | Legenda |
link_id | string | Não | Um tracking link mostrado no story |
duration_hours | number | Não | Quanto tempo o story fica ativo |
run_at | string ou null | Não | Quando postar (ISO 8601 UTC); omita para postar agora |
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"] }
Uma conta sem o direito "manage stories" na conexão comercial (story_rights: false) é recusada, com o motivo em message.
Obter um story #
GET /stories/{id} · can_setup
curl https://api.lanachat.ai/v1/stories/sto_88 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
A resposta é o story com suas visualizações, reações e cliques no link após ser postado.
Cancelar um story agendado #
DELETE /stories/{id} · can_setup
curl -X DELETE https://api.lanachat.ai/v1/stories/sto_88 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Só um story agendado pode ser cancelado.