Skip to main content

Overview

WhatsRB Cloud sends HTTP POST requests to your configured endpoint when events occur. Register an endpoint via the API or the dashboard.

Supported events

EventDescription
message.receivedAn inbound message was received
message.statusA message status changed (sent, delivered, read)
message.failedA message failed to send
session.connectedA WhatsApp Web session connected
session.disconnectedA WhatsApp Web session disconnected
session.failedA session connection failed
quota.warningApproaching your daily message quota
quota.exceededDaily message quota exceeded

Payload format

{
  "event": "message.status",
  "data": { ... },
  "timestamp": "2026-01-01T12:00:00Z"
}
The data object content varies by event type.

Signature verification

Every request includes two headers:
  • X-Webhook-Signature — HMAC-SHA256 signature with sha256= prefix
  • X-Webhook-Event — the event name
The signature format is:
sha256=<HMAC-SHA256(secret, raw_body)>

Verify with the Ruby SDK

valid = WhatsrbCloud::WebhookSignature.verify?(
  payload: request.body.read,
  signature: request.headers["X-Webhook-Signature"],
  secret: ENV["WHATSRB_WEBHOOK_SECRET"]
)

return head :unauthorized unless valid

Verify manually (any language)

expected = "sha256=" + HMAC_SHA256(webhook_secret, raw_request_body)
secure_compare(expected, X-Webhook-Signature header)
Always use a constant-time string comparison to prevent timing attacks.

Getting your webhook secret

The secret is returned once when you create the endpoint:
{
  "data": {
    "id": 1,
    "url": "https://yourapp.com/webhooks",
    "secret": "whsec_xxxxxxxxxxxx"
  }
}
Store it securely — it cannot be retrieved again.