LanaChat

API: links de rastreamento, domínios, pixels e estatísticas

Leitura de 9 minAtualizado Markdown

Um link de rastreamento envia um visitante para uma criadora no Telegram e conta o que acontece depois: cliques, conversas, primeiras mensagens, compradores e receita. Os links podem estar no seu próprio domínio, disparar pixels de anúncios (Meta, TikTok, Snap) e enviar eventos ao servidor. Esses endpoints correspondem à página Tracking.

Endpoints #

MethodPathDescriptionPermissionStatus
GET/linksLista links (creator_id=, archived=false) com seus contadorescan_tracking ou can_sales_readPlanned
POST/linksCria um linkcan_trackingPlanned
GET/links/{id}Um linkcan_tracking ou can_sales_readPlanned
PUT/links/{id}Substitui um link (nome, slug, domínio, destino, UTM, pixels)can_trackingPlanned
DELETE/links/{id}Arquiva um link (permanent=1 o exclui)can_trackingPlanned
GET/domainsSeus domínios (status=active,inactive, q=)can_trackingPlanned
POST/domainsAdiciona um domínio (status pending)can_trackingPlanned
POST/domains/{host}/verifyVerifica seus registros DNS agoracan_trackingPlanned
PATCH/domains/{host}Define um domínio verificado como padrão, ou altera seu rótulocan_trackingPlanned
DELETE/domains/{host}Remove um domínio que nenhum link ativo usacan_trackingPlanned
GET/pixelsAs conexões Meta, TikTok e Snap e o modo de consentimentocan_trackingPlanned
PUT/pixels/{provider}Conecta ou substitui um pixel (meta, tiktok, snap)ownerPlanned
DELETE/pixels/{provider}Desconecta um pixelownerPlanned
POST/pixels/{provider}/testEnvia um evento de teste e retorna a resposta da plataformacan_trackingPlanned
PUT/pixels/consentModo de consentimento: page ou implicit_by_countryownerPlanned
GET/eventsEventos embutidos e personalizados, com contagem de entregas em 7 diascan_trackingPlanned
POST/eventsCria um evento personalizadoownerPlanned
PATCH/events/{id}Liga ou desliga um evento por redeownerPlanned
DELETE/events/{id}Exclui um evento personalizadoownerPlanned
GET/statsTotais diários, por link e por fonte (from=, to=, creator_id=)can_sales_readPlanned
GET/stats/export.csvOs mesmos números em CSVcan_sales_readPlanned
{
  "id": "lnk_3",
  "name": "TikTok · Lea night",
  "slug": "lea-tiktok-night",
  "creator_id": "cr_lea",
  "source": "tiktok",
  "campaign": "Autumn",
  "domain": "go.mia-links.com",
  "public_url": "https://go.mia-links.com/r/lea-tiktok-night",
  "destination": "pool",
  "account_id": null,
  "utm": { "source": "tiktok", "medium": "social", "campaign": "autumn" },
  "pixels": { "meta": false, "tiktok": true, "snap": false },
  "counters": { "clicks": 640, "conversations": 97, "first_messages": 76, "buyers": 14, "revenue_stars": 6200 },
  "archived": false,
  "created_at": "2026-09-12T08:00:00Z"
}
FieldTypeDescription
idstringComeça com lnk_
namestringO nome que sua equipe vê
slugstringO final da URL pública
creator_idstringA criadora para quem o link envia
source, campaignstringDe onde vem o tráfego e o nome da sua campanha
domainstringUm domínio verificado do workspace, ou o domínio LanaChat
public_urlstringhttps://<domain>/r/<slug>: a URL para colocar na bio ou anúncio
destinationstringpool ou account
account_idstring ou nullA conta fixa quando destination é account
utmobjectsource, medium, campaign
pixelsobjectQuais pixels conectados disparam neste link
countersobjectclicks, conversations, first_messages, buyers, revenue_stars
archivedbooleanLinks arquivados são excluídos das estatísticas
created_atstringISO 8601, UTC
  • destination é pool (a conta é escolhida no clique entre a pool da criadora, veja pools) ou account (sempre a mesma account_id).
  • slug: letras minúsculas, dígitos e traços, 1 a 48 caracteres, começando e terminando com letra ou dígito, único entre links ativos do mesmo domínio.
  • domain deve ser um domínio verificado do workspace; sem ele, usa-se o domínio LanaChat.
  • Valores utm: até 80 letras, dígitos, pontos, traços ou underscores. São marcados em cada clique e enviados aos eventos dos pixels.

O objeto domínio #

{
  "host": "go.mia-links.com",
  "builtin": false,
  "status": "pending",
  "error": null,
  "ssl": "none",
  "is_default": false,
  "label": "Lea TikTok",
  "token": "8be03d5f19a2",
  "checks": 0,
  "added_at": "2026-10-05T10:00:00Z",
  "verified_at": null,
  "last_check_at": null
}
FieldTypeDescription
hoststringUm subdomínio em minúsculas (pelo menos 3 níveis), único no workspace
builtinbooleantrue para o domínio LanaChat, que nunca pode ser removido
statusstringverified, pending ou error
errorstring ou nullUma frase simples quando status é error
sslstringnone, issuing ou active
is_defaultbooleanExatamente um domínio verificado é o padrão
labelstring ou nullUm nome para sua equipe, até 60 caracteres
tokenstringO valor do registro TXT de verificação
checksnumberVerificações DNS feitas até agora
added_at, verified_at, last_check_atstring ou nullISO 8601, UTC

O objeto conexão de pixel #

{ "connected": true, "pixel_id": "123456789012345", "token_last4": "x9Qa", "token_status": "valid", "token_error": null, "test_event_code": "TEST4821", "connected_at": "2026-10-06T14:30:00Z" }
FieldTypeDescription
connectedbooleanO pixel está conectado
pixel_idstringMeta: 15 ou 16 dígitos. TikTok: 20 letras maiúsculas ou dígitos. Snap: um UUID
token_last4stringOs últimos 4 caracteres do token de acesso, nunca o token completo
token_statusstringvalid, expired ou invalid
token_errorstring ou nullUma frase simples, por exemplo "Access token expired on 3 Oct. Replace it to resume delivery."
test_event_codestring ou nullO código de teste do gerenciador de eventos da plataforma
connected_atstringISO 8601, UTC

O objeto evento #

{
  "id": "evt_purchase",
  "name": "Purchase",
  "builtin": true,
  "trigger": { "type": "purchase" },
  "networks": { "meta": true, "tiktok": true, "snap": false }
}
FieldTypeDescription
idstringO id do evento
namestringNome embutido, ou seu nome personalizado: uma letra, depois até 39 letras, dígitos ou underscores, único no workspace
builtinbooleantrue para Lead, Contact, Purchase, Subscribe e InitiateCheckout
triggerobjecttype, e um value para os triggers que precisam
networksobjectLigado ou desligado para meta, tiktok e snap

O objeto estatísticas #

{
  "days":    [ { "date": "2026-10-05", "clicks": 54, "conversations": 9, "first_messages": 7, "buyers": 2, "revenue_stars": 950 } ],
  "links":   [ { "link_id": "lnk_3", "clicks": 640, "conversations": 97, "first_messages": 76, "buyers": 14, "revenue_stars": 6200 } ],
  "sources": [ { "source": "instagram", "clicks": 1210, "conversations": 160, "first_messages": 131, "buyers": 22, "revenue_stars": 9100 } ]
}
FieldTypeDescription
daysarrayUma linha por dia UTC do período
linksarrayUma linha por link, no período todo
sourcesarrayUma linha por grupo de fonte: instagram, tiktok, snapchat, meta, x e other
clicksnumberRedirecionamentos servidos
conversationsnumberConversas no Telegram iniciadas pelo link
first_messagesnumberFans que escreveram pelo menos uma vez
buyersnumberFans distintos com compra verificada de Stars no período
revenue_starsnumberCompras verificadas de Stars desses fans no período

GET /links · can_tracking ou can_sales_read

ParameterTypeRequiredDescription
creator_idstringNãoApenas links desta criadora
archivedbooleanNãofalse (visualização padrão) oculta links arquivados
limit, cursornumber, stringNãoPaginação
curl "https://api.lanachat.ai/v1/links?creator_id=cr_lea&archived=false" \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

A resposta é uma lista paginada de objetos link, cada um com seus counters.

POST /links · can_tracking

ParameterTypeRequiredDescription
namestringSimO nome que sua equipe vê
slugstringSimLetras minúsculas, dígitos e traços, 1 a 48 caracteres
creator_idstringSimA criadora para quem o link envia
sourcestringNãoinstagram, tiktok, snapchat, meta, x ou outra fonte
campaignstringNãoO nome da sua campanha
destinationstringNãopool ou account
account_idstringQuando destination é accountA conta fixa do Telegram
domainstringNãoUm domínio verificado; sem ele, o domínio LanaChat
utmobjectNãosource, medium, campaign
pixelsobjectNãometa, tiktok, snap: true para disparar o pixel
curl -X POST https://api.lanachat.ai/v1/links \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"name": "Insta bio · Lea", "slug": "lea-bio", "creator_id": "cr_lea", "source": "instagram", "destination": "pool", "domain": "go.mia-links.com"}'
{
  "id": "lnk_9",
  "name": "Insta bio · Lea",
  "slug": "lea-bio",
  "creator_id": "cr_lea",
  "source": "instagram",
  "campaign": null,
  "domain": "go.mia-links.com",
  "public_url": "https://go.mia-links.com/r/lea-bio",
  "destination": "pool",
  "account_id": null,
  "utm": { "source": null, "medium": null, "campaign": null },
  "pixels": { "meta": false, "tiktok": false, "snap": false },
  "counters": { "clicks": 0, "conversations": 0, "first_messages": 0, "buyers": 0, "revenue_stars": 0 },
  "archived": false,
  "created_at": "2026-10-06T14:40:00Z"
}
  • Um slug já usado responde 409 com The slug /lea-bio is already used by "Insta bio · Mia".
  • Um domínio não verificado responde 400 ("Pick a verified domain…").

GET /links/{id} · can_tracking ou can_sales_read

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

A resposta é o objeto link. Um id desconhecido responde 404.

PUT /links/{id} · can_tracking

Mesmo corpo que Criar um link; o PUT substitui o link inteiro, então envie todos os campos que quiser manter.

curl -X PUT https://api.lanachat.ai/v1/links/lnk_3 \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "TikTok · Lea night", "slug": "lea-tiktok-night", "creator_id": "cr_lea", "source": "tiktok", "campaign": "Autumn", "destination": "pool", "domain": "go.mia-links.com", "utm": {"source": "tiktok", "medium": "social", "campaign": "autumn"}, "pixels": {"meta": false, "tiktok": true, "snap": false}}'

A resposta é o link atualizado. Mesmos erros que ao criar.

DELETE /links/{id} · can_tracking

ParameterTypeRequiredDescription
permanentnumberNão1 exclui o link permanentemente em vez de arquivá-lo
curl -X DELETE https://api.lanachat.ai/v1/links/lnk_3 \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

Um link arquivado é excluído das estatísticas.

Domínios #

Para usar seu próprio domínio, adicione-o, crie dois registros DNS e depois verifique:

  • CNAME go.mia-links.com → links.lanachat.app
  • TXT _lanachat.go.mia-links.com = lanachat-verify=8be03d5f19a2

Domínios pendentes também são verificados a cada 10 minutos por 72 horas, depois diariamente. O status vira verified e o ssl passa a issuing e depois active.

Listar domínios #

GET /domains · can_tracking

ParameterTypeRequiredDescription
statusstringNãoactive (verificado) ou inactive (pendente ou erro)
qstringNãoParte do host ou do rótulo
curl "https://api.lanachat.ai/v1/domains?status=active" \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

A resposta lista objetos domínio, incluindo o domínio LanaChat (builtin: true).

Adicionar um domínio #

POST /domains · can_tracking

ParameterTypeRequiredDescription
hoststringSimUm subdomínio, por exemplo go.mia-links.com
curl -X POST https://api.lanachat.ai/v1/domains \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"host": "go.mia-links.com"}'

A resposta é o novo domínio com status: "pending" e seu token para o registro TXT. O host é limpo (minúsculas, sem https://, sem caminho). Domínios raiz, *.lanachat.app e domínios já adicionados respondem 400 com uma frase.

Verificar um domínio #

POST /domains/{host}/verify · can_tracking

curl -X POST https://api.lanachat.ai/v1/domains/go.mia-links.com/verify \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
{ "host": "go.mia-links.com", "builtin": false, "status": "verified", "error": null, "ssl": "issuing", "is_default": false, "label": null, "token": "8be03d5f19a2", "checks": 3, "added_at": "2026-10-05T10:00:00Z", "verified_at": "2026-10-06T14:45:00Z", "last_check_at": "2026-10-06T14:45:00Z" }

Quando um registro está errado, o status é error e o error diz qual, por exemplo "The CNAME record points to another service." O domínio LanaChat não pode ser verificado (seu DNS é gerenciado pelo LanaChat).

Alterar um domínio #

PATCH /domains/{host} · can_tracking

ParameterTypeRequiredDescription
is_defaultbooleanNãotrue para torná-lo o domínio padrão; o padrão anterior deixa de ser
labelstring ou nullNãoUm nome para sua equipe, até 60 caracteres
curl -X PATCH https://api.lanachat.ai/v1/domains/go.mia-links.com \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"is_default": true}'

Só um domínio verificado pode ser padrão. O domínio LanaChat rejeita rótulo (403).

Remover um domínio #

DELETE /domains/{host} · can_tracking

curl -X DELETE https://api.lanachat.ai/v1/domains/go.mia-links.com \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

Remover o domínio LanaChat, o domínio padrão ("Set another default domain first") ou um domínio usado por links ativos ("Used by N active links across all creators") responde 409.

Pixels #

Eventos são enviados servidor a servidor, deduplicados com o pixel do navegador pelo mesmo event_id, com o id do Telegram do fan hashado (SHA-256), nunca cru. Sem consentimento, nenhum evento é enviado, jamais. Um pixel dispara só para links que o habilitam.

Ler conexões de pixel #

GET /pixels · can_tracking

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

A resposta contém uma conexão de pixel para cada um de meta, tiktok e snap, e o mode de consentimento.

Conectar um pixel #

PUT /pixels/{provider} · owner

ParameterTypeRequiredDescription
pixel_idstringSimMeta: 15 ou 16 dígitos. TikTok: 20 letras maiúsculas ou dígitos. Snap: um UUID
access_tokenstringSimO token da API de Conversions da plataforma
test_event_codestringNãoO código de teste da plataforma
curl -X PUT https://api.lanachat.ai/v1/pixels/meta \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pixel_id": "123456789012345", "access_token": "EAAG…", "test_event_code": "TEST4821"}'
{ "connected": true, "pixel_id": "123456789012345", "token_last4": "x9Qa", "token_status": "valid", "token_error": null, "test_event_code": "TEST4821", "connected_at": "2026-10-06T14:30:00Z" }

O token de acesso é armazenado criptografado e nunca retornado: só token_last4. Um pixel id em formato errado ou token vazio responde 400.

Desconectar um pixel #

DELETE /pixels/{provider} · owner

curl -X DELETE https://api.lanachat.ai/v1/pixels/meta \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

Enviar um evento de teste #

POST /pixels/{provider}/test · can_tracking

curl -X POST https://api.lanachat.ai/v1/pixels/meta/test \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
{ "ok": true, "status": 200, "body": "{\"events_received\":1}" }

status e body são a resposta da própria plataforma, assim você vê exatamente o que Meta, TikTok ou Snap disseram.

Definir o modo de consentimento #

PUT /pixels/consent · owner

ParameterTypeRequiredDescription
modestringSimpage: uma tela de consentimento para cada fan antes do Telegram abrir. implicit_by_country: a tela só na UE, EEE, Reino Unido e Suíça
curl -X PUT https://api.lanachat.ai/v1/pixels/consent \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "implicit_by_country"}'

Eventos #

Eventos embutidos: Lead (conversa iniciada por link), Contact (primeira mensagem do fan), Purchase (venda verificada), Subscribe, InitiateCheckout. Eventos personalizados têm um trigger: sale_over (venda acima de um valor em dólares), tag_added (uma tag), nth_message (a N-ésima mensagem do fan, 2 ou mais) ou offer_viewed.

Listar eventos #

GET /events · can_tracking

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

A resposta lista objetos evento com suas entregas aceitas e falhas em 7 dias, por rede.

Criar um evento personalizado #

POST /events · owner

ParameterTypeRequiredDescription
namestringSimUma letra, depois até 39 letras, dígitos ou underscores; único no workspace
triggerobjectSimtype: sale_over, tag_added, nth_message ou offer_viewed; value para os três primeiros
networksobjectNãometa, tiktok, snap: true para enviar lá
curl -X POST https://api.lanachat.ai/v1/events \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"name": "BigSpender", "trigger": {"type": "sale_over", "value": 50}, "networks": {"meta": true, "tiktok": true, "snap": false}}'

A resposta é o novo evento (201). Um nome já usado responde 409.

Ligar ou desligar um evento #

PATCH /events/{id} · owner

ParameterTypeRequiredDescription
networksobjectSimmeta, tiktok, snap: true ou false
curl -X PATCH https://api.lanachat.ai/v1/events/evt_purchase \
  -H "Authorization: Bearer $LANACHAT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"networks": {"meta": true, "tiktok": true, "snap": true}}'

Excluir um evento personalizado #

DELETE /events/{id} · owner

curl -X DELETE https://api.lanachat.ai/v1/events/evt_bigspender \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

Eventos embutidos não podem ser excluídos; desligue-os.

Estatísticas #

Ler estatísticas #

GET /stats · can_sales_read

ParameterTypeRequiredDescription
fromstringSimPrimeiro dia UTC, YYYY-MM-DD, incluído
tostringSimÚltimo dia UTC, YYYY-MM-DD, incluído
creator_idstringNãoApenas esta criadora; sem ele, todas
curl "https://api.lanachat.ai/v1/stats?from=2026-09-06&to=2026-10-05&creator_id=cr_lea" \
  -H "Authorization: Bearer $LANACHAT_TOKEN"

A resposta é o objeto estatísticas. Dias são UTC; links arquivados são excluídos.

Exportar estatísticas como CSV #

GET /stats/export.csv · can_sales_read

Mesmos parâmetros que GET /stats.

curl "https://api.lanachat.ai/v1/stats/export.csv?from=2026-09-06&to=2026-10-05" \
  -H "Authorization: Bearer $LANACHAT_TOKEN" -o stats.csv
date,link,slug,domain,creator,source,clicks,conversations,first_messages,buyers,revenue_stars
2026-10-05,TikTok · Lea night,lea-tiktok-night,go.mia-links.com,Lea,tiktok,54,9,7,2,950

As últimas novidades da Lana no Telegram

Novidades e convites para o beta, primeiro no canal.