SMS Webhook Events
SendAPI fires HTTP POST requests to your webhook URL for key SMS delivery events.
Event: sms.sent
Fired when an SMS is dispatched to the carrier.
json
{
"event": "sms.sent",
"timestamp": "2026-03-09T14:30:01Z",
"data": {
"id": "sms_01H8...QP",
"to": "+447700900000",
"segments": 1,
"provider": "infobip",
"cost_usd": 0.040
}
}Event: sms.delivered
Fired when a delivery receipt is received from the carrier.
json
{
"event": "sms.delivered",
"timestamp": "2026-03-09T14:30:08Z",
"data": {
"id": "sms_01H8...QP",
"to": "+447700900000",
"delivered_at": "2026-03-09T14:30:08Z"
}
}Event: sms.failed
Fired when an SMS cannot be delivered after all retry attempts.
json
{
"event": "sms.failed",
"timestamp": "2026-03-09T14:30:30Z",
"data": {
"id": "sms_01H8...QP",
"to": "+447700900000",
"error_code": "EC_INVALID_NUMBER",
"error_message": "The destination number is invalid or unreachable."
}
}Event: verify.completed
Fired when a user successfully verifies an OTP code.
json
{
"event": "verify.completed",
"timestamp": "2026-03-09T14:31:00Z",
"data": {
"verification_id": "ver_01H9...AB",
"to": "+447700900000",
"channel": "sms",
"verified_at": "2026-03-09T14:31:00Z"
}
}Event: verify.expired
Fired when an OTP expires before verification.
json
{
"event": "verify.expired",
"timestamp": "2026-03-09T14:35:00Z",
"data": {
"verification_id": "ver_01H9...AB",
"to": "+447700900000",
"channel": "sms",
"expired_at": "2026-03-09T14:35:00Z"
}
}Webhook Security
All webhook payloads are signed with HMAC-SHA256. Verify the X-SendAPI-Signature header to confirm authenticity. See the Webhooks Overview for full verification instructions.