Genel API ve Web Kancaları
REST API, CRM'nizin, sitenizin arka ucunun veya kendi botunuzun cenaly.com'deki potansiyel müşteriler ve diyaloglarla panelin yaptığı gibi çalışmasını sağlar: kartları okumak, özellikleri değiştirmek, olay göndermek, diyaloglarda yanıtlamak. Web kancaları ise tam tersine, yeni potansiyel müşteriler, olaylar ve mesajlar hakkında sunucunuza kendileri bildirir.
Başlamak için neler gerekir#
| Ne | Nerede |
|---|---|
| Rol | hesap sahibi — anahtar onun adına geçerlidir; çalışanlar anahtarları görmez |
| Bölüm | etkinleştirilmiş sohbet (potansiyel müşteriler ve diyaloglar orada bulunur) |
| Anahtar | Entegrasyonlar → API ve web kancaları → Anahtarlar → Anahtar oluştur |
| API adresi | https://api.cenaly.com/public-api/v1 |
| Yöntem başvuru kılavuzu | api.cenaly.com/public-api/v1/docs |
| OpenAPI 3.1 | api.cenaly.com/public-api/v1/openapi.json |
Adım 1. Anahtar ve yetkiler#
- Entegrasyonlar bölümünü açın ve sayfanın üst kısmındaki API ve web kancaları seçeneğine tıklayın.
- Anahtarlar sekmesinde Anahtar oluştur seçeneğine tıklayın ve bir ad girin ("CRM", "Sitenin arka ucu", "Telegram botu").
- Bir yetki grubu seçin veya yetkileri tek tek işaretleyin; birden fazla şube varsa anahtarın hangi şubelere erişebileceğini ve süresini belirtin.
cnk_…gizli anahtarını kopyalayın. Bu yalnızca bir kez gösterilir: bizde yalnızca parmak izi (SHA-256) saklanır.
| Yetki | Ne sağlar |
|---|---|
contacts:read |
potansiyel müşteri listesi, araması ve kartı, özellikler |
contacts:write |
özellikleri ve etiketleri değiştirme, birleştirme, ilgili kişinin talebi üzerine silme |
events:read |
potansiyel müşterinin olay akışı |
events:write |
olay gönderme (satın alma, kayıt, kendi olayınız) |
conversations:read |
diyaloglar ve mesajlar |
conversations:write |
operatör yanıtı, not, durum, sorumlu, etiketler |
messages:send |
potansiyel müşteriye son diyaloğunda mesaj gönderme |
segments:read |
kaydedilmiş segmentler ve katılımcıları |
Gruplar: CRM / arka uç (potansiyel müşteriler, özellikler, olaylar, diyalogları ve segmentleri okuma), Kendi botunuz (potansiyel müşterileri okur, diyaloglarda yanıtlar, potansiyel müşterilere yazar), Yalnızca okuma, Tümü.
- Yetkiler anahtarın yetkilerini ve şubelerini anında değiştirir — entegrasyon çalışmaya devam eder.
- Yeniden oluştur yeni bir gizli anahtar verir; eski anahtar hemen çalışmayı durdurur, yetkiler ve günlük kalır.
- İptal et — hemen ve kalıcı olarak; sonraki istek
401alır.
Anahtar Authorization: Bearer cnk_… başlığıyla (veya X-Api-Key: cnk_…) iletilir. Anahtarı yalnızca sunucuda saklayın — tarayıcıda veya mobil uygulamada değil.
Adım 2. İlk istekler#
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"
Yanıt her zaman bir zarf biçimindedir:
{
"meta": { "status": 200, "requestId": "…", "nextCursor": "WyIyMDI2LTEwLTA0…" },
"data": { "total": 128, "contacts": [ { "id": "…", "status": "lead", "name": "Анна", "updatedAt": "2026-10-04T09:12:00Z" } ] }
}
Sonraki sayfa — cursor=<meta.nextCursor> ile aynı istek; nextCursor yoksa başka sayfa yoktur. Hata — {"meta": {...}, "error": {"code": "…"}}.
Şube. Anahtarın erişebildiği tek şube varsa belirtmeniz gerekmez. Birden fazla varsa location=<şube id> ekleyin (liste — GET /v1/locations), aksi halde yanıt 400 location_required olur.
Kendi user_id'nizle özellikler ve olaylar. Potansiyel müşterinin bizdeki id'sini saklamanız gerekmez: ?by=user_id ekleyin, adres olarak kendi kullanıcı tanımlayıcınız kullanılır. Bu user_id ile bir potansiyel müşteri yoksa onu biz oluştururuz.
# свойства: операции 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"
Kayıt, panelden yapılan düzenlemelerle aynı kuyruktan geçer: değişiklikler saniyeler içinde uygulanır ve user_id ile yapılan kayda yanıt pending ile birlikte 202 olur. Potansiyel müşteri kartında düzenlemeyi yapan kişi "API: <anahtar adı>" olarak görünür.
Metotlar#
| Metot | Ne yapar | Yetki |
|---|---|---|
GET /v1/me, GET /v1/locations |
anahtar, yetkiler, şubeler | — |
GET /v1/contacts |
potansiyel müşteriler: status (anon, lead, user), q, limit, cursor |
contacts:read |
GET /v1/contacts/{id} |
kart: özellikler, etiketler, olay özeti | contacts:read |
POST /v1/contacts/{id}/props |
işlemlerle özellikler (250'ye kadar) veya {"props":{…}} |
contacts:write |
POST / DELETE /v1/contacts/{id}/tags |
potansiyel müşteri etiketleri | contacts:write |
POST /v1/contacts/merge |
iki kartın birleştirilmesi: önizleme, ardından "apply": true |
contacts:write |
POST /v1/contacts/{id}/erase |
ilgili kişi talebiyle silme ("confirm": true) |
contacts:write |
GET /v1/contacts/{id}/events |
potansiyel müşteri olay akışı | events:read |
POST /v1/contacts/{id}/events, POST /v1/events |
olaylar (tek seferde 100'e kadar) | events:write |
GET /v1/contacts/{id}/conversations |
potansiyel müşteri görüşmeleri | conversations:read |
POST /v1/contacts/{id}/messages |
potansiyel müşteriye son görüşmesinde yazma | messages:send |
GET /v1/conversations, /{id}, /{id}/messages |
görüşmeler ve mesajlar | conversations:read |
POST /v1/conversations/{id}/reply |
operatör yanıtı veya not ("type": "note") |
conversations:write |
POST /v1/conversations/{id}/status, /assign, /tags |
durum, sorumlu, etiketler | conversations:write |
GET /v1/segments, GET /v1/segments/{id}/contacts |
segmentler ve katılımcıları | segments:read |
Her metodun alanları, örnekleri ve hata kodları başvuru kılavuzunda.
Adım 3. Webhook'lar#
Webhook'lar şubede yapılandırılır: Sohbet → Ayarlar → Webhook'lar — https adresi, olaylar ve imza sırrı. Görüşme olaylarına (yeni görüşme, yeni mesaj, durum, değerlendirme, etiketler) potansiyel müşteri olayları eklendi:
| Olay | Ne zaman gelir |
|---|---|
lead.created |
yeni bir potansiyel müşteri oluştu (kişi sohbette, formda bırakıldı veya API üzerinden eklendi) |
lead.props_changed |
potansiyel müşterinin özellikleri değişti — anahtar listesi changedProps içinde |
lead.event_tracked |
potansiyel müşteride olay var; varsayılan olarak sistem olayları ($…) hariç tüm olaylarınız, ad listesi "Hangi olaylar gönderilsin" alanıyla belirlenir |
message.goal_reached |
potansiyel müşteri mesaj hedefine ulaştı (açılır pencere, bülten) |
{
"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 } }
}
Potansiyel müşterinin adı, e-postası ve telefonu gövdeye yalnızca webhook'ta "Misafir kişilerini ilet" onay kutusu işaretliyse eklenir. İmza doğrulama — gövdenin webhook sırrıyla HMAC-SHA256'sı:
# заголовок X-Meni-Signature: sha256=<hex>
echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
5 saniye içinde 2xx yanıtı verin — aksi halde teslimat tekrarlanır; uzun bir başarısızlık serisinden sonra webhook kapatılır ve bu ayarlarda görünür. Yinelenenleri deliveryId ile ayıklayın.
Sınırlamalar#
- Anahtar başına dakikada 60 istek; üzeri —
Retry-Afterbaşlıklı429. Kalan —X-RateLimit-*içinde. - Sayfa başına 200'e kadar kayıt (varsayılan 50), pakette 100'e kadar olay, istek başına 250'ye kadar özellik işlemi, tek seferde 30'a kadar etiket.
- Hesap başına 20'ye kadar etkin anahtar.
- Anahtarın çağrı günlüğü 30 gün saklanır: zaman, metot, yol şablonu (id ve gövde olmadan), yanıt kodu, süre.
- API üzerinden gönderilen olaylar potansiyel müşteri kartına (akış, özet, segmentler) kaydedilir, ancak ham ziyaret analitiği günlüğüne kaydedilmez.
- Potansiyel müşteriye yalnızca mevcut bir görüşmede yazılabilir: görüşme yoksa yanıt
409 no_conversation.
Sorun giderme#
| Yanıt | Ne anlama gelir | Ne yapmalı |
|---|---|---|
401 api_key_missing / api_key_invalid |
istekte anahtar yok veya anahtar geçersiz, iptal edilmiş ya da süresi dolmuş | başlığı kontrol edin; gerekirse anahtarı yeniden oluşturun |
403 scope_required |
anahtarın gerekli yetkisi yok | anahtarın Yetkileri — yetki ekleyin |
400 location_required |
anahtar için birden fazla şube erişilebilir | location=<id> ekleyin |
404 location_not_found |
anahtarın şubeleri arasında böyle bir şube yok | GET /v1/locations ile karşılaştırın |
404 not_found |
potansiyel müşteri veya görüşme yok | kendi id'leriniz için ?by=user_id kullanın |
429 rate_limited |
dakikada 60'tan fazla istek | Retry-After saniye bekleyin, olayları paketler halinde gruplayın |
502 upstream_error |
geçici arıza | isteği daha sonra tekrarlayın |
Her istek Çağrı günlüğü sekmesinde görünür — yanıt kodu ve anahtar adıyla.
Sık sorulan sorular#
API'yi tarayıcıdan çağırabilir miyim? Hayır: anahtar şubenin tüm potansiyel müşterilerine erişim sağlar. API'yi kendi sunucunuzdan çağırın.
user_id'nin potansiyel müşteri id'sinden farkı nedir? Potansiyel müşteri id'si kartın bizdeki tanımlayıcısıdır. user_id sizin kullanıcı tanımlayıcınızdır (CRM'deki numara, sitedeki hesap id'si); ?by=user_id ile kart bu tanımlayıcıyla adreslenebilir.
Bir olay tekrar gönderilirse ne olur? Aynı id ile gelen olay bir kez sayılır — ağ hatasında isteği güvenle tekrarlayabilirsiniz.
Her şube için ayrı anahtar gerekli mi? Hayır: bir anahtar birden fazla şubeyle çalışabilir, şube location parametresiyle seçilir.
İlgili bölümler#
- Misafirlerle sohbet — görüşmeler, potansiyel müşteriler ve webhook ayarları
- Talepler — tek gelen akışı
- Kendi santralinizin API'si ve MCP'si — ayrı telefon API'si
- Entegrasyonlar