Receive real-time status updates for workflow runs. Your webhook endpoint will receive POST requests as the workflow progresses through processing, success, or failure states.
Generate a webhook secret
Share your secret with NenAI
Set up your webhook endpoint
X-Hmac-Signature header. Your application must:
sha256= followed by the lowercase hexadecimal HMAC-SHA256 digest.
Use cryptographically secure implementations
crypto.createHmac() in Node.js, hmac.new() in Python). These implementations are:Protect your webhook secret
.gitignore and .env.example filesAlways use timing-safe comparisons
=== or ==) can leak timing information that attackers exploit. Always use timing-safe comparison functions:crypto.timingSafeEqual()hmac.compare_digest()crypto/subtle.ConstantTimeCompare()Validate before processing
200 OK response quickly (within 5 seconds) to acknowledge receipt. Process the webhook data asynchronously if needed.Store message IDs
message_id values in your database to prevent processing duplicate webhooks:Handle URL expiration
Monitor webhook health
Webhooks not arriving
HMAC signature validation failing
X-Hmac-Signature headerrequest.data in Flask, req.body with express.raw() in Express, request.rawBody in Fastify)request.headers['X-Hmac-Signature'] or req.headers['x-hmac-signature']Presigned URLs not working
expires_at timestamp before downloadingBearer authentication header of the form Bearer <token>, where <token> is your auth token.
Workflow status update
The workflow ID being executed
"12345678-1234-1234-1234-123456789abc"
Unique identifier for this workflow run
"550e8400-e29b-41d4-a716-446655440000"
Current status of the workflow
processing "processing"
Unix timestamp when presigned URLs expire
1730319600
Return a 200 status to acknowledge receipt of the webhook