API: link di tracciamento, domini, pixel e statistiche
Un link di tracciamento invia un visitatore a una creator su Telegram e conta ciò che segue: clic, conversazioni, primi messaggi, acquirenti e ricavi. I link possono risiedere sul tuo dominio personale, attivare pixel pubblicitari (Meta, TikTok, Snap) e inviare eventi server. Questi endpoint corrispondono alla pagina Tracking.
Endpoints #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /links | Elenca i link (creator_id=, archived=false) con i loro contatori | can_tracking o can_sales_read | Planned |
| POST | /links | Crea un link | can_tracking | Planned |
| GET | /links/{id} | Un link | can_tracking o can_sales_read | Planned |
| PUT | /links/{id} | Sostituisce un link (nome, slug, dominio, destinazione, UTM, pixel) | can_tracking | Planned |
| DELETE | /links/{id} | Archivia un link (permanent=1 lo elimina) | can_tracking | Planned |
| GET | /domains | I tuoi domini (status=active,inactive, q=) | can_tracking | Planned |
| POST | /domains | Aggiungi un dominio (stato pending) | can_tracking | Planned |
| POST | /domains/{host}/verify | Verifica ora i suoi record DNS | can_tracking | Planned |
| PATCH | /domains/{host} | Imposta un dominio verificato come predefinito, o cambia la sua etichetta | can_tracking | Planned |
| DELETE | /domains/{host} | Rimuovi un dominio non usato da link attivi | can_tracking | Planned |
| GET | /pixels | Le connessioni Meta, TikTok e Snap e la modalità consenso | can_tracking | Planned |
| PUT | /pixels/{provider} | Connetti o sostituisci un pixel (meta, tiktok, snap) | owner | Planned |
| DELETE | /pixels/{provider} | Disconnetti un pixel | owner | Planned |
| POST | /pixels/{provider}/test | Invia un evento di test e restituisce la risposta della piattaforma | can_tracking | Planned |
| PUT | /pixels/consent | Modalità consenso: page o implicit_by_country | owner | Planned |
| GET | /events | Eventi integrati e personalizzati, con conteggi di consegna a 7 giorni | can_tracking | Planned |
| POST | /events | Crea un evento personalizzato | owner | Planned |
| PATCH | /events/{id} | Attiva o disattiva un evento per rete | owner | Planned |
| DELETE | /events/{id} | Elimina un evento personalizzato | owner | Planned |
| GET | /stats | Totali giornalieri, per link e per fonte (from=, to=, creator_id=) | can_sales_read | Planned |
| GET | /stats/export.csv | Gli stessi numeri in CSV | can_sales_read | Planned |
L'oggetto 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 | Inizia con lnk_ |
name | string | Il nome visibile al tuo team |
slug | string | La parte finale dell'URL pubblico |
creator_id | string | La creator a cui il link indirizza |
source, campaign | string | Da dove proviene il traffico e il nome della tua campagna |
domain | string | Un dominio verificato dello workspace, o il dominio LanaChat |
public_url | string | https://<domain>/r/<slug>: l'URL da mettere in bio o in un annuncio |
destination | string | pool o account |
account_id | string o null | L'account fisso quando destination è account |
utm | object | source, medium, campaign |
pixels | object | Quali pixel connessi si attivano su questo link |
counters | object | clicks, conversations, first_messages, buyers, revenue_stars |
archived | boolean | I link archiviati sono esclusi dalle statistiche |
created_at | string | ISO 8601, UTC |
destinationèpool(l'account viene scelto al clic tra il pool della creator, vedi pools) oaccount(sempre lo stessoaccount_id).slug: lettere minuscole, cifre e trattini, da 1 a 48 caratteri, inizia e finisce con lettera o cifra, unico tra i link attivi dello stesso dominio.domaindeve essere un dominio verificato dello workspace; senza di esso si usa il dominio LanaChat.- Valori
utm: fino a 80 lettere, cifre, punti, trattini o underscore. Sono applicati a ogni clic e inoltrati agli eventi pixel.
L'oggetto 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
}
| Field | Type | Description |
|---|---|---|
host | string | Un sottodominio in minuscolo (almeno 3 etichette), unico nello workspace |
builtin | boolean | true per il dominio LanaChat, che non può mai essere rimosso |
status | string | verified, pending o error |
error | string o null | Una frase semplice quando status è error |
ssl | string | none, issuing o active |
is_default | boolean | Esattamente un dominio verificato è quello predefinito |
label | string o null | Un nome per il tuo team, fino a 60 caratteri |
token | string | Il valore del record TXT di verifica |
checks | number | Controlli DNS effettuati finora |
added_at, verified_at, last_check_at | string o null | ISO 8601, UTC |
L'oggetto connessione 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 | Il pixel è connesso |
pixel_id | string | Meta: 15 o 16 cifre. TikTok: 20 lettere maiuscole o cifre. Snap: un UUID |
token_last4 | string | Ultimi 4 caratteri del token di accesso, mai il token completo |
token_status | string | valid, expired o invalid |
token_error | string o null | Una frase semplice, per esempio "Access token expired on 3 Oct. Replace it to resume delivery." |
test_event_code | string o null | Il codice di test del gestore eventi della piattaforma |
connected_at | string | ISO 8601, UTC |
L'oggetto evento #
{
"id": "evt_purchase",
"name": "Purchase",
"builtin": true,
"trigger": { "type": "purchase" },
"networks": { "meta": true, "tiktok": true, "snap": false }
}
| Field | Type | Description |
|---|---|---|
id | string | L'id dell'evento |
name | string | Nome integrato, o tuo nome personalizzato: una lettera, poi fino a 39 lettere, cifre o underscore, unico nello workspace |
builtin | boolean | true per Lead, Contact, Purchase, Subscribe e InitiateCheckout |
trigger | object | type, e un value per i trigger che ne hanno bisogno |
networks | object | Attivo o no per meta, tiktok e snap |
L'oggetto statistiche #
{
"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 | Una riga per ogni giorno UTC del periodo |
links | array | Una riga per ogni link, su tutto il periodo |
sources | array | Una riga per ogni gruppo di fonte: instagram, tiktok, snapchat, meta, x e other |
clicks | number | Reindirizzamenti serviti |
conversations | number | Conversazioni Telegram iniziate con il link |
first_messages | number | Fans che hanno scritto almeno una volta |
buyers | number | Fans distinti con acquisto Stars verificato nel periodo |
revenue_stars | number | Acquisti Stars verificati di quei fans nel periodo |
Link #
Elenca link #
GET /links · can_tracking o can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | No | Solo i link di questa creator |
archived | boolean | No | false (vista predefinita) nasconde i link archiviati |
limit, cursor | number, string | No | Paginazione |
curl "https://api.lanachat.ai/v1/links?creator_id=cr_lea&archived=false" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La risposta è una lista paginata di oggetti link, ciascuno con i suoi counters.
Crea un link #
POST /links · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Sì | Il nome visibile al tuo team |
slug | string | Sì | Lettere minuscole, cifre e trattini, da 1 a 48 caratteri |
creator_id | string | Sì | La creator a cui il link indirizza |
source | string | No | instagram, tiktok, snapchat, meta, x o altra fonte |
campaign | string | No | Il nome della tua campagna |
destination | string | No | pool o account |
account_id | string | Quando destination è account | L'account Telegram fisso |
domain | string | No | Un dominio verificato; senza di esso il dominio LanaChat |
utm | object | No | source, medium, campaign |
pixels | object | No | meta, tiktok, snap: true per attivare quel 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"
}
- Uno slug già usato risponde
409conThe slug /lea-bio is already used by "Insta bio · Mia". - Un dominio non verificato risponde
400("Pick a verified domain…").
Ottieni un link #
GET /links/{id} · can_tracking o can_sales_read
curl https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La risposta è l'oggetto link. Un id sconosciuto risponde 404.
Sostituisci un link #
PUT /links/{id} · can_tracking
Stesso corpo di Crea un link; PUT sostituisce tutto il link, quindi invia tutti i campi da mantenere.
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 risposta è il link aggiornato. Stessi errori di quando crei un link.
Archivia o elimina un link #
DELETE /links/{id} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
permanent | number | No | 1 elimina il link definitivamente invece di archiviarlo |
curl -X DELETE https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Un link archiviato è escluso dalle statistiche.
Domini #
Per usare un dominio tuo, aggiungilo, crea due record DNS, poi verificane la proprietà:
CNAME go.mia-links.com → links.lanachat.appTXT _lanachat.go.mia-links.com = lanachat-verify=8be03d5f19a2
I domini in pending sono controllati ogni 10 minuti per 72 ore, poi ogni giorno. Lo status diventa verified e ssl passa da issuing a active.
Elenca domini #
GET /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | active (verificati) o inactive (pending o error) |
q | string | No | Parte dell'host o dell'etichetta |
curl "https://api.lanachat.ai/v1/domains?status=active" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La risposta elenca oggetti dominio, incluso il dominio LanaChat (builtin: true).
Aggiungi un dominio #
POST /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
host | string | Sì | Un sottodominio, per esempio 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 risposta è il nuovo dominio con status: "pending" e il suo token per il record TXT. L'host viene pulito (minuscolo, senza https://, senza path). I domini root, *.lanachat.app e un dominio già aggiunto rispondono 400 con una frase.
Verifica 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" }
Quando un record è errato, status è error e error indica quale, per esempio "The CNAME record points to another service." Il dominio LanaChat non può essere verificato (il suo DNS è gestito da LanaChat).
Modifica un dominio #
PATCH /domains/{host} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
is_default | boolean | No | true lo imposta come dominio predefinito; il precedente predefinito non lo sarà più |
label | string o null | No | Un nome per il tuo team, fino a 60 caratteri |
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 verificato può essere predefinito. Il dominio LanaChat rifiuta un'etichetta (403).
Rimuovi 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"
Rimuovere il dominio LanaChat, il dominio predefinito ("Set another default domain first") o un dominio usato da link attivi ("Used by N active links across all creators") risponde 409.
Pixel #
Gli eventi sono inviati server to server, deduplicati con il pixel browser tramite lo stesso event_id, con l'id Telegram del fan hashato (SHA-256), mai in chiaro. Senza consenso nessun evento è mai inviato. Un pixel si attiva solo per i link che lo abilitano.
Leggi connessioni pixel #
GET /pixels · can_tracking
curl https://api.lanachat.ai/v1/pixels \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La risposta contiene una connessione pixel per ciascuno di meta, tiktok e snap, e la mode del consenso.
Connetti un pixel #
PUT /pixels/{provider} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | Sì | Meta: 15 o 16 cifre. TikTok: 20 lettere maiuscole o cifre. Snap: un UUID |
access_token | string | Sì | Il token API Conversions della piattaforma |
test_event_code | string | No | Il codice di test della piattaforma |
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" }
Il token di accesso è memorizzato criptato e mai restituito: solo token_last4. Un pixel id in formato errato o un token vuoto rispondono 400.
Disconnetti un pixel #
DELETE /pixels/{provider} · owner
curl -X DELETE https://api.lanachat.ai/v1/pixels/meta \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Invia un evento di test #
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 sono la risposta diretta della piattaforma, così vedi esattamente cosa hanno risposto Meta, TikTok o Snap.
Imposta la modalità consenso #
PUT /pixels/consent · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | Sì | page: schermata consenso per ogni fan prima che Telegram si apra. implicit_by_country: schermata solo in UE, SEE, UK e Svizzera |
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"}'
Eventi #
Eventi integrati: Lead (conversazione iniziata da un link), Contact (primo messaggio fan), Purchase (vendita verificata), Subscribe, InitiateCheckout. Eventi personalizzati hanno un trigger: sale_over (vendita sopra una certa somma in dollari), tag_added (un tag), nth_message (il N-esimo messaggio fan, 2 o più) o offer_viewed.
Elenca eventi #
GET /events · can_tracking
curl https://api.lanachat.ai/v1/events \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La risposta elenca oggetti evento con le consegne accettate e fallite in 7 giorni, per rete.
Crea un evento personalizzato #
POST /events · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Sì | Una lettera, poi fino a 39 lettere, cifre o underscore; unico nello workspace |
trigger | object | Sì | type: sale_over, tag_added, nth_message o offer_viewed; value per i primi tre |
networks | object | No | meta, tiktok, snap: true per inviarlo 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}}'
La risposta è il nuovo evento (201). Un nome già usato risponde 409.
Attiva o disattiva un evento #
PATCH /events/{id} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
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}}'
Elimina un evento personalizzato #
DELETE /events/{id} · owner
curl -X DELETE https://api.lanachat.ai/v1/events/evt_bigspender \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Gli eventi integrati non possono essere eliminati; disattivali invece.
Statistiche #
Leggi statistiche #
GET /stats · can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Sì | Primo giorno UTC, YYYY-MM-DD, incluso |
to | string | Sì | Ultimo giorno UTC, YYYY-MM-DD, incluso |
creator_id | string | No | Solo questa creator; senza, tutte le creators |
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 risposta è l'oggetto statistiche. I giorni sono UTC; i link archiviati sono esclusi.
Esporta statistiche in CSV #
GET /stats/export.csv · can_sales_read
Stessi parametri di 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