საჯარო API და ვებჰუკები
REST API თქვენს CRM-ს, საიტის ბექენდს ან საკუთარ ბოტს საშუალებას აძლევს cenaly.ge-ის ლიდებსა და დიალოგებთან ისე იმუშაოს, როგორც პანელი მუშაობს: წაიკითხოს ბარათები, შეცვალოს თვისებები, გაგზავნოს მოვლენები, უპასუხოს დიალოგებში. ვებჰუკები კი, პირიქით, თავად აცნობებს თქვენს სერვერს ახალ ლიდებს, მოვლენებსა და შეტყობინებებს.
რა გჭირდებათ დასაწყებად#
| რა | სად |
|---|---|
| როლი | ანგარიშის მფლობელი — გასაღები მისი სახელით მოქმედებს; თანამშრომლები გასაღებებს ვერ ხედავენ |
| განყოფილება | ჩართული ჩატი (ლიდები და დიალოგები მასში ინახება) |
| გასაღები | ინტეგრაციები → API და ვებჰუკები → გასაღებები → გასაღების შექმნა |
| API მისამართი | https://api.cenaly.ge/public-api/v1 |
| მეთოდების ცნობარი | api.cenaly.ge/public-api/v1/docs |
| OpenAPI 3.1 | api.cenaly.ge/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.ge/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":1450,"currency":"RUB"}}]}' \
"$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": 1450 } }
}
ლიდის სახელი, ფოსტა და ტელეფონი სხეულში მხოლოდ მაშინ ხვდება, თუ ვებჰუკში მონიშნულია „სტუმრის კონტაქტების გადაცემა“. ხელმოწერა მოწმდება სხეულის HMAC-SHA256-ით ვებჰუკის საიდუმლოს გამოყენებით:
# заголовок X-Meni-Signature: sha256=<hex>
echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
უპასუხეთ 2xx-ით 5 წამში — წინააღმდეგ შემთხვევაში მიწოდება განმეორდება; წარუმატებლობის ხანგრძლივი სერიის შემდეგ ვებჰუკი ითიშება და ეს პარამეტრებში ჩანს. დუბლიკატები გაფილტრეთ deliveryId-ით.
გამოძახებების ჟურნალის შემოწმება#
თუ ინტეგრაციამ მონაცემების მიღება შეწყვიტა, გახსენით „ინტეგრაციები“ → „API და ვებჰუკები“ → „გამოძახებების ჟურნალი“, აირჩიეთ გასაღები და პერიოდი. ხელმისაწვდომია ბოლო 14 დღე; სწრაფი შემოწმებისთვის შეგიძლიათ აირჩიოთ 1, 3 ან 7 დღე.
ჩანაწერში ჩანს დრო და გასაღები, HTTP მეთოდი, გზა იდენტიფიკატორების გარეშე, პასუხის კოდი, შეცდომა არსებობისას და ხანგრძლივობა მილიწამებში. IP ნაჩვენებია მინიშნებაში, მოთხოვნის შედეგზე მაუსის მიტანისას. მოთხოვნებისა და პასუხების სხეულები ჟურნალში არ არის: ასე ბარათების შიგთავსი და პერსონალური მონაცემები ტექნიკურ ისტორიაში არ დუბლირდება. ჟურნალით შეიძლება გამოძახების შედეგის შემოწმება, მაგრამ შეტყობინებების სრული გაცვლის აღდგენა შეუძლებელია.
თუ საჭირო ჩანაწერი არ არის, შეამოწმეთ არჩეული გასაღები და პერიოდი 14 დღემდე გაზარდეთ. უფრო ძველი გამოძახებები ამ ფანჯარაში არ ჩანს.
გაყიდვები გარე BI-სისტემაში მჭირდება#
ქსელის მმართველს მოსკოვი–ყაზანის გაყიდვების საკუთარ ანალიტიკაში გადაცემა სურს. საჯარო API-ის გასაღები გაყიდვებს არ გასცემს: უფლებები მხოლოდ ლიდებზე, ლიდების მოვლენებზე, დიალოგებზე, შეტყობინებებსა და სეგმენტებზე ვრცელდება. „ყველაფრის“ ნაკრებიც შეკვეთებისა და ქვითრების მეთოდებს არ ამატებს.
ახალი შეკვეთის მოვლენების გადასაცემად სცენარი მოაწყვეთ:
- გახსენით „პარამეტრები“ → „სტატუსების ავტომატიზაცია“ → „სცენარები (Flow)“ და დააჭირეთ „სცენარის დამატებას“.
- „როდის“-ში აირჩიეთ „შეკვეთა გადახდილია“. სხვა ამოცანებისთვის არის „შეკვეთა გაფორმდა“, „შეკვეთის სტატუსი შეიცვალა“ და „შეკვეთა გაუქმდა“.
- „მაშინ“-ში დაამატეთ „ვებჰუკის გამოძახება“ და მიუთითეთ თქვენი ინტეგრაციის დამმუშავებლის მისამართი. საჭიროებისას პირობებიც დააყენეთ.
- დაელოდეთ „შენახულია“-ს, გაატარეთ შესაფერისი სატესტო შეკვეთა და დამმუშავებლის მხარეს მოვლენის მიღება შეამოწმეთ.
შედეგია თქვენი დამმუშავებლის გამოძახება შესაბამისი მოვლენისას. BI-ში ჩატვირთვასა და ველების შეჯერებას ინტეგრატორი აწყობს; სცენარი მთელი წარსული ისტორიის ექსპორტს არ ცვლის. თუ მოვლენა არ მოვიდა, შეამოწმეთ, ჩართულია თუ არა სცენარი, ემთხვევა თუ არა მოვლენა და ყველა პირობა და სწორია თუ არა დამმუშავებლის მისამართი. საჯარო API-ის ჟურნალი გასაღებებით შესრულებულ შემომავალ გამოძახებებს აჩვენებს; ამ გამავალი ვებჰუკის მიწოდება მიმღებ მხარეს შეამოწმეთ.
ერთჯერადი ანალიზისთვის შეკვეთების სია „CSV-ის ექსპორტით“ ჩამოტვირთეთ ან მონაცემთა არქივი მოამზადეთ. ეს ხელით შესასრულებელი გზებია და BI-ის განრიგით ავტომატურ განახლებას არ გპირდებათ.
შეზღუდვები#
- 60 მოთხოვნა წუთში თითო გასაღებზე; ზემოთ —
429სათაურითRetry-After. დარჩენილი რაოდენობა —X-RateLimit-*-ში. - 200-მდე ჩანაწერი გვერდზე (ნაგულისხმევად 50), 100-მდე მოვლენა პაკეტში, 250-მდე ოპერაცია თვისებებზე მოთხოვნაში, 30-მდე ტეგი ერთ ჯერზე.
- 20-მდე აქტიური გასაღები ანგარიშზე.
- „გამოძახებების ჟურნალი“ აჩვენებს ბოლო 14 დღეს. მოთხოვნებისა და პასუხების შიგთავსი არ არის; მეთოდი, გზა იდენტიფიკატორების გარეშე, შედეგი, შეცდომა, ხანგრძლივობა და IP შეფერხების გარჩევაში გეხმარებათ ბარათების შიგთავსის კოპირების გარეშე.
- 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 პარამეტრით ირჩევა.
დაკავშირებული განყოფილებები#
- ჩატი სტუმრებთან — დიალოგები, ლიდები და webhook-ების პარამეტრები
- განაცხადები — ერთიანი შემომავალი ნაკადი
- საკუთარი PBX-ის API და MCP — ტელეფონიის ცალკე API
- ინტეგრაციები