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|openedcustomerRefyalnız gönderimde verildiyse ve korelasyon kurulduysa yazılır.datasabit alanları:email(her zaman),providerMessageId?,campaignId?(kampanya olayında),publicMessageId?(işlemsel olayda) + tipe özel detaylar (bounceType,bounceSubType,timestamp,ipAddress,userAgentvb. — sağlayıcı payload'ından geldiği kadarıyla).- Olaylar 30 gün saklanır.
Poll
/public/v1/eventsscopereadSorgu parametreleri
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
after | string | hayır | Cursor: bu olay id'sinden sonraki olaylar döner. İlk çağrıda boş bırakın. |
types | string | hayır | Virgülle ayrık filtre (delivered,bounced,complained,opened alt kümesi). Bilinmeyen değer 422 validation_error. |
limit | integer | hayır | 1–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 (422invalid_url).eventTypesboş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
secretiçerir (whsec_+ 64 hex) — yalnız bu yanıtta görünür, kaydedin. Sonradan görülemez;rotate-secretyenisini üretir ve eski secret'la üretilen imzalar anında geçersiz olur. - Endpoint durumları:
active|disabled|auto_disabled.PUTile yalnızactive/disabledseçilebilir;auto_disabledbir endpoint'iactive'e çekmek başarısızlık sayacını sıfırlar. testucu persist edilmeyen örnek birdeliveredolayını senkron POST'lar; yanıt{ delivered, httpStatus?, error? }— sayaçlara dokunmaz (tanı ucu).
Oluştur (secret BİR KEZ döner)
/public/v1/webhooksscopesendGövde
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
url | string | evet | https zorunlu; localhost/private/loopback reddedilir. |
eventTypes | string[] | hayır | delivered | bounced | complained | opened alt kümesi; boşsa dördü birden. |
Liste
/public/v1/webhooksscopereadTekil
/public/v1/webhooks/{id}scopereadPath parametreleri
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
id | string | evet | Webhook endpoint id'si. |
url / eventTypes / status
/public/v1/webhooks/{id}scopesendPath parametreleri
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
id | string | evet | Webhook endpoint id'si. |
Gövde
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
url | string | hayır | Yeni URL (https zorunlu). |
eventTypes | string[] | hayır | Abone olunan olay tipleri. |
status | string | hayır | Yalnız active | disabled seçilebilir; auto_disabled endpoint'i active'e çekmek sayacı sıfırlar. |
Sil
/public/v1/webhooks/{id}scopesendBaşarıda 204 (gövdesiz).
Path parametreleri
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
id | string | evet | Webhook endpoint id'si. |
Yeni secret (bir kez döner)
/public/v1/webhooks/{id}/rotate-secretscopesendYeni secret üretir; eski secret'la üretilen imzalar anında geçersiz olur. Secret yalnız bu yanıtta görünür.
Path parametreleri
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
id | string | evet | Webhook endpoint id'si. |
Örnek olay gönderir (senkron)
/public/v1/webhooks/{id}/testscopesendPersist 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
| Ad | Tip | Zorunlu | Açıklama |
|---|---|---|---|
id | string | evet | Webhook 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ı
failedolur. - Endpoint ardışık 20 başarısızlıkta otomatik
auto_disabledolur (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 (aftercursor'ı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.