API: linki śledzące, domeny, piksele i statystyki
Tracking link kieruje odwiedzającego do twórczyni na Telegramie i zlicza, co się dzieje dalej: kliknięcia, rozmowy, pierwsze wiadomości, kupujących i przychód. Linki mogą działać na Twojej własnej domain, uruchamiać pixels reklamowe (Meta, TikTok, Snap) i wysyłać serwerowe events. Te endpointy odpowiadają stronie Tracking.
Endpoints #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /links | Lista linków (creator_id=, archived=false) z licznikami | can_tracking lub can_sales_read | Planned |
| POST | /links | Utwórz link | can_tracking | Planned |
| GET | /links/{id} | Jeden link | can_tracking lub can_sales_read | Planned |
| PUT | /links/{id} | Zastąp link (name, slug, domain, destination, UTM, pixels) | can_tracking | Planned |
| DELETE | /links/{id} | Archiwizuj link (permanent=1 usuwa go na stałe) | can_tracking | Planned |
| GET | /domains | Twoje domeny (status=active,inactive, q=) | can_tracking | Planned |
| POST | /domains | Dodaj domenę (status pending) | can_tracking | Planned |
| POST | /domains/{host}/verify | Sprawdź teraz rekordy DNS | can_tracking | Planned |
| PATCH | /domains/{host} | Ustaw zweryfikowaną domenę jako domyślną lub zmień jej label | can_tracking | Planned |
| DELETE | /domains/{host} | Usuń domenę, której nie używa żaden aktywny link | can_tracking | Planned |
| GET | /pixels | Połączenia Meta, TikTok i Snap oraz tryb zgody | can_tracking | Planned |
| PUT | /pixels/{provider} | Połącz lub podmień pixel (meta, tiktok, snap) | owner | Planned |
| DELETE | /pixels/{provider} | Odłącz pixel | owner | Planned |
| POST | /pixels/{provider}/test | Wyślij testowe zdarzenie i zwróć odpowiedź platformy | can_tracking | Planned |
| PUT | /pixels/consent | Tryb zgody: page lub implicit_by_country | owner | Planned |
| GET | /events | Wbudowane i własne zdarzenia, z liczbą dostarczeń z 7 dni | can_tracking | Planned |
| POST | /events | Utwórz własne zdarzenie | owner | Planned |
| PATCH | /events/{id} | Włącz lub wyłącz zdarzenie na sieć | owner | Planned |
| DELETE | /events/{id} | Usuń własne zdarzenie | owner | Planned |
| GET | /stats | Dzienne sumy, per link i per źródło (from=, to=, creator_id=) | can_sales_read | Planned |
| GET | /stats/export.csv | Te same liczby w 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 | Zaczyna się od lnk_ |
name | string | Nazwa widoczna dla zespołu |
slug | string | Końcówka publicznego URL |
creator_id | string | Twórczyni, do której prowadzi link |
source, campaign | string | Skąd pochodzi ruch i nazwa kampanii |
domain | string | Zweryfikowana domena workspace lub domena LanaChat |
public_url | string | https://<domain>/r/<slug>: URL do bio lub reklamy |
destination | string | pool lub account |
account_id | string lub null | Stałe konto, gdy destination to account |
utm | object | source, medium, campaign |
pixels | object | Które podpięte piksele uruchamiają się na tym linku |
counters | object | clicks, conversations, first_messages, buyers, revenue_stars |
archived | boolean | Zarchiwizowane linki nie są liczone w statystykach |
created_at | string | ISO 8601, UTC |
destinationtopool(konto wybierane przy kliknięciu spośród puli twórczyni, patrz pools) lubaccount(zawsze to samoaccount_id).slug: małe litery, cyfry i myślniki, 1-48 znaków, zaczyna i kończy się literą lub cyfrą, unikalny wśród aktywnych linków tej samej domeny.domainmusi być zweryfikowaną domeną workspace; bez niej używana jest domena LanaChat.utm: do 80 znaków (litery, cyfry, kropki, myślniki lub podkreślenia). Dodawane do każdego kliknięcia i przekazywane do zdarzeń pixel.
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 | Subdomena małymi literami (min. 3 człony), unikalna w workspace |
builtin | boolean | true dla domeny LanaChat, której nie można usunąć |
status | string | verified, pending lub error |
error | string lub null | Zwykłe zdanie, gdy status to error |
ssl | string | none, issuing lub active |
is_default | boolean | Dokładnie jedna zweryfikowana domena jest domyślna |
label | string lub null | Nazwa dla zespołu, do 60 znaków |
token | string | Wartość rekordu TXT do weryfikacji |
checks | number | Liczba dotychczasowych sprawdzeń DNS |
added_at, verified_at, last_check_at | string lub 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 | Pixel jest połączony |
pixel_id | string | Meta: 15 lub 16 cyfr. TikTok: 20 wielkich liter lub cyfr. Snap: UUID |
token_last4 | string | Ostatnie 4 znaki tokena dostępowego, nigdy cały token |
token_status | string | valid, expired lub invalid |
token_error | string lub null | Zwykłe zdanie, np. "Access token expired on 3 Oct. Replace it to resume delivery." |
test_event_code | string lub null | Kod testowy z menedżera zdarzeń platformy |
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 | Identyfikator zdarzenia |
name | string | Wbudowana nazwa lub własna: litera, potem do 39 liter, cyfr lub podkreśleń, unikalna w workspace |
builtin | boolean | true dla Lead, Contact, Purchase, Subscribe i InitiateCheckout |
trigger | object | type i value dla tych triggerów, które tego wymagają |
networks | object | Włączone lub wyłączone dla meta, tiktok i 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 | Jeden wiersz na każdy dzień UTC z okresu |
links | array | Jeden wiersz na każdy link, za cały okres |
sources | array | Jeden wiersz na każdą grupę źródeł: instagram, tiktok, snapchat, meta, x i other |
clicks | number | Obsłużone przekierowania |
conversations | number | Rozpoczęte rozmowy na Telegramie z linku |
first_messages | number | Fani, którzy napisali choć raz |
buyers | number | Unikalni fani z potwierdzonym zakupem Stars w okresie |
revenue_stars | number | Potwierdzone zakupy Stars tych fanów w okresie |
Links #
List links #
GET /links · can_tracking lub can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_id | string | Nie | Tylko linki tej twórczyni |
archived | boolean | Nie | false (domyślnie) ukrywa zarchiwizowane linki |
limit, cursor | number, string | Nie | Paginacja |
curl "https://api.lanachat.ai/v1/links?creator_id=cr_lea&archived=false" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Odpowiedź to stronicowana lista link objects, każdy z własnymi counters.
Create a link #
POST /links · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Tak | Nazwa widoczna dla zespołu |
slug | string | Tak | Małe litery, cyfry i myślniki, 1-48 znaków |
creator_id | string | Tak | Twórczyni, do której prowadzi link |
source | string | Nie | instagram, tiktok, snapchat, meta, x lub inne źródło |
campaign | string | Nie | Nazwa kampanii |
destination | string | Nie | pool lub account |
account_id | string | Gdy destination to account | Stałe konto Telegram |
domain | string | Nie | Zweryfikowana domena; bez niej domena LanaChat |
utm | object | Nie | source, medium, campaign |
pixels | object | Nie | meta, tiktok, snap: true by uruchomić ten 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"
}
- Jeśli slug jest już zajęty, odpowiedź to
409zThe slug /lea-bio is already used by "Insta bio · Mia". - Jeśli domena nie jest zweryfikowana, odpowiedź to
400("Pick a verified domain…").
Get a link #
GET /links/{id} · can_tracking lub can_sales_read
curl https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Odpowiedź to link object. Nieznane id zwraca 404.
Replace a link #
PUT /links/{id} · can_tracking
Taki sam body jak w Create a link; PUT zastępuje cały link, więc podaj wszystkie pola, które chcesz zachować.
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}}'
Odpowiedź to zaktualizowany link. Te same błędy co przy tworzeniu.
Archive or delete a link #
DELETE /links/{id} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
permanent | number | Nie | 1 usuwa link na stałe zamiast archiwizować |
curl -X DELETE https://api.lanachat.ai/v1/links/lnk_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Zarchiwizowany link nie jest liczony w statystykach.
Domains #
Aby użyć własnej domeny, dodaj ją, utwórz dwa rekordy DNS, a potem zweryfikuj:
CNAME go.mia-links.com → links.lanachat.appTXT _lanachat.go.mia-links.com = lanachat-verify=8be03d5f19a2
Domeny w statusie pending są też sprawdzane co 10 minut przez 72 godziny, potem codziennie. status zmienia się na verified, a ssl na issuing, potem active.
List domains #
GET /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | Nie | active (zweryfikowane) lub inactive (pending lub error) |
q | string | Nie | Fragment hosta lub label |
curl "https://api.lanachat.ai/v1/domains?status=active" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Odpowiedź to lista domain objects, w tym domena LanaChat (builtin: true).
Add a domain #
POST /domains · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
host | string | Tak | Subdomena, np. 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"}'
Odpowiedź to nowa domena ze statusem status: "pending" i jej token do rekordu TXT. Host jest czyszczony (małe litery, bez https://, bez ścieżki). Root domeny, *.lanachat.app i już dodana domena zwracają 400 z komunikatem.
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" }
Gdy rekord jest błędny, status to error, a error opisuje problem, np. "The CNAME record points to another service." Domena LanaChat nie może być weryfikowana (jej DNS obsługuje LanaChat).
Change a domain #
PATCH /domains/{host} · can_tracking
| Parameter | Type | Required | Description |
|---|---|---|---|
is_default | boolean | Nie | true ustawia jako domyślną; poprzednia przestaje być domyślna |
label | string lub null | Nie | Nazwa dla zespołu, do 60 znaków |
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}'
Tylko zweryfikowana domena może być domyślna. Domena LanaChat odrzuca label (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"
Usunięcie domeny LanaChat, domyślnej domeny ("Set another default domain first") lub domeny używanej przez aktywne linki ("Used by N active links across all creators") zwraca 409.
Pixels #
Zdarzenia są wysyłane serwer-serwer, deduplikowane z przeglądarkowym pixelem przez ten sam event_id, z hashowanym (SHA-256) id Telegram fana (nigdy wprost). Bez zgody żadne zdarzenie nie jest wysyłane. Pixel uruchamia się tylko dla linków, które go mają włączone.
Read pixel connections #
GET /pixels · can_tracking
curl https://api.lanachat.ai/v1/pixels \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Odpowiedź zawiera po jednym pixel connection dla meta, tiktok i snap oraz tryb zgody mode.
Connect a pixel #
PUT /pixels/{provider} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | Tak | Meta: 15 lub 16 cyfr. TikTok: 20 wielkich liter lub cyfr. Snap: UUID |
access_token | string | Tak | Token Conversions API danej platformy |
test_event_code | string | Nie | Kod testowy platformy |
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" }
Token dostępu jest przechowywany zaszyfrowany i nigdy nie jest zwracany: tylko token_last4. Zły format pixel_id lub pusty token zwraca 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 i body to oryginalna odpowiedź platformy, więc widzisz dokładnie, co zwróciło Meta, TikTok lub Snap.
Set the consent mode #
PUT /pixels/consent · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | Tak | page: ekran zgody dla każdego fana przed otwarciem Telegrama. implicit_by_country: ekran tylko w UE i EOG, Wielkiej Brytanii i Szwajcarii |
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 #
Wbudowane zdarzenia: Lead (rozpoczęcie rozmowy z linku), Contact (pierwsza wiadomość fana), Purchase (potwierdzona sprzedaż), Subscribe, InitiateCheckout. Własne zdarzenia wymagają triggera: sale_over (sprzedaż powyżej kwoty w USD), tag_added (dodanie taga), nth_message (N-ta wiadomość fana, 2 lub więcej) lub offer_viewed.
List events #
GET /events · can_tracking
curl https://api.lanachat.ai/v1/events \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Odpowiedź to lista event objects z liczbą dostarczeń zaakceptowanych i odrzuconych z 7 dni, per sieć.
Create a custom event #
POST /events · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Tak | Litera, potem do 39 liter, cyfr lub podkreśleń; unikalna w workspace |
trigger | object | Tak | type: sale_over, tag_added, nth_message lub offer_viewed; value dla trzech pierwszych |
networks | object | Nie | meta, tiktok, snap: true by wysłać tam |
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}}'
Odpowiedź to nowe zdarzenie (201). Nazwa już użyta zwraca 409.
Turn an event on or off #
PATCH /events/{id} · owner
| Parameter | Type | Required | Description |
|---|---|---|---|
networks | object | Tak | meta, tiktok, snap: true lub 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"
Wbudowanych zdarzeń nie można usuwać; zamiast tego wyłącz je.
Stats #
Read stats #
GET /stats · can_sales_read
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Tak | Pierwszy dzień UTC, YYYY-MM-DD, włącznie |
to | string | Tak | Ostatni dzień UTC, YYYY-MM-DD, włącznie |
creator_id | string | Nie | Tylko ta twórczyni; bez tego wszyscy twórczynie |
curl "https://api.lanachat.ai/v1/stats?from=2026-09-06&to=2026-10-05&creator_id=cr_lea" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Odpowiedź to stats object. Dni są w UTC; zarchiwizowane linki są pomijane.
Export stats as CSV #
GET /stats/export.csv · can_sales_read
Te same parametry co 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