საჯარო 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-ით ჩაწერაზე პასუხია 202 pending-ით. ლიდის ბარათში ცვლილების ავტორი ჩანს როგორც „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 მოთხოვნა წუთში გასაღებზე; ზედმეტზე —
429Retry-Afterთავსართით. ნაშთი —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
- ინტეგრაციები