Webhooks
App → CRM yönünde event bildirimi. Subscription modeli tercih edilen yoldur.
Auth / scope
- Yönetim: JWT veya API key
webhooks:manage - CRM’inizin inbound URL’i public olmalı; app oraya POST atar
Subscription (önerilen)
Endpoints
| Method | Path | Açıklama |
|---|---|---|
GET | /api/v1/webhooks/subscriptions/ | Liste |
POST | /api/v1/webhooks/subscriptions/ | Oluştur |
GET/PATCH/DELETE | /api/v1/webhooks/subscriptions/{id}/ | Detay |
GET | /api/v1/webhooks/deliveries/ | Teslimatlar |
POST | /api/v1/webhooks/deliveries/{id}/replay/ | Yeniden gönder |
Oluşturma gövdesi
{
"name": "Test CRM",
"url": "https://crm.example.com/api/hooks/b2b",
"secret": "whsec_shared",
"event_types": ["EXECUTION_SUCCESS", "EXECUTION_FAILED"],
"is_active": true
}
event_typesboş veya null → tüm event’lermatches(event_type): pasif abonelik false; aksi halde empty list veya listedeyse true
App’in CRM’e POST’u
POST https://crm.example.com/api/hooks/b2b
Content-Type: application/json
X-Signature: sha256=<hex>
Gövde:
{
"event": "EXECUTION_SUCCESS",
"data": { }
}
data içeriği tetikleyen outbound/push_event bağlamına göre değişir (execution özeti, payload vb.).
İmza doğrulama
HMAC-SHA256 over raw body string; secret abonelikteki secret.
import hmac, hashlib
def verify(secret: str, body: bytes, header: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)
Retry
Başarısız teslimat: en fazla 5 deneme. Backoff: 1m → 5m → 30m → 2h → 2h. Sonrasında dead-letter. Panelden veya replay ile yeniden gönderin.
Legacy outbound webhook
Eski model: organizasyonda tek URL.
Alanlar (org settings / WABA settings serializer üzerinden):
outbound_webhook_urloutbound_webhook_secret
Ne zaman kullanılır? Aktif WebhookSubscription hiç yoksa. En az bir subscription varsa legacy URL kullanılmaz; fan-out yalnızca subscription’lara gider.
Kod: maybe_send_outbound — subscription listesi boş ve outbound_webhook_url doluysa legacy delivery yaratır.
Yeni kurulumlarda subscription kullanın; legacy yalnızca geriye dönük uyumluluk içindir.
UI
Panel: /webhooks · testcrm inbound: /inbound
İlgili: testcrm ↔ app