Olaylar API
POST /v1/e/:kind/:msgId
Kimlik doğrulama yok, gövde yok. İstemci IP'si başına sınırlı (EVENT_RATE_LIMIT).
kind | Olay |
|---|---|
d | delivered |
o | opened |
c | clicked |
x | dismissed |
msgId her push'ta taşınan izleme kimliğidir (APNs'te on.m, FCM ve web'de data.msgId). Yapısı:
base64url("appId|campaignId|userId|subscriptionId|platform|variant") + "." + hmac-sha256(HMAC_SECRET)[0:16]
böylece API veritabanı okumadan doğrular ve gereken her şeyi bilir. Başarıda olayı yazar, kampanyada stats.<type>'ı (ve stats.variants.<variant>.<type>'ı) artırır, webhook'lara notification.<type> atar ve 204 döner.
curl -X POST https://push.example.com/v1/e/o/eyJhcHBJZCI6… # → 204
Hatalar: 400 unknown_kind, 400 invalid_msg_id (imza doğrulanmadı — kurcalanmış ya da yabancı id), 429 rate_limited, 503 database_unavailable.
Güvenlik modeli
Push'u alan kişi msgId'sini tekrar oynatabilir. Bunun kazandırdığı, kendi kampanyasında bir analitik sayacını oynatmaktır — başka bir şey değil. Veri dönmez, hiçbir şey verilmez ve IP başına sınır gürültüyü sınırlar. HMAC_SECRET'i döndürmek yoldaki id'leri geçersizleştirir; bir kampanya yatıştıktan hemen sonra yapın.
Özel istemciler
SDK yerine kendi istemcinizi yazıyorsanız bu ucu keepalive: true / kısa timeout ile çağırın ve hataları yok sayın — izleme pingi bildirimi göstermeyi asla geciktirmemeli. iOS extension'ının ~30 sn çalışma süresi vardır ve 5 sn timeout kullanır; aynısını yapın.