LanaChat

API: linki śledzące, domeny, piksele i statystyki

9 min czytaniaZaktualizowano Markdown

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 #

MethodPathDescriptionPermissionStatus
GET/linksLista linków (creator_id=, archived=false) z licznikamican_tracking lub can_sales_readPlanned
POST/linksUtwórz linkcan_trackingPlanned
GET/links/{id}Jeden linkcan_tracking lub can_sales_readPlanned
PUT/links/{id}Zastąp link (name, slug, domain, destination, UTM, pixels)can_trackingPlanned
DELETE/links/{id}Archiwizuj link (permanent=1 usuwa go na stałe)can_trackingPlanned
GET/domainsTwoje domeny (status=active,inactive, q=)can_trackingPlanned
POST/domainsDodaj domenę (status pending)can_trackingPlanned
POST/domains/{host}/verifySprawdź teraz rekordy DNScan_trackingPlanned
PATCH/domains/{host}Ustaw zweryfikowaną domenę jako domyślną lub zmień jej labelcan_trackingPlanned
DELETE/domains/{host}Usuń domenę, której nie używa żaden aktywny linkcan_trackingPlanned
GET/pixelsPołączenia Meta, TikTok i Snap oraz tryb zgodycan_trackingPlanned
PUT/pixels/{provider}Połącz lub podmień pixel (meta, tiktok, snap)ownerPlanned
DELETE/pixels/{provider}Odłącz pixelownerPlanned
POST/pixels/{provider}/testWyślij testowe zdarzenie i zwróć odpowiedź platformycan_trackingPlanned
PUT/pixels/consentTryb zgody: page lub implicit_by_countryownerPlanned
GET/eventsWbudowane i własne zdarzenia, z liczbą dostarczeń z 7 dnican_trackingPlanned
POST/eventsUtwórz własne zdarzenieownerPlanned
PATCH/events/{id}Włącz lub wyłącz zdarzenie na siećownerPlanned
DELETE/events/{id}Usuń własne zdarzenieownerPlanned
GET/statsDzienne sumy, per link i per źródło (from=, to=, creator_id=)can_sales_readPlanned
GET/stats/export.csvTe same liczby w CSVcan_sales_readPlanned
{
  "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"
}
FieldTypeDescription
idstringZaczyna się od lnk_
namestringNazwa widoczna dla zespołu
slugstringKońcówka publicznego URL
creator_idstringTwórczyni, do której prowadzi link
source, campaignstringSkąd pochodzi ruch i nazwa kampanii
domainstringZweryfikowana domena workspace lub domena LanaChat
public_urlstringhttps://<domain>/r/<slug>: URL do bio lub reklamy
destinationstringpool lub account
account_idstring lub nullStałe konto, gdy destination to account
utmobjectsource, medium, campaign
pixelsobjectKtóre podpięte piksele uruchamiają się na tym linku
countersobjectclicks, conversations, first_messages, buyers, revenue_stars
archivedbooleanZarchiwizowane linki nie są liczone w statystykach
created_atstringISO 8601, UTC
  • destination to pool (konto wybierane przy kliknięciu spośród puli twórczyni, patrz pools) lub account (zawsze to samo account_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.
  • domain musi 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
}
FieldTypeDescription
hoststringSubdomena małymi literami (min. 3 człony), unikalna w workspace
builtinbooleantrue dla domeny LanaChat, której nie można usunąć
statusstringverified, pending lub error
errorstring lub nullZwykłe zdanie, gdy status to error
sslstringnone, issuing lub active
is_defaultbooleanDokładnie jedna zweryfikowana domena jest domyślna
labelstring lub nullNazwa dla zespołu, do 60 znaków
tokenstringWartość rekordu TXT do weryfikacji
checksnumberLiczba dotychczasowych sprawdzeń DNS
added_at, verified_at, last_check_atstring lub nullISO 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" }
FieldTypeDescription
connectedbooleanPixel jest połączony
pixel_idstringMeta: 15 lub 16 cyfr. TikTok: 20 wielkich liter lub cyfr. Snap: UUID
token_last4stringOstatnie 4 znaki tokena dostępowego, nigdy cały token
token_statusstringvalid, expired lub invalid
token_errorstring lub nullZwykłe zdanie, np. "Access token expired on 3 Oct. Replace it to resume delivery."
test_event_codestring lub nullKod testowy z menedżera zdarzeń platformy
connected_atstringISO 8601, UTC

The event object #

{
  "id": "evt_purchase",
  "name": "Purchase",
  "builtin": true,
  "trigger": { "type": "purchase" },
  "networks": { "meta": true, "tiktok": true, "snap": false }
}
FieldTypeDescription
idstringIdentyfikator zdarzenia
namestringWbudowana nazwa lub własna: litera, potem do 39 liter, cyfr lub podkreśleń, unikalna w workspace
builtinbooleantrue dla Lead, Contact, Purchase, Subscribe i InitiateCheckout
triggerobjecttype i value dla tych triggerów, które tego wymagają
networksobjectWłą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 } ]
}
FieldTypeDescription
daysarrayJeden wiersz na każdy dzień UTC z okresu
linksarrayJeden wiersz na każdy link, za cały okres
sourcesarrayJeden wiersz na każdą grupę źródeł: instagram, tiktok, snapchat, meta, x i other
clicksnumberObsłużone przekierowania
conversationsnumberRozpoczęte rozmowy na Telegramie z linku
first_messagesnumberFani, którzy napisali choć raz
buyersnumberUnikalni fani z potwierdzonym zakupem Stars w okresie
revenue_starsnumberPotwierdzone zakupy Stars tych fanów w okresie

GET /links · can_tracking lub can_sales_read

ParameterTypeRequiredDescription
creator_idstringNieTylko linki tej twórczyni
archivedbooleanNiefalse (domyślnie) ukrywa zarchiwizowane linki
limit, cursornumber, stringNiePaginacja
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.

POST /links · can_tracking

ParameterTypeRequiredDescription
namestringTakNazwa widoczna dla zespołu
slugstringTakMałe litery, cyfry i myślniki, 1-48 znaków
creator_idstringTakTwórczyni, do której prowadzi link
sourcestringNieinstagram, tiktok, snapchat, meta, x lub inne źródło
campaignstringNieNazwa kampanii
destinationstringNiepool lub account
account_idstringGdy destination to accountStałe konto Telegram
domainstringNieZweryfikowana domena; bez niej domena LanaChat
utmobjectNiesource, medium, campaign
pixelsobjectNiemeta, 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 409 z The slug /lea-bio is already used by "Insta bio · Mia".
  • Jeśli domena nie jest zweryfikowana, odpowiedź to 400 ("Pick a verified domain…").

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.

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.

DELETE /links/{id} · can_tracking

ParameterTypeRequiredDescription
permanentnumberNie1 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.app
  • TXT _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

ParameterTypeRequiredDescription
statusstringNieactive (zweryfikowane) lub inactive (pending lub error)
qstringNieFragment 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

ParameterTypeRequiredDescription
hoststringTakSubdomena, 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

ParameterTypeRequiredDescription
is_defaultbooleanNietrue ustawia jako domyślną; poprzednia przestaje być domyślna
labelstring lub nullNieNazwa 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

ParameterTypeRequiredDescription
pixel_idstringTakMeta: 15 lub 16 cyfr. TikTok: 20 wielkich liter lub cyfr. Snap: UUID
access_tokenstringTakToken Conversions API danej platformy
test_event_codestringNieKod 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.

PUT /pixels/consent · owner

ParameterTypeRequiredDescription
modestringTakpage: 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

ParameterTypeRequiredDescription
namestringTakLitera, potem do 39 liter, cyfr lub podkreśleń; unikalna w workspace
triggerobjectTaktype: sale_over, tag_added, nth_message lub offer_viewed; value dla trzech pierwszych
networksobjectNiemeta, 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

ParameterTypeRequiredDescription
networksobjectTakmeta, 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

ParameterTypeRequiredDescription
fromstringTakPierwszy dzień UTC, YYYY-MM-DD, włącznie
tostringTakOstatni dzień UTC, YYYY-MM-DD, włącznie
creator_idstringNieTylko 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

Najnowsze wieści o Lanie na Telegramie

Nowości i zaproszenia do bety, najpierw na kanale.