WEBHOOK

Gerçek zamanlı olay akışı.

Her e-posta olayı için kendi endpoint'inize POST gönderiyoruz. İmza doğrulama, akıllı retry, sıralama garantisi.

Olay türleri

  • message.sent Mesaj sıraya alındı.
  • message.delivered Mesaj alıcıya teslim edildi.
  • message.opened Alıcı mesajı açtı.
  • message.clicked Alıcı mesajdaki bir bağlantıya tıkladı.
  • message.bounced Mesaj geri döndü (hard/soft bounce).
  • message.complained Alıcı spam şikayetinde bulundu.
  • message.unsubscribed Alıcı listeden çıktı.

Örnek payload

{
  "id": "evt_01h5z...",
  "type": "message.delivered",
  "created_at": "2026-05-13T14:30:00Z",
  "data": {
    "message_id": "msg_01h5z...",
    "to": "[email protected]",
    "from": "[email protected]",
    "subject": "Hoş geldiniz"
  },
  "signature": "v1,abc123..."
}

İmza doğrulama

Her POST'un başlığında X-SendNomi-Signature ve X-SendNomi-Timestamp bulunur. İmza HMAC-SHA256; gövdenin tamamı + Unix epoch zaman damgası ile imzalanır. İmzayı her zaman sabit-zamanlı karşılaştırma ile doğrulayın (örn. Node: crypto.timingSafeEqual).

Replay savunması: İmza geçerli bile olsa, timestamp ±5 dakika dışındaysa isteği reddedin. Olay id değerini en az 24 saat saklayıp tekrar gelirse yutun (idempotency).

Idempotency

Her olayın id alanı benzersizdir (evt_...). Aynı olay birden fazla kez gelebilir — örn. ağ kesintisi sonrası retry. Tüketici tarafı bu ID'yi anahtar olarak kullanıp aynı olayı bir kez işler. SendNomi tarafı en-az-bir-kez (at-least-once) garantisi verir.

Retry stratejisi

2xx alınana kadar üstel geri çekilme: 5s → 30s → 5m → 30m → 2s → 6s → 12s (toplam 8 deneme · ~25 saat). 4xx kalıcı hata sayılır; retry yok. 5xx ve timeout retry'a tabidir.

Endpoint'iniz 200 OK dönmediği sürece sıraya geri yazılır. Yanıtınız 3 saniyeden uzun sürerse timeout sayılır — ağır işi önce sıraya alıp 200 dönmek best practice.

Endpoint güvenliği

  • HTTPS zorunlu — HTTP endpoint kabul edilmez.
  • Public-erişimli olmalı (firewall arkasındaysa SendNomi IP aralığını allowlist'e ekleyin — panel'de güncel liste).
  • Yetkilendirme bilgisi göndermez — sadece imza + payload; başlık veya body içinde gerçek key görmezsiniz.
  • Logla, sansürle — payload'da kullanıcı verisi olabilir; loglama politikanız KVKK / GDPR ile uyumlu olmalı.