Skip to content

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.

Released under the MIT License.