API : liens de tracking, domaines, pixels et statistiques
Un lien de tracking envoie un visiteur vers une créatrice sur Telegram et compte ce qui suit : clics, conversations, premiers messages, acheteurs et revenus. Les liens peuvent être hébergés sur votre propre domaine, déclencher des pixels publicitaires (Meta, TikTok, Snap) et envoyer des événements serveur. Ces points d’accès correspondent à la page Tracking.
Endpoints #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /links | Liste des liens (creator_id=, archived=false) avec leurs compteurs | can_tracking ou can_sales_read | Planned |
| POST | /links | Créer un lien | can_tracking | Planned |
| GET | /links/{id} | Un lien | can_tracking ou can_sales_read | Planned |
| PUT | /links/{id} | Remplacer un lien (nom, slug, domaine, destination, UTM, pixels) | can_tracking | Planned |
| DELETE | /links/{id} | Archiver un lien (permanent=1 le supprime) | can_tracking | Planned |
| GET | /domains | Vos domaines (status=active,inactive, q=) | can_tracking | Planned |
| POST | /domains | Ajouter un domaine (statut pending) | can_tracking | Planned |
| POST | /domains/{host}/verify | Vérifier ses enregistrements DNS maintenant | can_tracking | Planned |
| PATCH | /domains/{host} | Faire d’un domaine vérifié le domaine par défaut, ou changer son label | can_tracking | Planned |
| DELETE | /domains/{host} | Supprimer un domaine non utilisé par un lien actif | can_tracking | Planned |
| GET | /pixels | Connexions Meta, TikTok et Snap et mode consentement | can_tracking | Planned |
| PUT | /pixels/{provider} | Connecter ou remplacer un pixel (meta, tiktok, snap) | owner | Planned |
| DELETE | /pixels/{provider} | Déconnecter un pixel | owner | Planned |
| POST | /pixels/{provider}/test | Envoyer un événement test et retourner la réponse de la plateforme | can_tracking | Planned |
| PUT | /pixels/consent | Mode consentement : page ou implicit_by_country | owner | Planned |
| GET | /events | Événements intégrés et personnalisés, avec compteurs sur 7 jours | can_tracking | Planned |
| POST | /events | Créer un événement personnalisé | owner | Planned |
| PATCH | /events/{id} | Activer ou désactiver un événement par réseau | owner | Planned |
| DELETE | /events/{id} | Supprimer un événement personnalisé | owner | Planned |
| GET | /stats | Totaux journaliers, par lien et par source (from=, to=, creator_id=) | can_sales_read | Planned |
| GET | /stats/export.csv | Les mêmes chiffres au format CSV | can_sales_read | Planned |
L’objet lien #
{
"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 | Commence par lnk_ |
name | string | Le nom visible par votre équipe |
slug | string | La fin de l’URL publique |
creator_id | string | La créatrice vers laquelle le lien redirige |
source, campaign | string | Origine du trafic et nom de votre campagne |
domain | string | Un domaine vérifié de l’espace de travail, ou le domaine LanaChat |
public_url | string | https://<domain>/r/<slug> : URL à mettre dans une bio ou une pub |
destination | string | pool ou account |
account_id | string ou null | Le compte fixe quand destination est account |
utm | object | source, medium, campaign |
pixels | object | Pixels connectés déclenchés par ce lien |
counters | object | clicks, conversations, first_messages, buyers, revenue_stars |
archived | boolean | Les liens archivés sont exclus des stats |
created_at | string | ISO 8601, UTC |
destinationestpool(le compte est choisi au clic parmi le pool de la créatrice, voir pools) ouaccount(toujours le mêmeaccount_id).slug: lettres minuscules, chiffres et tirets, 1 à 48 caractères, commence et finit par une lettre ou un chiffre, unique parmi les liens actifs du même domaine.domaindoit être un domaine vérifié de l’espace de travail ; sinon le domaine LanaChat est utilisé.- Valeurs
utm: jusqu’à 80 lettres, chiffres, points, tirets ou underscores. Elles sont ajoutées à chaque clic et transmises aux événements pixel.
L’objet domaine #
{
"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 sous-domaine en minuscules (au moins 3 labels), unique dans l’espace de travail |
builtin | boolean | true pour le domaine LanaChat, qui ne peut jamais être supprimé |
status | string | verified, pending ou error |
error | string ou null | Phrase claire quand status est error |
ssl | string | none, issuing ou active |
is_default | boolean | Exactement un domaine vérifié est le domaine par défaut |
label | string ou null | Un nom pour votre équipe, jusqu’à 60 caractères |
token | string | Valeur de l’enregistrement TXT de vérification |
checks | number | Nombre de vérifications DNS effectuées |
added_at, verified_at, last_check_at | string ou null | ISO 8601, UTC |
L’objet connexion 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 | Le pixel est connecté |
pixel_id | string | Meta : 15 ou 16 chiffres. TikTok : 20 lettres majuscules ou chiffres. Snap : un UUID |
token_last4 | string | Les 4 derniers caractères du token d’accès, jamais le token complet |
token_status | string | valid, expired ou invalid |
token_error | string ou null | Phrase claire, par exemple « Access token expired on 3 Oct. Replace it to resume delivery. » |
test_event_code | string ou null | Code test du gestionnaire d’événements de la plateforme |
connected_at | string | ISO 8601, UTC |
L’objet événement #
{
"id": "evt_purchase",
"name": "Purchase",
"builtin": true,
"trigger": { "type": "purchase" },
"networks": { "meta": true, "tiktok": true, "snap": false }
}
| Field | Type | Description |
|---|---|---|
id | string | Identifiant de l’événement |
name | string | Nom intégré, ou votre nom personnalisé : une lettre, puis jusqu’à 39 lettres, chiffres ou underscores, unique dans l’espace de travail |
builtin | boolean | true pour Lead, Contact, Purchase, Subscribe et InitiateCheckout |
trigger | object | type, et une value pour les triggers qui en ont besoin |
networks | object | Activé ou désactivé pour meta, tiktok et snap |
L’objet stats #
{
"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 | Une ligne par jour UTC de la période |
links | array | Une ligne par lien, sur toute la période |
sources | array | Une ligne par groupe de source : instagram, tiktok, snapchat, meta, x et other |
clicks | number | Redirections servies |
conversations | number | Conversations Telegram démarrées via le lien |
first_messages | number | Fans ayant écrit au moins une fois |
buyers | number | Fans distincts avec un achat Stars vérifié dans la période |
revenue_stars | number | Achats Stars vérifiés de ces fans dans la période |
Liens #
Lister les liens #
GET /links · can_tracking ou can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Non | Liens de cette seule créatrice |
archived | boolean | Non | false (vue par défaut) masque les liens archivés |
limit, cursor | number, string | Non | Pagination |
curl "https://api.lanachat.ai/v1/links?creator_id=cr_lea&archived=false" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse est une liste paginée d’objets lien, chacun avec ses counters.
Créer un lien #
POST /links · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Oui | Le nom visible par votre équipe |
slug | string | Oui | Lettres minuscules, chiffres et tirets, 1 à 48 caractères |
creator_id | string | Oui | La créatrice vers laquelle le lien redirige |
source | string | Non | instagram, tiktok, snapchat, meta, x ou autre source |
campaign | string | Non | Nom de votre campagne |
destination | string | Non | pool ou account |
account_id | string | Quand destination est account | Le compte Telegram fixe |
domain | string | Non | Domaine vérifié ; sinon domaine LanaChat |
utm | object | Non | source, medium, campaign |
pixels | object | Non | meta, tiktok, snap : true pour activer ce 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"
}
- Un slug déjà utilisé répond
409avecThe slug /lea-bio is already used by "Insta bio · Mia". - Un domaine non vérifié répond
400("Pick a verified domain…").
Obtenir un lien #
GET /links/{id} · can_tracking ou can_sales_read
curl https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse est l’objet lien. Un id inconnu répond 404.
Remplacer un lien #
PUT /links/{id} · can_tracking
Même corps que Créer un lien ; PUT remplace tout le lien, envoyez donc tous les champs à conserver.
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 réponse est le lien mis à jour. Mêmes erreurs qu’à la création.
Archiver ou supprimer un lien #
DELETE /links/{id} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
permanent | number | Non | 1 supprime définitivement au lieu d’archiver |
curl -X DELETE https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Un lien archivé est exclu des statistiques.
Domaines #
Pour utiliser votre propre domaine, ajoutez-le, créez deux enregistrements DNS, puis vérifiez-le :
CNAME go.mia-links.com → links.lanachat.appTXT _lanachat.go.mia-links.com = lanachat-verify=8be03d5f19a2
Les domaines en attente sont aussi vérifiés toutes les 10 minutes pendant 72 heures, puis quotidiennement. Le status devient verified et le ssl passe de issuing à active.
Lister les domaines #
GET /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | Non | active (vérifié) ou inactive (en attente ou erreur) |
q | string | Non | Partie du host ou du label |
curl "https://api.lanachat.ai/v1/domains?status=active" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse liste des objets domaine, domaine LanaChat inclus (builtin: true).
Ajouter un domaine #
POST /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
host | string | Oui | Un sous-domaine, par exemple 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 réponse est le nouveau domaine avec status: "pending" et son token pour l’enregistrement TXT. Le host est nettoyé (minuscules, pas de https://, pas de chemin). Les domaines racines, *.lanachat.app et un domaine déjà ajouté répondent 400 avec un message.
Vérifier un domaine #
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" }
Quand un enregistrement est incorrect, status est error et error indique lequel, par exemple « The CNAME record points to another service. » Le domaine LanaChat ne peut pas être vérifié (son DNS est géré par LanaChat).
Modifier un domaine #
PATCH /domains/{host} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
is_default | boolean | Non | true pour en faire le domaine par défaut ; l’ancien domaine par défaut cesse de l’être |
label | string ou null | Non | Un nom pour votre équipe, jusqu’à 60 caractères |
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}'
Seul un domaine vérifié peut être le domaine par défaut. Le domaine LanaChat refuse un label (403).
Supprimer un domaine #
DELETE /domains/{host} · can_tracking
curl -X DELETE https://api.lanachat.ai/v1/domains/go.mia-links.com \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Supprimer le domaine LanaChat, le domaine par défaut ("Set another default domain first") ou un domaine utilisé par des liens actifs ("Used by N active links across all creators") répond 409.
Pixels #
Les événements sont envoyés serveur à serveur, dédupliqués avec le pixel navigateur via le même event_id, avec l’id Telegram du fan haché (SHA-256), jamais en clair. Sans consentement aucun événement n’est envoyé, jamais. Un pixel ne se déclenche que pour les liens qui l’activent.
Lire les connexions pixel #
GET /pixels · can_tracking
curl https://api.lanachat.ai/v1/pixels \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse contient un objet connexion pixel pour chacun de meta, tiktok et snap, et le mode de consentement.
Connecter un pixel #
PUT /pixels/{provider} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | Oui | Meta : 15 ou 16 chiffres. TikTok : 20 lettres majuscules ou chiffres. Snap : un UUID |
access_token | string | Oui | Token Conversions API de la plateforme |
test_event_code | string | Non | Code test de la plateforme |
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" }
Le token d’accès est stocké chiffré et jamais renvoyé : seul token_last4 est visible. Un pixel mal formaté ou un token vide répond 400.
Déconnecter un pixel #
DELETE /pixels/{provider} · owner
curl -X DELETE https://api.lanachat.ai/v1/pixels/meta \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Envoyer un événement 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 et body sont la réponse directe de la plateforme, vous voyez donc exactement ce que Meta, TikTok ou Snap ont répondu.
Configurer le mode consentement #
PUT /pixels/consent · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | Oui | page : écran de consentement pour chaque fan avant ouverture de Telegram. implicit_by_country : écran seulement dans l’UE, l’EEE, le Royaume-Uni et la Suisse |
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"}'
Événements #
Événements intégrés : Lead (conversation démarrée via un lien), Contact (premier message fan), Purchase (vente vérifiée), Subscribe, InitiateCheckout. Les événements personnalisés ont un trigger : sale_over (vente au-dessus d’un montant en dollars US), tag_added (un tag), nth_message (le Nième message fan, 2 ou plus) ou offer_viewed.
Lister les événements #
GET /events · can_tracking
curl https://api.lanachat.ai/v1/events \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse liste des objets événement avec leurs livraisons acceptées et échouées sur 7 jours, par réseau.
Créer un événement personnalisé #
POST /events · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Oui | Une lettre, puis jusqu’à 39 lettres, chiffres ou underscores ; unique dans l’espace de travail |
trigger | object | Oui | type : sale_over, tag_added, nth_message ou offer_viewed ; value pour les trois premiers |
networks | object | Non | meta, tiktok, snap : true pour l’envoyer 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 réponse est le nouvel événement (201). Un nom déjà utilisé répond 409.
Activer ou désactiver un événement #
PATCH /events/{id} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
networks | object | Oui | 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}}'
Supprimer un événement personnalisé #
DELETE /events/{id} · owner
curl -X DELETE https://api.lanachat.ai/v1/events/evt_bigspender \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Les événements intégrés ne peuvent pas être supprimés ; désactivez-les plutôt.
Statistiques #
Lire les stats #
GET /stats · can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Oui | Premier jour UTC, YYYY-MM-DD, inclus |
to | string | Oui | Dernier jour UTC, YYYY-MM-DD, inclus |
creator_id | string | Non | Cette seule créatrice ; sinon toutes |
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 réponse est l’objet stats. Les jours sont en UTC ; les liens archivés sont exclus.
Exporter les stats en CSV #
GET /stats/export.csv · can_sales_read
Mêmes paramètres 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