Olaylar: Poll ve Webhook

Teslim yaşam döngüsü olayları iki kanaldan izlenir; iki kanal da aynı olay şeklini kullanır (tek parser yazarsınız).

Olay şekli

  • type: delivered | bounced | complained | opened
  • customerRef yalnız gönderimde verildiyse ve korelasyon kurulduysa yazılır.
  • data sabit alanları: email (her zaman), providerMessageId?, campaignId? (kampanya olayında), publicMessageId? (işlemsel olayda) + tipe özel detaylar (bounceType, bounceSubType, timestamp, ipAddress, userAgent vb. — sağlayıcı payload'ından geldiği kadarıyla).
  • Olaylar 30 gün saklanır.

Poll

GET/public/v1/eventsscoperead

Sorgu parametreleri

AdTipZorunluAçıklama
afterstringhayırCursor: bu olay id'sinden sonraki olaylar döner. İlk çağrıda boş bırakın.
typesstringhayırVirgülle ayrık filtre (delivered,bounced,complained,opened alt kümesi). Bilinmeyen değer 422 validation_error.
limitintegerhayır1–500 (varsayılan 100).

nextAfter'ı bir sonraki isteğin after'ı yapın. Boş sayfada nextAfter istekteki after olarak aynen döner; değeri körlemesine taşıyabilirsiniz. Poll ucu webhook tanımından bağımsız her zaman çalışır.

Webhook aboneliği yönetimi

  • url: https zorunlu; localhost/private/loopback adresler reddedilir (422 invalid_url).
  • eventTypes boşsa dört tipe birden abone olunur.
  • Hesap başına en çok 3 endpoint (webhook_limit_reached, 422).
  • Oluşturma yanıtı endpoint alanlarına ek secret içerir (whsec_ + 64 hex) — yalnız bu yanıtta görünür, kaydedin. Sonradan görülemez; rotate-secret yenisini üretir ve eski secret'la üretilen imzalar anında geçersiz olur.
  • Endpoint durumları: active | disabled | auto_disabled. PUT ile yalnız active/disabled seçilebilir; auto_disabled bir endpoint'i active'e çekmek başarısızlık sayacını sıfırlar.
  • test ucu persist edilmeyen örnek bir delivered olayını senkron POST'lar; yanıt { delivered, httpStatus?, error? } — sayaçlara dokunmaz (tanı ucu).

Oluştur (secret BİR KEZ döner)

POST/public/v1/webhooksscopesend

Gövde

AdTipZorunluAçıklama
urlstringevethttps zorunlu; localhost/private/loopback reddedilir.
eventTypesstring[]hayırdelivered | bounced | complained | opened alt kümesi; boşsa dördü birden.

Tekil

GET/public/v1/webhooks/{id}scoperead

Path parametreleri

AdTipZorunluAçıklama
idstringevetWebhook endpoint id'si.

url / eventTypes / status

PUT/public/v1/webhooks/{id}scopesend

Path parametreleri

AdTipZorunluAçıklama
idstringevetWebhook endpoint id'si.

Gövde

AdTipZorunluAçıklama
urlstringhayırYeni URL (https zorunlu).
eventTypesstring[]hayırAbone olunan olay tipleri.
statusstringhayırYalnız active | disabled seçilebilir; auto_disabled endpoint'i active'e çekmek sayacı sıfırlar.

Sil

DELETE/public/v1/webhooks/{id}scopesend

Başarıda 204 (gövdesiz).

Path parametreleri

AdTipZorunluAçıklama
idstringevetWebhook endpoint id'si.

Yeni secret (bir kez döner)

POST/public/v1/webhooks/{id}/rotate-secretscopesend

Yeni secret üretir; eski secret'la üretilen imzalar anında geçersiz olur. Secret yalnız bu yanıtta görünür.

Path parametreleri

AdTipZorunluAçıklama
idstringevetWebhook endpoint id'si.

Örnek olay gönderir (senkron)

POST/public/v1/webhooks/{id}/testscopesend

Persist edilmeyen örnek bir delivered olayını senkron POST'lar; sayaçlara dokunmaz (tanı ucu). httpStatus/error yalnız ilgili durumda yazılır.

Path parametreleri

AdTipZorunluAçıklama
idstringevetWebhook endpoint id'si.

Webhook teslimi ve imza doğrulama

Her olay endpoint'inize Content-Type: application/json gövdesiyle POST edilir; başlıklar X-MailMaks-Signature ve X-MailMaks-Event-Id'dir.

İmza sözleşmesi: v1 = HMAC-SHA256(secret, "{t}.{body}") hex (küçük harf); t unix saniyesi, body HTTP gövdesinin ham bayt dizisi.

Teslim garantileri

  • 2xx dışındaki her yanıt (ve 10 sn zaman aşımı) başarısız denemedir. Yeniden deneme aralıkları: 1 dk → 5 dk → 30 dk → 2 sa → 12 sa (toplam 5 deneme); sonra olay o endpoint için kalıcı failed olur.
  • Endpoint ardışık 20 başarısızlıkta otomatik auto_disabled olur (her başarı sayacı sıfırlar). Kapalı kaldığı süredeki olaylar webhook'a geriye dönük gönderilmez — GET /events ile telafi edin (after cursor'ınız kaldığı yerden devam eder).
  • Aynı olay birden çok kez teslim edilebilir (retry) — id (X-MailMaks-Event-Id) ile idempotent işleyin.
  • Sıra garantisi verilmez; occurredAt'e göre değerlendirin.