API publik dhe webhooks
REST API i mundëson CRM-së tuaj, backend-it të faqes ose botit tuaj të punojë me lead-et dhe bisedat e cenaly.com njësoj si paneli: të lexojë kartat, të ndryshojë vetitë, të dërgojë ngjarje, të përgjigjet në biseda. Webhooks, përkundrazi, njoftojnë vetë serverin tuaj për lead-e të reja, ngjarje dhe mesazhe.
Çfarë nevojitet për të nisur#
| Çfarë | Ku |
|---|---|
| Roli | pronari i llogarisë — çelësi vepron në emrin e tij; punonjësit nuk i shohin çelësat |
| Seksioni | chat i aktivizuar (lead-et dhe bisedat jetojnë aty) |
| Çelësi | Integrimet → API dhe webhooks → Çelësat → Krijo çelës |
| Adresa e API-së | https://api.cenaly.com/public-api/v1 |
| Referenca e metodave | api.cenaly.com/public-api/v1/docs |
| OpenAPI 3.1 | api.cenaly.com/public-api/v1/openapi.json |
Hapi 1. Çelësi dhe të drejtat#
- Hapni Integrimet dhe klikoni API dhe webhooks në krye të faqes.
- Në skedën Çelësat klikoni Krijo çelës, shkruani një emër ("CRM", "Backend i faqes", "Bot Telegram").
- Zgjidhni një grup të drejtash ose shënoni të drejtat një nga një, me disa njësi — për cilat njësi lejohet çelësi, dhe afatin.
- Kopjoni sekretin
cnk_…. Ai shfaqet vetëm një herë: tek ne ruhet vetëm gjurma e tij (SHA-256).
| E drejta | Çfarë jep |
|---|---|
contacts:read |
lista, kërkimi dhe karta e lead-it, vetitë |
contacts:write |
ndryshimi i vetive dhe etiketave, bashkimi, fshirja me kërkesë të subjektit |
events:read |
fluksi i ngjarjeve të lead-it |
events:write |
dërgimi i ngjarjeve (blerje, regjistrim, çdo ngjarje e juaja) |
conversations:read |
bisedat dhe mesazhet |
conversations:write |
përgjigja e operatorit, shënimi, statusi, përgjegjësi, etiketat |
messages:send |
mesazh lead-it në bisedën e tij të fundit |
segments:read |
segmentet e ruajtura dhe pjesëmarrësit e tyre |
Grupet: CRM / backend (lead-e, veti, ngjarje, lexim bisedash dhe segmentesh), Boti juaj (lexon lead-e, përgjigjet në biseda, u shkruan lead-eve), Vetëm lexim, Të gjitha.
- Të drejtat ndryshojnë të drejtat dhe njësitë e çelësit në çast — integrimi vazhdon të punojë.
- Rigjenero jep një sekret të ri; i vjetri ndalon së punuari menjëherë, të drejtat dhe regjistri mbeten.
- Anulo — menjëherë dhe përgjithmonë, kërkesa e radhës merr
401.
Çelësi dërgohet me header-in Authorization: Bearer cnk_… (ose X-Api-Key: cnk_…). Ruajeni vetëm në server — jo në shfletues dhe jo në aplikacionin mobil.
Hapi 2. Kërkesat e para#
KEY=cnk_ваш_ключ
API=https://api.cenaly.com/public-api/v1
# что умеет ключ: права, точки, лимит
curl -H "Authorization: Bearer $KEY" "$API/me"
# лиды, свежие сверху (20 на страницу)
curl -H "Authorization: Bearer $KEY" "$API/contacts?limit=20"
# поиск по имени, почте или телефону
curl -H "Authorization: Bearer $KEY" "$API/contacts?q=anna"
Përgjigja është gjithmonë një zarf:
{
"meta": { "status": 200, "requestId": "…", "nextCursor": "WyIyMDI2LTEwLTA0…" },
"data": { "total": 128, "contacts": [ { "id": "…", "status": "lead", "name": "Анна", "updatedAt": "2026-10-04T09:12:00Z" } ] }
}
Faqja tjetër — e njëjta kërkesë me cursor=<meta.nextCursor>; pa nextCursor — nuk ka më faqe. Gabim — {"meta": {...}, "error": {"code": "…"}}.
Njësia. Nëse çelësi ka akses vetëm në një njësi, nuk është e nevojshme ta tregoni. Nëse ka disa — shtoni location=<id e njësisë> (lista — GET /v1/locations), përndryshe përgjigja 400 location_required.
Vetitë dhe ngjarjet sipas user_id tuaj. Nuk është e detyrueshme të ruani id-në tonë të lead-it: shtoni ?by=user_id, dhe adresa do të bëhet identifikuesi juaj i përdoruesit. Nëse lead-i me atë user_id nuk ekziston ende — ne do ta krijojmë.
# свойства: операции update_or_create, set_once, add, delete, append, union, exclude
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"ops":[{"op":"update_or_create","key":"$email","value":"anna@example.com"},
{"op":"add","key":"orders","value":1},
{"op":"union","key":"interests","value":"yoga"}]}' \
"$API/contacts/u-1001/props?by=user_id"
# события пачкой (до 100), повтор с тем же id засчитывается один раз
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"events":[{"id":"ord-5531","userId":"u-1001","name":"order_paid","props":{"sum":45,"currency":"GEL"}}]}' \
"$API/events"
# ответ в диалоге и смена статуса
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"text":"Здравствуйте! Заказ передан курьеру."}' "$API/conversations/<id>/reply"
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"status":"resolved"}' "$API/conversations/<id>/status"
Shkrimi kalon nëpër të njëjtën radhë si ndryshimet nga paneli: ndryshimet zbatohen brenda sekondave, dhe përgjigja për shkrimin sipas user_id — 202 me pending. Në kartën e lead-it autori i ndryshimit shfaqet si "API: <emri i çelësit>".
Metodat#
| Metoda | Çfarë bën | E drejta |
|---|---|---|
GET /v1/me, GET /v1/locations |
çelësi, të drejtat, njësitë | — |
GET /v1/contacts |
lead-et: status (anon, lead, user), q, limit, cursor |
contacts:read |
GET /v1/contacts/{id} |
karta: vetitë, etiketat, përmbledhja e ngjarjeve | contacts:read |
POST /v1/contacts/{id}/props |
vetitë me operacione (deri në 250) ose {"props":{…}} |
contacts:write |
POST / DELETE /v1/contacts/{id}/tags |
etiketat e lead-it | contacts:write |
POST /v1/contacts/merge |
bashkimi i dy kartave: pamje paraprake, pastaj "apply": true |
contacts:write |
POST /v1/contacts/{id}/erase |
fshirje me kërkesë të subjektit ("confirm": true) |
contacts:write |
GET /v1/contacts/{id}/events |
rrjedha e ngjarjeve të lead-it | events:read |
POST /v1/contacts/{id}/events, POST /v1/events |
ngjarjet (deri në 100 njëherësh) | events:write |
GET /v1/contacts/{id}/conversations |
bisedat e lead-it | conversations:read |
POST /v1/contacts/{id}/messages |
shkruajini lead-it në bisedën e tij të fundit | messages:send |
GET /v1/conversations, /{id}, /{id}/messages |
bisedat dhe mesazhet | conversations:read |
POST /v1/conversations/{id}/reply |
përgjigje e operatorit ose shënim ("type": "note") |
conversations:write |
POST /v1/conversations/{id}/status, /assign, /tags |
statusi, përgjegjësi, etiketat | conversations:write |
GET /v1/segments, GET /v1/segments/{id}/contacts |
segmentet dhe pjesëmarrësit e tyre | segments:read |
Fushat, shembujt dhe kodet e gabimeve të secilës metodë — në udhëzuesin.
Hapi 3. Webhook-et#
Webhook-et konfigurohen te njësia: Chat → Cilësimet → Webhook-et — adresa https, ngjarjet dhe sekreti i nënshkrimit. Ngjarjeve të bisedës (bisedë e re, mesazh i ri, status, vlerësim, etiketa) iu shtuan ngjarjet e lead-it:
| Ngjarja | Kur vjen |
|---|---|
lead.created |
u shfaq një lead i ri (kontakti u la në chat, formular ose u krijua përmes API) |
lead.props_changed |
vetitë e lead-it ndryshuan — lista e çelësave në changedProps |
lead.event_tracked |
lead-i ka një ngjarje; si parazgjedhje të gjitha ngjarjet tuaja pa ato sistemore ($…), lista e emrave caktohet nga fusha «Cilat ngjarje të dërgohen» |
message.goal_reached |
lead-i arriti qëllimin e mesazhit (pop-up, dërgesë) |
{
"event": "lead.event_tracked",
"deliveryId": "WD…",
"at": "2026-10-04T09:12:03Z",
"webhookId": "…",
"locationId": "…",
"contact": { "id": "…", "status": "user", "userId": "u-1001", "props": { "orders": 3 }, "tags": ["vip"] },
"leadEvent": { "name": "order_paid", "at": "2026-10-04T09:12:00Z", "props": { "sum": 45 } }
}
Emri, email-i dhe telefoni i lead-it përfshihen në trup vetëm nëse te webhook-u është aktivizuar kutia «Përcillni kontaktet e vizitorit». Verifikimi i nënshkrimit — HMAC-SHA256 i trupit me sekretin e webhook-ut:
# заголовок X-Meni-Signature: sha256=<hex>
echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
Përgjigjuni 2xx brenda 5 sekondave — përndryshe dërgimi përsëritet; pas një serie të gjatë dështimesh webhook-u çaktivizohet dhe kjo shihet në cilësimet. Dublikatat i ndani me deliveryId.
Kufizimet#
- 60 kërkesa në minutë për çelës; mbi këtë —
429me kokënRetry-After. Mbetja — nëX-RateLimit-*. - Deri në 200 regjistrime për faqe (si parazgjedhje 50), deri në 100 ngjarje në grup, deri në 250 operacione me vetitë për kërkesë, deri në 30 etiketa njëherësh.
- Deri në 20 çelësa aktivë për llogari.
- Regjistri i thirrjeve të çelësit ruhet 30 ditë: koha, metoda, modeli i shtegut (pa id dhe trup), kodi i përgjigjes, kohëzgjatja.
- Ngjarjet e dërguara përmes API vendosen në kartën e lead-it (rrjedha, përmbledhja, segmentet), por jo në regjistrin e papërpunuar të analitikës së vizitave.
- Lead-it mund t'i shkruani vetëm në një bisedë ekzistuese: pa bisedë — përgjigja
409 no_conversation.
Zgjidhja e problemeve#
| Përgjigja | Çfarë do të thotë | Çfarë të bëni |
|---|---|---|
401 api_key_missing / api_key_invalid |
çelësi mungon në kërkesë, ose është i gabuar, i revokuar ose i skaduar | kontrolloni kokën; nëse duhet, riemërtoni çelësin |
403 scope_required |
çelësi nuk ka të drejtën e nevojshme | Të drejtat te çelësi — shtoni të drejtën |
400 location_required |
çelësi ka akses në disa njësi | shtoni location=<id> |
404 location_not_found |
njësia nuk është ndër njësitë e çelësit | krahasojeni me GET /v1/locations |
404 not_found |
lead-i ose biseda nuk ekziston | për id-të tuaja përdorni ?by=user_id |
429 rate_limited |
më shumë se 60 kërkesa në minutë | prisni Retry-After sekonda, gruponi ngjarjet në grupe |
502 upstream_error |
defekt i përkohshëm | përsëriteni kërkesën më vonë |
Çdo kërkesë shihet në skedën Regjistri i thirrjeve — me kodin e përgjigjes dhe emrin e çelësit.
Pyetje të shpeshta#
A mund të thirret API nga shfletuesi? Jo: çelësi jep akses në të gjithë lead-et e njësisë. Thirreni API nga serveri juaj.
Si ndryshon user_id nga id i lead-it? id i lead-it është identifikuesi ynë i kartës. user_id është identifikuesi juaj i përdoruesit (numri në CRM, id e llogarisë në sajt); me ?by=user_id karta mund të adresohet me të.
Çfarë ndodh kur dërgohet përsëri një ngjarje? Ngjarja me të njëjtin id llogaritet një herë — mund ta përsëritni me qetësi kërkesën në rast gabimi rrjeti.
A duhet një çelës i veçantë për çdo njësi? Jo: një çelës mund të punojë me disa njësi, njësia zgjidhet me parametrin location.
Seksione të lidhura#
- Chat me vizitorët — bisedat, lead-et dhe cilësimet e webhook-ve
- Kërkesat — rrjedha e unifikuar hyrëse
- API dhe MCP i centralit tuaj telefonik — API i veçantë i telefonisë
- Integrimet