API: enlaces de seguimiento, dominios, píxeles y estadísticas
Un enlace de seguimiento envía a un visitante a una creadora en Telegram y cuenta lo que sigue: clics, conversaciones, primeros mensajes, compradores e ingresos. Los enlaces pueden estar en tu propio dominio, activar píxeles de publicidad (Meta, TikTok, Snap) y enviar eventos al servidor. Estos endpoints coinciden con la página Tracking.
Endpoints #
| Método | Ruta | Descripción | Permiso | Estado |
|---|---|---|---|---|
| GET | /links | Lista enlaces (creator_id=, archived=false) con sus contadores | can_tracking o can_sales_read | Planned |
| POST | /links | Crear un enlace | can_tracking | Planned |
| GET | /links/{id} | Un enlace | can_tracking o can_sales_read | Planned |
| PUT | /links/{id} | Reemplazar un enlace (nombre, slug, dominio, destino, UTM, píxeles) | can_tracking | Planned |
| DELETE | /links/{id} | Archivar un enlace (permanent=1 lo elimina) | can_tracking | Planned |
| GET | /domains | Tus dominios (status=active,inactive, q=) | can_tracking | Planned |
| POST | /domains | Añadir un dominio (estado pending) | can_tracking | Planned |
| POST | /domains/{host}/verify | Verificar sus registros DNS ahora | can_tracking | Planned |
| PATCH | /domains/{host} | Hacer un dominio verificado el predeterminado, o cambiar su etiqueta | can_tracking | Planned |
| DELETE | /domains/{host} | Eliminar un dominio que no use ningún enlace activo | can_tracking | Planned |
| GET | /pixels | Las conexiones de Meta, TikTok y Snap y el modo de consentimiento | can_tracking | Planned |
| PUT | /pixels/{provider} | Conectar o reemplazar un píxel (meta, tiktok, snap) | owner | Planned |
| DELETE | /pixels/{provider} | Desconectar un píxel | owner | Planned |
| POST | /pixels/{provider}/test | Enviar un evento de prueba y devolver la respuesta de la plataforma | can_tracking | Planned |
| PUT | /pixels/consent | Modo de consentimiento: page o implicit_by_country | owner | Planned |
| GET | /events | Eventos integrados y personalizados, con conteos de entrega de 7 días | can_tracking | Planned |
| POST | /events | Crear un evento personalizado | owner | Planned |
| PATCH | /events/{id} | Activar o desactivar un evento por red | owner | Planned |
| DELETE | /events/{id} | Eliminar un evento personalizado | owner | Planned |
| GET | /stats | Totales diarios, por enlace y por fuente (from=, to=, creator_id=) | can_sales_read | Planned |
| GET | /stats/export.csv | Los mismos números en CSV | can_sales_read | Planned |
El objeto enlace #
{
"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"
}
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Empieza con lnk_ |
name | string | El nombre que ve tu equipo |
slug | string | El final de la URL pública |
creator_id | string | La creadora a la que envía el enlace |
source, campaign | string | De dónde viene el tráfico y el nombre de tu campaña |
domain | string | Un dominio verificado del workspace, o el dominio de LanaChat |
public_url | string | https://<domain>/r/<slug>: la URL para poner en una bio o un anuncio |
destination | string | pool o account |
account_id | string o null | La cuenta fija cuando destination es account |
utm | object | source, medium, campaign |
pixels | object | Qué píxeles conectados se activan con este enlace |
counters | object | clicks, conversations, first_messages, buyers, revenue_stars |
archived | boolean | Los enlaces archivados se excluyen de las estadísticas |
created_at | string | ISO 8601, UTC |
destinationespool(la cuenta se elige al hacer clic entre el pool de la creadora, ver pools) oaccount(siempre la mismaaccount_id).slug: letras minúsculas, dígitos y guiones, de 1 a 48 caracteres, empezando y terminando con letra o dígito, único entre enlaces activos del mismo dominio.domaindebe ser un dominio verificado del workspace; sin él se usa el dominio de LanaChat.- Valores
utm: hasta 80 letras, dígitos, puntos, guiones o guiones bajos. Se añaden en cada clic y se envían a los eventos de píxel.
El objeto dominio #
{
"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
}
| Campo | Tipo | Descripción |
|---|---|---|
host | string | Un subdominio en minúsculas (al menos 3 etiquetas), único en el workspace |
builtin | boolean | true para el dominio de LanaChat, que nunca se puede eliminar |
status | string | verified, pending o error |
error | string o null | Una frase simple cuando status es error |
ssl | string | none, issuing o active |
is_default | boolean | Exactamente un dominio verificado es el predeterminado |
label | string o null | Un nombre para tu equipo, hasta 60 caracteres |
token | string | El valor del registro TXT de verificación |
checks | number | Comprobaciones DNS realizadas hasta ahora |
added_at, verified_at, last_check_at | string o null | ISO 8601, UTC |
El objeto conexión de píxel #
{ "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" }
| Campo | Tipo | Descripción |
|---|---|---|
connected | boolean | El píxel está conectado |
pixel_id | string | Meta: 15 o 16 dígitos. TikTok: 20 letras mayúsculas o dígitos. Snap: un UUID |
token_last4 | string | Los últimos 4 caracteres del token de acceso, nunca el token completo |
token_status | string | valid, expired o invalid |
token_error | string o null | Una frase simple, por ejemplo "Access token expired on 3 Oct. Replace it to resume delivery." |
test_event_code | string o null | El código de prueba del gestor de eventos de la plataforma |
connected_at | string | ISO 8601, UTC |
El objeto evento #
{
"id": "evt_purchase",
"name": "Purchase",
"builtin": true,
"trigger": { "type": "purchase" },
"networks": { "meta": true, "tiktok": true, "snap": false }
}
| Campo | Tipo | Descripción |
|---|---|---|
id | string | El id del evento |
name | string | Nombre integrado, o tu nombre personalizado: una letra, luego hasta 39 letras, dígitos o guiones bajos, único en el workspace |
builtin | boolean | true para Lead, Contact, Purchase, Subscribe e InitiateCheckout |
trigger | object | type, y un value para los triggers que lo requieren |
networks | object | Activado o desactivado para meta, tiktok y snap |
El objeto estadí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 } ]
}
| Campo | Tipo | Descripción |
|---|---|---|
days | array | Una fila por día UTC del período |
links | array | Una fila por enlace, en todo el período |
sources | array | Una fila por grupo de fuente: instagram, tiktok, snapchat, meta, x y other |
clicks | number | Redirecciones servidas |
conversations | number | Conversaciones de Telegram iniciadas con el enlace |
first_messages | number | Fans que escribieron al menos una vez |
buyers | number | Fans distintos con una compra verificada de Stars en el período |
revenue_stars | number | Compras verificadas de Stars de esos fans en el período |
Enlaces #
Listar enlaces #
GET /links · can_tracking o can_sales_read
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
creator_id | string | No | Solo enlaces de esta creadora |
archived | boolean | No | false (vista por defecto) oculta enlaces archivados |
limit, cursor | number, string | No | Paginación |
curl "https://api.lanachat.ai/v1/links?creator_id=cr_lea&archived=false" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta es una lista paginada de objetos enlace, cada uno con sus counters.
Crear un enlace #
POST /links · can_tracking
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | Sí | El nombre que ve tu equipo |
slug | string | Sí | Letras minúsculas, dígitos y guiones, de 1 a 48 caracteres |
creator_id | string | Sí | La creadora a la que envía el enlace |
source | string | No | instagram, tiktok, snapchat, meta, x u otra fuente |
campaign | string | No | El nombre de tu campaña |
destination | string | No | pool o account |
account_id | string | Cuando destination es account | La cuenta fija de Telegram |
domain | string | No | Un dominio verificado; sin él se usa el dominio de LanaChat |
utm | object | No | source, medium, campaign |
pixels | object | No | meta, tiktok, snap: true para activar ese píxel |
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"
}
- Un slug ya usado responde
409conThe slug /lea-bio is already used by "Insta bio · Mia". - Un dominio no verificado responde
400("Pick a verified domain…").
Obtener un enlace #
GET /links/{id} · can_tracking o can_sales_read
curl https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta es el objeto enlace. Un id desconocido responde 404.
Reemplazar un enlace #
PUT /links/{id} · can_tracking
Mismo cuerpo que Crear un enlace; PUT reemplaza todo el enlace, así que envía todos los campos que quieras conservar.
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}}'
La respuesta es el enlace actualizado. Mismos errores que al crear uno.
Archivar o eliminar un enlace #
DELETE /links/{id} · can_tracking
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
permanent | number | No | 1 elimina el enlace definitivamente en lugar de archivarlo |
curl -X DELETE https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Un enlace archivado se excluye de las estadísticas.
Dominios #
Para usar tu propio dominio, añádelo, crea dos registros DNS y luego verifícalo:
CNAME go.mia-links.com → links.lanachat.appTXT _lanachat.go.mia-links.com = lanachat-verify=8be03d5f19a2
Los dominios pendientes también se revisan cada 10 minutos durante 72 horas, luego diariamente. El status pasa a verified y el ssl cambia a issuing y luego active.
Listar dominios #
GET /domains · can_tracking
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
status | string | No | active (verificado) o inactive (pendiente o error) |
q | string | No | Parte del host o de la etiqueta |
curl "https://api.lanachat.ai/v1/domains?status=active" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta lista objetos dominio, incluido el dominio de LanaChat (builtin: true).
Añadir un dominio #
POST /domains · can_tracking
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
host | string | Sí | Un subdominio, por ejemplo 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"}'
La respuesta es el nuevo dominio con status: "pending" y su token para el registro TXT. El host se limpia (minúsculas, sin https://, sin ruta). Dominios raíz, *.lanachat.app y un dominio ya añadido responden 400 con una frase.
Verificar un dominio #
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" }
Cuando un registro es incorrecto, status es error y error indica cuál, por ejemplo "The CNAME record points to another service." El dominio de LanaChat no puede verificarse (su DNS lo gestiona LanaChat).
Cambiar un dominio #
PATCH /domains/{host} · can_tracking
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
is_default | boolean | No | true lo hace el dominio predeterminado; el anterior predeterminado deja de serlo |
label | string o null | No | Un nombre para tu equipo, hasta 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}'
Solo un dominio verificado puede ser el predeterminado. El dominio de LanaChat rechaza una etiqueta (403).
Eliminar un dominio #
DELETE /domains/{host} · can_tracking
curl -X DELETE https://api.lanachat.ai/v1/domains/go.mia-links.com \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Eliminar el dominio de LanaChat, el dominio predeterminado ("Set another default domain first") o un dominio usado por enlaces activos ("Used by N active links across all creators") responde 409.
Píxeles #
Los eventos se envían servidor a servidor, deduplicados con el píxel del navegador mediante el mismo event_id, con el id de Telegram del fan hasheado (SHA-256), nunca en crudo. Sin consentimiento no se envía ningún evento, nunca. Un píxel se activa solo para enlaces que lo habilitan.
Leer conexiones de píxel #
GET /pixels · can_tracking
curl https://api.lanachat.ai/v1/pixels \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta contiene una conexión de píxel para cada uno de meta, tiktok y snap, y el mode de consentimiento.
Conectar un píxel #
PUT /pixels/{provider} · owner
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
pixel_id | string | Sí | Meta: 15 o 16 dígitos. TikTok: 20 letras mayúsculas o dígitos. Snap: un UUID |
access_token | string | Sí | El token de la API de Conversiones de la plataforma |
test_event_code | string | No | El código de prueba de la 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" }
El token de acceso se almacena cifrado y nunca se devuelve: solo token_last4. Un id de píxel en formato incorrecto o un token vacío responde 400.
Desconectar un píxel #
DELETE /pixels/{provider} · owner
curl -X DELETE https://api.lanachat.ai/v1/pixels/meta \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Enviar un evento de prueba #
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 y body son la respuesta propia de la plataforma, así ves exactamente lo que dijo Meta, TikTok o Snap.
Configurar el modo de consentimiento #
PUT /pixels/consent · owner
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
mode | string | Sí | page: una pantalla de consentimiento para cada fan antes de abrir Telegram. implicit_by_country: la pantalla solo en la UE y EEE, Reino Unido y Suiza |
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 integrados: Lead (conversación iniciada desde un enlace), Contact (primer mensaje del fan), Purchase (venta verificada), Subscribe, InitiateCheckout. Los eventos personalizados tienen un trigger: sale_over (una venta sobre un monto en dólares), tag_added (una etiqueta), nth_message (el N-ésimo mensaje del fan, 2 o más) u offer_viewed.
Listar eventos #
GET /events · can_tracking
curl https://api.lanachat.ai/v1/events \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta lista objetos evento con sus entregas aceptadas y fallidas en 7 días, por red.
Crear un evento personalizado #
POST /events · owner
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | Sí | Una letra, luego hasta 39 letras, dígitos o guiones bajos; único en el workspace |
trigger | object | Sí | type: sale_over, tag_added, nth_message u offer_viewed; value para los tres primeros |
networks | object | No | meta, tiktok, snap: true para enviarlo ahí |
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}}'
La respuesta es el nuevo evento (201). Un nombre ya usado responde 409.
Activar o desactivar un evento #
PATCH /events/{id} · owner
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
networks | object | Sí | meta, tiktok, snap: true o 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}}'
Eliminar un evento personalizado #
DELETE /events/{id} · owner
curl -X DELETE https://api.lanachat.ai/v1/events/evt_bigspender \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Los eventos integrados no se pueden eliminar; desactívalos en su lugar.
Estadísticas #
Leer estadísticas #
GET /stats · can_sales_read
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
from | string | Sí | Primer día UTC, YYYY-MM-DD, incluido |
to | string | Sí | Último día UTC, YYYY-MM-DD, incluido |
creator_id | string | No | Solo esta creadora; sin él, todas las creadoras |
curl "https://api.lanachat.ai/v1/stats?from=2026-09-06&to=2026-10-05&creator_id=cr_lea" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta es el objeto estadísticas. Los días son UTC; los enlaces archivados se excluyen.
Exportar estadísticas en CSV #
GET /stats/export.csv · can_sales_read
Mismos 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