Cách Vercel gửi webhook

Vercel ký raw body bằng HMAC-SHA1. Định dạng đã kiểm chứng, hành vi gửi chưa được công bố, và code xác minh Node.

Hành vi gửi

Lấy từ tài liệu của chính hãng, kiểm tra lần cuối 2026-08-06. Hãng không nêu con số nào thì bảng này cũng không ghi.

Thời hạn phản hồihãng không công bố
Thử lạihãng không công bố
Ngừng gửihãng không công bố

Chữ ký

Kiểm chứng bằng một bộ xác minh chạy thật, có bộ test chứng minh, chứ không đọc từ tài liệu. Kiểm chứng lần cuối 2026-08-20.

Thuật toánHMAC-SHA1
Payload được kýraw body
Encodinghex
Headerx-vercel-signature
Dung saikhông quy định

Xác minh

Dùng raw body của request, đúng từng byte, trước mọi bước parse JSON. Mọi cơ chế trên trang này đều hỏng ngay khi framework serialize lại payload.

const crypto = require("node:crypto");

// hex(HMAC-SHA1(webhook secret, raw body))
const expected = crypto
  .createHmac("sha1", webhookSecret) // Team Settings → Webhooks, shown once
  .update(rawBody)
  .digest("hex");
const received = Buffer.from(req.headers["x-vercel-signature"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
  received.length === wanted.length && crypto.timingSafeEqual(received, wanted);

Những chỗ dễ vấp

Secret chỉ hiện đúng một lần, lúc tạo. Mất nó thì cách duy nhất là xóa rồi tạo lại webhook: không có nút nào để xem lại.

Đọc thêm

AnyHook đứng trước các endpoint nhận webhook từ Vercel: trả lời sau khoảng 1 giây, tự thử lại theo lịch riêng khi server của bạn ngừng hoạt động, và giữ mọi sự kiện để bạn phát lại được. Đổi một URL, giữ nguyên code.

Cách hoạt động →