Публикалық API және вебхуктер
REST API сіздің CRM-ге, сайт бэкендіне немесе жеке ботыңызға cenaly.com лидтерімен және диалогтарымен панель сияқты жұмыс істеуге мүмкіндік береді: карточкаларды оқу, қасиеттерді өзгерту, оқиғаларды жіберу, диалогтарда жауап беру. Вебхуктер, керісінше, жаңа лидтер, оқиғалар және хабарламалар туралы серверіңізге өздері хабарлайды.
Іске қосу үшін не қажет#
| Не | Қайда |
|---|---|
| Рөл | тіркелгі иесі — кілт оның атынан әрекет етеді; қызметкерлер кілттерді көрмейді |
| Бөлім | қосылған чат (лидтер мен диалогтар сонда орналасады) |
| Кілт | Интеграциялар → API және вебхуктер → Кілттер → Кілт жасау |
| API мекенжайы | https://api.cenaly.com/public-api/v1 |
| Әдістер бойынша анықтамалық | api.cenaly.com/public-api/v1/docs |
| OpenAPI 3.1 | api.cenaly.com/public-api/v1/openapi.json |
1-қадам. Кілт және құқықтар#
- Интеграциялар бөлімін ашып, бет тақырыбындағы API және вебхуктер түймесін басыңыз.
- Кілттер қойындысында Кілт жасау түймесін басып, атауын енгізіңіз («CRM», «Сайт бэкенді», «Telegram-бот»).
- Құқықтар жинағын таңдаңыз немесе құқықтарды бір-бірлеп белгілеңіз, бірнеше филиал болса — кілт қай филиалдарға рұқсатты және мерзімін көрсетіңіз.
cnk_…құпиясын көшіріңіз. Ол бір рет қана көрсетіледі: бізде тек оның ізтаңбасы (SHA-256) сақталады.
| Құқық | Не береді |
|---|---|
contacts:read |
лидтер тізімі, іздеу және карточкасы, қасиеттер |
contacts:write |
қасиеттер мен тегтерді өзгерту, біріктіру, субъект сұранысы бойынша жою |
events:read |
лид оқиғаларының лентасы |
events:write |
оқиғаларды жіберу (сатып алу, тіркелу, кез келген өз оқиғаңыз) |
conversations:read |
диалогтар мен хабарламалар |
conversations:write |
оператор жауабы, жазба, мәртебе, жауапты, белгілер |
messages:send |
лидке оның соңғы диалогында хабарлама жіберу |
segments:read |
сақталған сегменттер және олардың қатысушылары |
Жинақтар: CRM / бэкенд (лидтер, қасиеттер, оқиғалар, диалогтар мен сегменттерді оқу), Жеке бот (лидтерді оқиды, диалогтарда жауап береді, лидтерге жазады), Тек оқу, Барлығы.
- Құқықтар кілттің құқықтары мен филиалдарын лезде өзгертеді — интеграция жұмысын жалғастырады.
- Қайта шығару жаңа құпия береді; ескісі бірден жұмысын тоқтатады, құқықтар мен журнал қалады.
- Қайтарып алу — бірден және біржола, келесі сұраныс
401алады.
Кілт Authorization: Bearer cnk_… тақырыбымен (немесе X-Api-Key: cnk_…) беріледі. Оны тек серверде сақтаңыз — браузерде де, мобильді қолданбада да емес.
2-қадам. Алғашқы сұраныстар#
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"
Жауап — әрқашан конверт:
{
"meta": { "status": 200, "requestId": "…", "nextCursor": "WyIyMDI2LTEwLTA0…" },
"data": { "total": 128, "contacts": [ { "id": "…", "status": "lead", "name": "Анна", "updatedAt": "2026-10-04T09:12:00Z" } ] }
}
Келесі бет — cursor=<meta.nextCursor> қосылған дәл сол сұраныс; nextCursor жоқ болса — беттер бітті. Қате — {"meta": {...}, "error": {"code": "…"}}.
Филиал. Кілтке бір филиал рұқсат болса, оны көрсетудің қажеті жоқ. Бірнешеу болса — location=<филиал id> қосыңыз (тізім — GET /v1/locations), әйтпесе жауап 400 location_required.
Қасиеттер мен оқиғалар сіздің user_id бойынша. Біздің лид id-ін сақтау міндетті емес: ?by=user_id қосыңыз, сонда мекенжай сіздің пайдаланушы идентификаторыңыз болады. Мұндай user_id-і бар лид әлі жоқ болса — біз оны жасаймыз.
# свойства: операции 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"
Жазу панельдегі түзетулермен бірдей кезек арқылы жүреді: өзгерістер бірнеше секунд ішінде қолданылады, ал user_id бойынша жазуға жауап — pending бар 202. Лид карточкасында түзету авторы «API: <кілт атауы>» ретінде көрінеді.
Әдістер#
| Әдіс | Не істейді | Құқық |
|---|---|---|
GET /v1/me, GET /v1/locations |
кілт, құқықтар, филиалдар | — |
GET /v1/contacts |
лидтер: status (anon, lead, user), q, limit, cursor |
contacts:read |
GET /v1/contacts/{id} |
карточка: қасиеттер, тегтер, оқиғалар жиынтығы | contacts:read |
POST /v1/contacts/{id}/props |
қасиеттерді операциялармен (250-ге дейін) немесе {"props":{…}} |
contacts:write |
POST / DELETE /v1/contacts/{id}/tags |
лидтің тегтері | contacts:write |
POST /v1/contacts/merge |
екі карточканы біріктіру: алдын ала қарау, содан кейін "apply": true |
contacts:write |
POST /v1/contacts/{id}/erase |
субъектінің сұрауы бойынша жою ("confirm": true) |
contacts:write |
GET /v1/contacts/{id}/events |
лидтің оқиғалар лентасы | events:read |
POST /v1/contacts/{id}/events, POST /v1/events |
оқиғалар (бір ретте 100-ге дейін) | events:write |
GET /v1/contacts/{id}/conversations |
лидтің диалогтары | conversations:read |
POST /v1/contacts/{id}/messages |
лидке оның соңғы диалогына жазу | messages:send |
GET /v1/conversations, /{id}, /{id}/messages |
диалогтар мен хабарламалар | conversations:read |
POST /v1/conversations/{id}/reply |
оператордың жауабы немесе жазба ("type": "note") |
conversations:write |
POST /v1/conversations/{id}/status, /assign, /tags |
мәртебе, жауапты, белгілер | conversations:write |
GET /v1/segments, GET /v1/segments/{id}/contacts |
сегменттер және олардың қатысушылары | segments:read |
Әр әдістің өрістері, мысалдары және қате кодтары — анықтамалықта.
3-қадам. Вебхуктер#
Вебхуктер филиалда бапталады: Чат → Баптаулар → Вебхуктер — https мекенжайы, оқиғалар және қолтаңба құпиясы. Диалог оқиғаларына (жаңа диалог, жаңа хабарлама, мәртебе, баға, белгілер) лид оқиғалары қосылды:
| Оқиға | Қашан келеді |
|---|---|
lead.created |
жаңа лид пайда болды (контакт чатта, формада қалдырылды немесе API арқылы құрылды) |
lead.props_changed |
лидтің қасиеттері өзгерді — кілттер тізімі changedProps ішінде |
lead.event_tracked |
лидте оқиға бар; әдепкі бойынша жүйелік ($…) оқиғаларсыз барлық сіздің оқиғаларыңыз, атаулар тізімі «Қандай оқиғаларды жіберу керек» өрісімен беріледі |
message.goal_reached |
лид хабарлама мақсатына жетті (поп-ап, таратылым) |
{
"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 } }
}
Лидтің аты, поштасы және телефоны денеге вебхукте «Қонақтың контактілерін беру» белгісі қосылған жағдайда ғана кіреді. Қолтаңбаны тексеру — денені вебхук құпиясымен HMAC-SHA256:
# заголовок X-Meni-Signature: sha256=<hex>
echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
2xx деп 5 секунд ішінде жауап беріңіз — әйтпесе жеткізу қайталанады; ұзақ сәтсіздіктер сериясынан кейін вебхук өшіріледі және бұл баптауларда көрінеді. Қайталануларды deliveryId бойынша ажыратыңыз.
Шектеулер#
- Кілтке минутына 60 сұрау; одан асса —
Retry-Afterтақырыпшасымен429. Қалдығы —X-RateLimit-*ішінде. - Бетке 200-ге дейін жазба (әдепкі бойынша 50), топтамада 100-ге дейін оқиға, сұрауға 250-ге дейін қасиеттермен операция, бір ретте 30-ға дейін тег.
- Тіркелгіге 20-ға дейін жұмыс істеп тұрған кілт.
- Кілттің шақырулар журналы 30 күн сақталады: уақыт, әдіс, жол үлгісі (id мен денесіз), жауап коды, ұзақтығы.
- API арқылы жіберілген оқиғалар лидтің карточкасына (лента, жиынтық, сегменттер) түседі, бірақ келулер аналитикасының шикі журналына түспейді.
- Лидке тек бар диалогқа жазуға болады: диалог жоқ болса —
409 no_conversationжауабы.
Ақаулықтарды жою#
| Жауап | Не білдіреді | Не істеу керек |
|---|---|---|
401 api_key_missing / api_key_invalid |
сұрауда кілт жоқ, не ол қате, қайтарып алынған немесе мерзімі біткен | тақырыпшаны тексеріңіз; қажет болса кілтті қайта шығарыңыз |
403 scope_required |
кілтте қажетті құқық жоқ | кілттің Құқықтары — құқық қосыңыз |
400 location_required |
кілтке бірнеше филиал қолжетімді | location=<id> қосыңыз |
404 location_not_found |
кілттің филиалдары арасында мұндай филиал жоқ | GET /v1/locations бойынша салыстырыңыз |
404 not_found |
лид немесе диалог жоқ | өз id-леріңіз үшін ?by=user_id пайдаланыңыз |
429 rate_limited |
минутына 60 сұраудан көп | Retry-After секунд күтіңіз, оқиғаларды топтамаларға топтаңыз |
502 upstream_error |
уақытша ақаулық | сұрауды кейінірек қайталаңыз |
Әр сұрау Шақырулар журналы қойындысында көрінеді — жауап кодымен және кілт атауымен.
Жиі қойылатын сұрақтар#
API-ді браузерден шақыруға бола ма? Жоқ: кілт филиалдың барлық лидтеріне қолжетімділік береді. API-ді өз серверіңізден шақырыңыз.
user_id лидтің id-інен несімен ерекшеленеді? Лидтің id-і — карточканың біздің идентификаторымыз. user_id — сіздің пайдаланушы идентификаторыңыз (CRM-дегі нөмір, сайттағы тіркелгі id-і); ?by=user_id арқылы карточканы сол арқылы адрестеуге болады.
Оқиғаны қайта жібергенде не болады? Бірдей id-і бар оқиға бір рет есептеледі — желілік қате кезінде сұрауды батыл қайталауға болады.
Әр филиалға жеке кілт керек пе? Жоқ: бір кілт бірнеше филиалмен жұмыс істей алады, филиал location параметрімен таңдалады.
Қатысты бөлімдер#
- Қонақтармен чат — диалогтар, лидтер және вебхук баптаулары
- Өтінімдер — бірыңғай кіріс ағыны
- Өз АТС-іңіздің API және MCP — жеке телефония API-і
- Интеграциялар