Cara SendGrid mengirim webhook

SendGrid menandatangani dengan ECDSA P-256, bukan HMAC, di header x-twilio-email. Format terverifikasi dan verifier Web Crypto.

Perilaku pengiriman

Diambil dari dokumentasi resmi vendor, terakhir diperiksa 2026-08-06. Jika vendor tidak menyebut angka, tabel ini juga tidak mencantumkannya.

Batas waktu responstidak dipublikasikan vendor
Percobaan ulangtidak dipublikasikan vendor
Berhenti mencobatidak dipublikasikan vendor

Tanda tangan

Diverifikasi dengan verifier yang berfungsi dan dibuktikan oleh test suite, bukan dibaca dari dokumentasi. Terakhir diverifikasi 2026-08-20.

AlgoritmaECDSA P-256
Payload bertanda tangan{timestamp}{body}
Encodingbase64
Headerx-twilio-email-event-webhook-signature
Toleransitidak diberlakukan

Verifikasi

Raw body dari permintaan, byte demi byte, sebelum parsing JSON apa pun. Setiap skema di halaman ini rusak begitu framework melakukan serialisasi ulang pada payload.

// ECDSA P-256 over "{timestamp}{body}", signature and key both base64.
const b64 = (s) => Uint8Array.from(atob(s), (c) => c.charCodeAt(0));

const key = await crypto.subtle.importKey(
  "spki",
  b64(verificationKey), // Mail Settings → Signed Event Webhook
  { name: "ECDSA", namedCurve: "P-256" },
  false,
  ["verify"],
);
const ts = req.headers["x-twilio-email-event-webhook-timestamp"];
const valid = await crypto.subtle.verify(
  { name: "ECDSA", hash: "SHA-256" },
  key,
  b64(req.headers["x-twilio-email-event-webhook-signature"]),
  new TextEncoder().encode(ts + rawBody),
);

Yang sering menjebak

Header-nya bertuliskan x-twilio-email karena Twilio memiliki SendGrid; skemanya milik SendGrid sendiri dan tidak punya kesamaan apa pun dengan HMAC-SHA1 milik Twilio. Verifier yang hanya berpatokan pada prefiks header akan memilih algoritma yang salah.

Baca juga

AnyHook berada di depan endpoint yang menerima webhook dari SendGrid: AnyHook menjawab dalam sekitar satu detik, mencoba ulang sesuai jadwalnya sendiri saat server Anda mati, dan menyimpan setiap event agar dapat diputar ulang (replay). Ganti satu URL, kode Anda tetap.

Cara kerjanya →