API public și webhook-uri
API-ul REST permite CRM-ului dumneavoastră, backend-ului site-ului sau propriului bot să lucreze cu lead-uri și conversații cenaly.com exact așa cum o face panoul: să citească fișe, să modifice proprietăți, să trimită evenimente, să răspundă în conversații. Webhook-urile, dimpotrivă, informează ele însele serverul dumneavoastră despre lead-uri, evenimente și mesaje noi.
Ce este necesar pentru lansare#
| Ce | Unde |
|---|---|
| Rol | proprietarul contului — cheia acționează în numele lui; angajații nu văd cheile |
| Secțiune | chat activat (lead-urile și conversațiile trăiesc în el) |
| Cheie | Integrări → API și webhook-uri → Chei → Creează cheie |
| Adresa API | https://api.cenaly.com/public-api/v1 |
| Referință pentru metode | api.cenaly.com/public-api/v1/docs |
| OpenAPI 3.1 | api.cenaly.com/public-api/v1/openapi.json |
Pasul 1. Cheia și drepturile#
- Deschideți Integrări și apăsați API și webhook-uri în antetul paginii.
- În fila Chei apăsați Creează cheie, introduceți un nume („CRM”, „Backend-ul site-ului”, „Bot Telegram”).
- Alegeți un set de drepturi sau bifați drepturile unul câte unul, iar dacă aveți mai multe puncte de lucru — la ce puncte de lucru are acces cheia, și termenul.
- Copiați secretul
cnk_…. El se afișează o singură dată: la noi se păstrează doar amprenta lui (SHA-256).
| Drept | Ce oferă |
|---|---|
contacts:read |
listă, căutare și fișa lead-ului, proprietăți |
contacts:write |
modificarea proprietăților și etichetelor, combinarea, ștergerea la cererea persoanei |
events:read |
fluxul de evenimente al lead-ului |
events:write |
trimiterea de evenimente (achiziție, înregistrare, orice eveniment propriu) |
conversations:read |
conversații și mesaje |
conversations:write |
răspunsul operatorului, notă, status, responsabil, marcaje |
messages:send |
mesaj către lead în ultima lui conversație |
segments:read |
segmentele salvate și participanții lor |
Seturi: CRM / backend (lead-uri, proprietăți, evenimente, citirea conversațiilor și segmentelor), Bot propriu (citește lead-uri, răspunde în conversații, scrie lead-urilor), Doar citire, Tot.
- Drepturi schimbă drepturile și punctele de lucru ale cheii din mers — integrarea continuă să funcționeze.
- Reemite eliberează un secret nou; cel vechi încetează să funcționeze imediat, drepturile și jurnalul rămân.
- Revocă — imediat și pentru totdeauna, următoarea cerere va primi
401.
Cheia se transmite prin antetul Authorization: Bearer cnk_… (sau X-Api-Key: cnk_…). Păstrați-o doar pe server — nu în browser și nu în aplicația mobilă.
Pasul 2. Primele cereri#
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"
Răspunsul este întotdeauna un plic:
{
"meta": { "status": 200, "requestId": "…", "nextCursor": "WyIyMDI2LTEwLTA0…" },
"data": { "total": 128, "contacts": [ { "id": "…", "status": "lead", "name": "Анна", "updatedAt": "2026-10-04T09:12:00Z" } ] }
}
Pagina următoare — aceeași cerere cu cursor=<meta.nextCursor>; dacă nu există nextCursor — nu mai sunt pagini. Eroare — {"meta": {...}, "error": {"code": "…"}}.
Punctul de lucru. Dacă cheii îi este accesibil un singur punct de lucru, nu este nevoie să îl indicați. Dacă sunt mai multe — adăugați location=<id punct de lucru> (lista — GET /v1/locations), altfel răspunsul este 400 location_required.
Proprietăți și evenimente după user_id-ul dumneavoastră. Nu este obligatoriu să păstrați id-ul nostru al lead-ului: adăugați ?by=user_id, și adresa va deveni identificatorul dumneavoastră de utilizator. Dacă un lead cu un astfel de user_id încă nu există — îl vom crea.
# свойства: операции 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"
Scrierea trece prin aceeași coadă ca modificările din panou: schimbările se aplică în câteva secunde, iar răspunsul la o scriere după user_id — 202 cu pending. În fișa lead-ului, autorul modificării apare ca „API:
Metode#
| Metodă | Ce face | Drept |
|---|---|---|
GET /v1/me, GET /v1/locations |
cheia, drepturi, puncte de lucru | — |
GET /v1/contacts |
lead-uri: status (anon, lead, user), q, limit, cursor |
contacts:read |
GET /v1/contacts/{id} |
fișa: proprietăți, etichete, rezumatul evenimentelor | contacts:read |
POST /v1/contacts/{id}/props |
proprietăți prin operații (până la 250) sau {"props":{…}} |
contacts:write |
POST / DELETE /v1/contacts/{id}/tags |
etichetele lead-ului | contacts:write |
POST /v1/contacts/merge |
fuzionarea a două fișe: previzualizare, apoi "apply": true |
contacts:write |
POST /v1/contacts/{id}/erase |
ștergere la cererea persoanei vizate ("confirm": true) |
contacts:write |
GET /v1/contacts/{id}/events |
fluxul de evenimente al lead-ului | events:read |
POST /v1/contacts/{id}/events, POST /v1/events |
evenimente (până la 100 o dată) | events:write |
GET /v1/contacts/{id}/conversations |
conversațiile lead-ului | conversations:read |
POST /v1/contacts/{id}/messages |
scrieți lead-ului în ultima sa conversație | messages:send |
GET /v1/conversations, /{id}, /{id}/messages |
conversații și mesaje | conversations:read |
POST /v1/conversations/{id}/reply |
răspunsul operatorului sau o notă ("type": "note") |
conversations:write |
POST /v1/conversations/{id}/status, /assign, /tags |
status, responsabil, etichete | conversations:write |
GET /v1/segments, GET /v1/segments/{id}/contacts |
segmente și membrii lor | segments:read |
Câmpurile, exemplele și codurile de eroare ale fiecărei metode — în referință.
Pasul 3. Webhook-uri#
Webhook-urile se configurează la punctul de lucru: Chat → Setări → Webhook-uri — adresa https, evenimentele și secretul semnăturii. La evenimentele conversației (conversație nouă, mesaj nou, status, evaluare, etichete) s-au adăugat evenimentele lead-ului:
| Eveniment | Când vine |
|---|---|
lead.created |
a apărut un lead nou (contact lăsat în chat, formular sau creat prin API) |
lead.props_changed |
s-au modificat proprietățile lead-ului — lista cheilor în changedProps |
lead.event_tracked |
lead-ul are un eveniment; implicit toate evenimentele dumneavoastră fără cele de sistem ($…), lista numelor se setează în câmpul „Ce evenimente să trimitem” |
message.goal_reached |
lead-ul a atins scopul mesajului (pop-up, newsletter) |
{
"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 } }
}
Numele, e-mailul și telefonul lead-ului ajung în corp doar dacă webhook-ul are bifa „Transmite contactele vizitatorului” activată. Verificarea semnăturii — HMAC-SHA256 al corpului cu secretul webhook-ului:
# заголовок X-Meni-Signature: sha256=<hex>
echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
Răspundeți 2xx în 5 secunde — altfel livrarea se repetă; după o serie lungă de eșecuri webhook-ul se dezactivează, iar acest lucru se vede în setări. Duplicatele se elimină după deliveryId.
Limitări#
- 60 de cereri pe minut per cheie; peste —
429cu antetulRetry-After. Restul — înX-RateLimit-*. - Până la 200 de înregistrări pe pagină (implicit 50), până la 100 de evenimente per pachet, până la 250 de operații cu proprietăți per cerere, până la 30 de etichete o dată.
- Până la 20 de chei active per cont.
- Jurnalul apelurilor cheii se păstrează 30 de zile: ora, metoda, șablonul căii (fără id și corp), codul răspunsului, durata.
- Evenimentele trimise prin API ajung în fișa lead-ului (flux, rezumat, segmente), dar nu în jurnalul brut al analiticii vizitelor.
- Lead-ului i se poate scrie doar într-o conversație existentă: nu există conversație — răspuns
409 no_conversation.
Depanare#
| Răspuns | Ce înseamnă | Ce să faceți |
|---|---|---|
401 api_key_missing / api_key_invalid |
cheia lipsește din cerere sau este greșită, revocată ori expirată | verificați antetul; dacă e nevoie, reemiteți cheia |
403 scope_required |
cheia nu are dreptul necesar | Drepturi la cheie — adăugați dreptul |
400 location_required |
cheii îi sunt accesibile mai multe puncte de lucru | adăugați location=<id> |
404 location_not_found |
punctul de lucru nu e printre punctele cheii | verificați cu GET /v1/locations |
404 not_found |
lead-ul sau conversația nu există | pentru id-urile dumneavoastră folosiți ?by=user_id |
429 rate_limited |
mai mult de 60 de cereri pe minut | așteptați Retry-After secunde, grupați evenimentele în pachete |
502 upstream_error |
defecțiune temporară | repetați cererea mai târziu |
Fiecare cerere se vede în fila Jurnal apeluri — cu codul răspunsului și numele cheii.
Întrebări frecvente#
Se poate apela API-ul din browser? Nu: cheia dă acces la toate lead-urile punctului de lucru. Apelați API-ul de pe serverul dumneavoastră.
Prin ce diferă user_id de id-ul lead-ului? id-ul lead-ului este identificatorul nostru al fișei. user_id este identificatorul dumneavoastră al utilizatorului (numărul în CRM, id-ul contului de pe site); cu ?by=user_id fișa poate fi adresată prin el.
Ce se întâmplă la retrimiterea unui eveniment? Evenimentul cu același id se contorizează o singură dată — puteți repeta liniștit cererea la o eroare de rețea.
E nevoie de o cheie separată pentru fiecare punct de lucru? Nu: o singură cheie poate lucra cu mai multe puncte de lucru, punctul se alege prin parametrul location.
Secțiuni conexe#
- Chat cu vizitatori — conversații, lead-uri și setările webhook-urilor
- Solicitări — flux unic de intrare
- API și MCP ale propriei centrale telefonice — API separat de telefonie
- Integrări