API: Tracking-Links, Domains, Pixel und Statistiken
Ein Tracking-Link leitet einen Besucher zu einer Creatorin auf Telegram weiter und zählt, was danach passiert: Klicks, Konversationen, erste Nachrichten, Käuferinnen und Umsatz. Links können auf Ihrer eigenen Domain liegen, Werbe-Pixel (Meta, TikTok, Snap) auslösen und Server-Events senden. Diese Endpunkte entsprechen der Tracking-Seite.
Endpunkte #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /links | List links (creator_id=, archived=false) with their counters | can_tracking or can_sales_read | Planned |
| POST | /links | Create a link | can_tracking | Planned |
| GET | /links/{id} | One link | can_tracking or can_sales_read | Planned |
| PUT | /links/{id} | Replace a link (name, slug, domain, destination, UTM, pixels) | can_tracking | Planned |
| DELETE | /links/{id} | Archive a link (permanent=1 deletes it) | can_tracking | Planned |
| GET | /domains | Your domains (status=active,inactive, q=) | can_tracking | Planned |
| POST | /domains | Add a domain (status pending) | can_tracking | Planned |
| POST | /domains/{host}/verify | Check its DNS records now | can_tracking | Planned |
| PATCH | /domains/{host} | Make a verified domain the default, or change its label | can_tracking | Planned |
| DELETE | /domains/{host} | Remove a domain no active link uses | can_tracking | Planned |
| GET | /pixels | The Meta, TikTok and Snap connections and the consent mode | can_tracking | Planned |
| PUT | /pixels/{provider} | Connect or replace a pixel (meta, tiktok, snap) | owner | Planned |
| DELETE | /pixels/{provider} | Disconnect a pixel | owner | Planned |
| POST | /pixels/{provider}/test | Send a test event and return the platform's answer | can_tracking | Planned |
| PUT | /pixels/consent | Consent mode: page or implicit_by_country | owner | Planned |
| GET | /events | Built-in and custom events, with 7-day delivery counts | can_tracking | Planned |
| POST | /events | Create a custom event | owner | Planned |
| PATCH | /events/{id} | Turn an event on or off per network | owner | Planned |
| DELETE | /events/{id} | Delete a custom event | owner | Planned |
| GET | /stats | Daily totals, per link and per source (from=, to=, creator_id=) | can_sales_read | Planned |
| GET | /stats/export.csv | The same numbers as CSV | can_sales_read | Planned |
The link object #
{
"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 | Beginnt mit lnk_ |
name | string | Der Name, den Ihr Team sieht |
slug | string | Das Ende der öffentlichen URL |
creator_id | string | Die Creatorin, zu der der Link führt |
source, campaign | string | Woher der Traffic kommt und der Name Ihrer Kampagne |
domain | string | Eine verifizierte Domain des Workspaces oder die LanaChat-Domain |
public_url | string | https://<domain>/r/<slug>: die URL, die Sie in Bio oder Anzeige setzen |
destination | string | pool oder account |
account_id | string oder null | Das feste Konto, wenn destination account ist |
utm | object | source, medium, campaign |
pixels | object | Welche verbundenen Pixel bei diesem Link feuern |
counters | object | clicks, conversations, first_messages, buyers, revenue_stars |
archived | boolean | Archivierte Links werden in Statistiken ausgelassen |
created_at | string | ISO 8601, UTC |
destinationistpool(das Konto wird beim Klick aus dem Pool der Creatorin gewählt, siehe pools) oderaccount(immer dasselbeaccount_id).slug: Kleinbuchstaben, Ziffern und Bindestriche, 1 bis 48 Zeichen, beginnt und endet mit Buchstabe oder Ziffer, eindeutig unter aktiven Links derselben Domain.domainmuss eine verifizierte Domain des Workspaces sein; ohne diese wird die LanaChat-Domain verwendet.utm-Werte: bis zu 80 Buchstaben, Ziffern, Punkte, Bindestriche oder Unterstriche. Sie werden bei jedem Klick gespeichert und an Pixel-Events weitergeleitet.
The domain object #
{
"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 | Ein Subdomainname in Kleinbuchstaben (mindestens 3 Labels), eindeutig im Workspace |
builtin | boolean | true für die LanaChat-Domain, die nie entfernt werden kann |
status | string | verified, pending oder error |
error | string oder null | Ein einfacher Satz, wenn status error ist |
ssl | string | none, issuing oder active |
is_default | boolean | Genau eine verifizierte Domain ist die Standarddomain |
label | string oder null | Ein Name für Ihr Team, bis zu 60 Zeichen |
token | string | Der Wert des TXT-Verifizierungs-Eintrags |
checks | number | Bisher durchgeführte DNS-Prüfungen |
added_at, verified_at, last_check_at | string oder null | ISO 8601, UTC |
The pixel connection object #
{ "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 | Das Pixel ist verbunden |
pixel_id | string | Meta: 15 oder 16 Ziffern. TikTok: 20 Großbuchstaben oder Ziffern. Snap: eine UUID |
token_last4 | string | Die letzten 4 Zeichen des Zugriffstokens, nie das Token selbst |
token_status | string | valid, expired oder invalid |
token_error | string oder null | Ein einfacher Satz, z. B. "Access token expired on 3 Oct. Replace it to resume delivery." |
test_event_code | string oder null | Der Testcode des Event-Managers der Plattform |
connected_at | string | ISO 8601, UTC |
The event object #
{
"id": "evt_purchase",
"name": "Purchase",
"builtin": true,
"trigger": { "type": "purchase" },
"networks": { "meta": true, "tiktok": true, "snap": false }
}
| Field | Type | Description |
|---|---|---|
id | string | Die Event-ID |
name | string | Eingebauter Name oder Ihr eigener Name: ein Buchstabe, dann bis zu 39 Buchstaben, Ziffern oder Unterstriche, eindeutig im Workspace |
builtin | boolean | true für Lead, Contact, Purchase, Subscribe und InitiateCheckout |
trigger | object | type und ein value für Trigger, die einen benötigen |
networks | object | An oder aus für meta, tiktok und snap |
The stats object #
{
"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 | Eine Zeile pro UTC-Tag des Zeitraums |
links | array | Eine Zeile pro Link über den gesamten Zeitraum |
sources | array | Eine Zeile pro Quellgruppe: instagram, tiktok, snapchat, meta, x und other |
clicks | number | Weiterleitungen |
conversations | number | Telegram-Konversationen, die über den Link gestartet wurden |
first_messages | number | Fans, die mindestens einmal geschrieben haben |
buyers | number | Unterschiedliche Fans mit verifizierten Stars-Käufen im Zeitraum |
revenue_stars | number | Verifizierte Stars-Käufe dieser Fans im Zeitraum |
Links #
List links #
GET /links · can_tracking or can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Nein | Nur Links dieser Creatorin |
archived | boolean | Nein | false (Standardansicht) blendet archivierte Links aus |
limit, cursor | number, string | Nein | Pagination |
curl "https://api.lanachat.ai/v1/links?creator_id=cr_lea&archived=false" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort ist eine paginierte Liste von link objects, jeweils mit ihren counters.
Create a link #
POST /links · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Ja | Der Name, den Ihr Team sieht |
slug | string | Ja | Kleinbuchstaben, Ziffern und Bindestriche, 1 bis 48 Zeichen |
creator_id | string | Ja | Die Creatorin, zu der der Link führt |
source | string | Nein | instagram, tiktok, snapchat, meta, x oder eine andere Quelle |
campaign | string | Nein | Ihr Kampagnenname |
destination | string | Nein | pool oder account |
account_id | string | Wenn destination account ist | Das feste Telegram-Konto |
domain | string | Nein | Eine verifizierte Domain; ohne diese die LanaChat-Domain |
utm | object | Nein | source, medium, campaign |
pixels | object | Nein | meta, tiktok, snap: true, um das Pixel auszulösen |
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"
}
- Ein bereits verwendeter Slug antwortet mit
409undThe slug /lea-bio is already used by "Insta bio · Mia". - Eine nicht verifizierte Domain antwortet mit
400("Pick a verified domain…").
Get a link #
GET /links/{id} · can_tracking or can_sales_read
curl https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort ist das link object. Eine unbekannte ID antwortet mit 404.
Replace a link #
PUT /links/{id} · can_tracking
Gleicher Body wie bei Create a link; PUT ersetzt den gesamten Link, senden Sie also alle Felder, die erhalten bleiben sollen.
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}}'
Die Antwort ist der aktualisierte Link. Dieselben Fehler wie bei der Erstellung.
Archive or delete a link #
DELETE /links/{id} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
permanent | number | Nein | 1 löscht den Link dauerhaft statt ihn zu archivieren |
curl -X DELETE https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Ein archivierter Link wird in Statistiken ausgelassen.
Domains #
Um Ihre eigene Domain zu nutzen, fügen Sie sie hinzu, erstellen zwei DNS-Einträge und verifizieren sie dann:
CNAME go.mia-links.com → links.lanachat.appTXT _lanachat.go.mia-links.com = lanachat-verify=8be03d5f19a2
Pending-Domains werden auch alle 10 Minuten für 72 Stunden geprüft, danach täglich. status wird zu verified und ssl wechselt von issuing zu active.
List domains #
GET /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | Nein | active (verifiziert) oder inactive (pending oder error) |
q | string | Nein | Teil des Hosts oder Labels |
curl "https://api.lanachat.ai/v1/domains?status=active" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort listet domain objects, inklusive der LanaChat-Domain (builtin: true).
Add a domain #
POST /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
host | string | Ja | Eine Subdomain, z. B. 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"}'
Die Antwort ist die neue Domain mit status: "pending" und ihrem token für den TXT-Eintrag. Der Host wird bereinigt (Kleinbuchstaben, kein https://, kein Pfad). Root-Domains, *.lanachat.app und bereits hinzugefügte Domains antworten mit 400 und einem Satz.
Verify a domain #
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" }
Wenn ein Eintrag falsch ist, ist status error und error sagt, welcher, z. B. "The CNAME record points to another service." Die LanaChat-Domain kann nicht verifiziert werden (DNS wird von LanaChat verwaltet).
Change a domain #
PATCH /domains/{host} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
is_default | boolean | Nein | true macht sie zur Standarddomain; die vorherige Standarddomain verliert diesen Status |
label | string oder null | Nein | Ein Name für Ihr Team, bis zu 60 Zeichen |
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}'
Nur eine verifizierte Domain kann Standard sein. Die LanaChat-Domain lehnt ein Label ab (403).
Remove a domain #
DELETE /domains/{host} · can_tracking
curl -X DELETE https://api.lanachat.ai/v1/domains/go.mia-links.com \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Das Entfernen der LanaChat-Domain, der Standarddomain ("Set another default domain first") oder einer Domain, die von aktiven Links genutzt wird ("Used by N active links across all creators"), antwortet mit 409.
Pixels #
Events werden serverseitig gesendet, dedupliziert mit dem Browser-Pixel über dieselbe event_id, mit der Telegram-ID der Fans gehasht (SHA-256), nie im Klartext. Ohne Zustimmung wird kein Event gesendet, niemals. Ein Pixel feuert nur für Links, die es aktiviert haben.
Read pixel connections #
GET /pixels · can_tracking
curl https://api.lanachat.ai/v1/pixels \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort enthält je einen pixel connection für meta, tiktok und snap sowie den Zustimmungs-mode.
Connect a pixel #
PUT /pixels/{provider} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | Ja | Meta: 15 oder 16 Ziffern. TikTok: 20 Großbuchstaben oder Ziffern. Snap: eine UUID |
access_token | string | Ja | Der Conversions-API-Token der Plattform |
test_event_code | string | Nein | Der Testcode der Plattform |
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" }
Der Zugriffstoken wird verschlüsselt gespeichert und nie zurückgegeben: nur token_last4. Ein Pixel-ID im falschen Format oder ein leerer Token antwortet mit 400.
Disconnect a pixel #
DELETE /pixels/{provider} · owner
curl -X DELETE https://api.lanachat.ai/v1/pixels/meta \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Send a test event #
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 und body sind die Antwort der Plattform, Sie sehen also genau, was Meta, TikTok oder Snap gesagt haben.
Set the consent mode #
PUT /pixels/consent · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | Ja | page: Ein Zustimmungsbildschirm für jede Fanin vor Telegram. implicit_by_country: Der Bildschirm nur in der EU, dem EWR, Großbritannien und der Schweiz |
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"}'
Events #
Eingebaute Events: Lead (Konversation gestartet über Link), Contact (erste Fan-Nachricht), Purchase (verifizierter Verkauf), Subscribe, InitiateCheckout. Eigene Events haben einen Trigger: sale_over (Verkauf über einem Betrag in US-Dollar), tag_added (ein Tag), nth_message (die N-te Fan-Nachricht, 2 oder mehr) oder offer_viewed.
List events #
GET /events · can_tracking
curl https://api.lanachat.ai/v1/events \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort listet event objects mit ihren akzeptierten und fehlgeschlagenen Zustellungen über 7 Tage, pro Netzwerk.
Create a custom event #
POST /events · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Ja | Ein Buchstabe, dann bis zu 39 Buchstaben, Ziffern oder Unterstriche; eindeutig im Workspace |
trigger | object | Ja | type: sale_over, tag_added, nth_message oder offer_viewed; value für die ersten drei |
networks | object | Nein | meta, tiktok, snap: true, um es dorthin zu senden |
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}}'
Die Antwort ist das neue Event (201). Ein bereits verwendeter Name antwortet mit 409.
Turn an event on or off #
PATCH /events/{id} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
networks | object | Ja | meta, tiktok, snap: true oder 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}}'
Delete a custom event #
DELETE /events/{id} · owner
curl -X DELETE https://api.lanachat.ai/v1/events/evt_bigspender \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Eingebaute Events können nicht gelöscht werden; schalten Sie sie stattdessen aus.
Stats #
Read stats #
GET /stats · can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Ja | Erster UTC-Tag, YYYY-MM-DD, inklusive |
to | string | Ja | Letzter UTC-Tag, YYYY-MM-DD, inklusive |
creator_id | string | Nein | Nur diese Creatorin; ohne alle Creatorinnen |
curl "https://api.lanachat.ai/v1/stats?from=2026-09-06&to=2026-10-05&creator_id=cr_lea" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Die Antwort ist das stats object. Tage sind UTC; archivierte Links werden ausgelassen.
Export stats as CSV #
GET /stats/export.csv · can_sales_read
Gleiche Parameter wie bei 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