API: links de rastreamento, domínios, pixels e estatísticas
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 #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /links | Lista links (creator_id=, archived=false) com seus contadores | can_tracking ou can_sales_read | Planned |
| POST | /links | Cria um link | can_tracking | Planned |
| GET | /links/{id} | Um link | can_tracking ou can_sales_read | Planned |
| PUT | /links/{id} | Substitui um link (nome, slug, domínio, destino, UTM, pixels) | can_tracking | Planned |
| DELETE | /links/{id} | Arquiva um link (permanent=1 o exclui) | can_tracking | Planned |
| GET | /domains | Seus domínios (status=active,inactive, q=) | can_tracking | Planned |
| POST | /domains | Adiciona um domínio (status pending) | can_tracking | Planned |
| POST | /domains/{host}/verify | Verifica seus registros DNS agora | can_tracking | Planned |
| PATCH | /domains/{host} | Define um domínio verificado como padrão, ou altera seu rótulo | can_tracking | Planned |
| DELETE | /domains/{host} | Remove um domínio que nenhum link ativo usa | can_tracking | Planned |
| GET | /pixels | As conexões Meta, TikTok e Snap e o modo de consentimento | can_tracking | Planned |
| PUT | /pixels/{provider} | Conecta ou substitui um pixel (meta, tiktok, snap) | owner | Planned |
| DELETE | /pixels/{provider} | Desconecta um pixel | owner | Planned |
| POST | /pixels/{provider}/test | Envia um evento de teste e retorna a resposta da plataforma | can_tracking | Planned |
| PUT | /pixels/consent | Modo de consentimento: page ou implicit_by_country | owner | Planned |
| GET | /events | Eventos embutidos e personalizados, com contagem de entregas em 7 dias | can_tracking | Planned |
| POST | /events | Cria um evento personalizado | owner | Planned |
| PATCH | /events/{id} | Liga ou desliga um evento por rede | owner | Planned |
| DELETE | /events/{id} | Exclui um evento personalizado | owner | Planned |
| GET | /stats | Totais diários, por link e por fonte (from=, to=, creator_id=) | can_sales_read | Planned |
| GET | /stats/export.csv | Os mesmos números em CSV | can_sales_read | Planned |
O objeto link #
{
"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"
}
| Field | Type | Description |
|---|---|---|
id | string | Começa com lnk_ |
name | string | O nome que sua equipe vê |
slug | string | O final da URL pública |
creator_id | string | A criadora para quem o link envia |
source, campaign | string | De onde vem o tráfego e o nome da sua campanha |
domain | string | Um domínio verificado do workspace, ou o domínio LanaChat |
public_url | string | https://<domain>/r/<slug>: a URL para colocar na bio ou anúncio |
destination | string | pool ou account |
account_id | string ou null | A conta fixa quando destination é account |
utm | object | source, medium, campaign |
pixels | object | Quais pixels conectados disparam neste link |
counters | object | clicks, conversations, first_messages, buyers, revenue_stars |
archived | boolean | Links arquivados são excluídos das estatísticas |
created_at | string | ISO 8601, UTC |
destinationépool(a conta é escolhida no clique entre a pool da criadora, veja pools) ouaccount(sempre a mesmaaccount_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.domaindeve 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
}
| Field | Type | Description |
|---|---|---|
host | string | Um subdomínio em minúsculas (pelo menos 3 níveis), único no workspace |
builtin | boolean | true para o domínio LanaChat, que nunca pode ser removido |
status | string | verified, pending ou error |
error | string ou null | Uma frase simples quando status é error |
ssl | string | none, issuing ou active |
is_default | boolean | Exatamente um domínio verificado é o padrão |
label | string ou null | Um nome para sua equipe, até 60 caracteres |
token | string | O valor do registro TXT de verificação |
checks | number | Verificações DNS feitas até agora |
added_at, verified_at, last_check_at | string ou null | ISO 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" }
| Field | Type | Description |
|---|---|---|
connected | boolean | O pixel está conectado |
pixel_id | string | Meta: 15 ou 16 dígitos. TikTok: 20 letras maiúsculas ou dígitos. Snap: um UUID |
token_last4 | string | Os últimos 4 caracteres do token de acesso, nunca o token completo |
token_status | string | valid, expired ou invalid |
token_error | string ou null | Uma frase simples, por exemplo "Access token expired on 3 Oct. Replace it to resume delivery." |
test_event_code | string ou null | O código de teste do gerenciador de eventos da plataforma |
connected_at | string | ISO 8601, UTC |
O objeto evento #
{
"id": "evt_purchase",
"name": "Purchase",
"builtin": true,
"trigger": { "type": "purchase" },
"networks": { "meta": true, "tiktok": true, "snap": false }
}
| Field | Type | Description |
|---|---|---|
id | string | O id do evento |
name | string | Nome embutido, ou seu nome personalizado: uma letra, depois até 39 letras, dígitos ou underscores, único no workspace |
builtin | boolean | true para Lead, Contact, Purchase, Subscribe e InitiateCheckout |
trigger | object | type, e um value para os triggers que precisam |
networks | object | Ligado 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 } ]
}
| Field | Type | Description |
|---|---|---|
days | array | Uma linha por dia UTC do período |
links | array | Uma linha por link, no período todo |
sources | array | Uma linha por grupo de fonte: instagram, tiktok, snapchat, meta, x e other |
clicks | number | Redirecionamentos servidos |
conversations | number | Conversas no Telegram iniciadas pelo link |
first_messages | number | Fans que escreveram pelo menos uma vez |
buyers | number | Fans distintos com compra verificada de Stars no período |
revenue_stars | number | Compras verificadas de Stars desses fans no período |
Links #
Listar links #
GET /links · can_tracking ou can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Não | Apenas links desta criadora |
archived | boolean | Não | false (visualização padrão) oculta links arquivados |
limit, cursor | number, string | Não | Paginaçã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.
Criar um link #
POST /links · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Sim | O nome que sua equipe vê |
slug | string | Sim | Letras minúsculas, dígitos e traços, 1 a 48 caracteres |
creator_id | string | Sim | A criadora para quem o link envia |
source | string | Não | instagram, tiktok, snapchat, meta, x ou outra fonte |
campaign | string | Não | O nome da sua campanha |
destination | string | Não | pool ou account |
account_id | string | Quando destination é account | A conta fixa do Telegram |
domain | string | Não | Um domínio verificado; sem ele, o domínio LanaChat |
utm | object | Não | source, medium, campaign |
pixels | object | Não | meta, 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
409comThe slug /lea-bio is already used by "Insta bio · Mia". - Um domínio não verificado responde
400("Pick a verified domain…").
Obter um link #
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.
Substituir um link #
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.
Arquivar ou excluir um link #
DELETE /links/{id} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
permanent | number | Não | 1 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.appTXT _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
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | Não | active (verificado) ou inactive (pendente ou erro) |
q | string | Não | Parte 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
| Parameter | Type | Required | Description |
|---|---|---|---|
host | string | Sim | Um 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
| Parameter | Type | Required | Description |
|---|---|---|---|
is_default | boolean | Não | true para torná-lo o domínio padrão; o padrão anterior deixa de ser |
label | string ou null | Não | Um 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
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | Sim | Meta: 15 ou 16 dígitos. TikTok: 20 letras maiúsculas ou dígitos. Snap: um UUID |
access_token | string | Sim | O token da API de Conversions da plataforma |
test_event_code | string | Não | O 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
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | Sim | page: 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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Sim | Uma letra, depois até 39 letras, dígitos ou underscores; único no workspace |
trigger | object | Sim | type: sale_over, tag_added, nth_message ou offer_viewed; value para os três primeiros |
networks | object | Não | meta, 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
| Parameter | Type | Required | Description |
|---|---|---|---|
networks | object | Sim | meta, 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
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Sim | Primeiro dia UTC, YYYY-MM-DD, incluído |
to | string | Sim | Último dia UTC, YYYY-MM-DD, incluído |
creator_id | string | Não | Apenas 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