SMS API
SMS built for the moment a code has to arrive.
Send A2P SMS with stable message IDs, idempotency keys, real delivery states, and webhook events your backend can actually trust.
Dugble
SMS · shortcode 33482
Send contract
One request in, one traceable state back.
Include the recipient, template, and an idempotency key. A successful response returns a message ID and its first delivery state, never a silent 200 with nothing to trace.
{
"to": "+233531184325",
"template": "login_otp",
"idempotency_key": "otp_7f2a9c"
}{
"message_id": "msg_9c41af",
"status": "queued",
"channel": "sms",
"created_at": "2026-07-22T09:14:02Z"
}Lifecycle
Trace the whole lifecycle.
When a user says they did not get the code, you should know exactly where it stopped, not guess.
Stable IDs
Every accepted request returns a message_id your team can search, store, and trace.
Idempotent sends
Use idempotency_key for retries so network failures do not create duplicate OTPs.
Failure reasons
Expose provider responses and normalized errors so support is not guessing.
Webhook events
Handle message.sent, message.delivered, and message.failed in your backend.
Expected SMS states
message.{status}
Accepted, waiting on the carrier.
Handed off to the carrier network.
Confirmed on the recipient's device.
Carrier rejected or could not route it.
OTP window closed before it was used.
Send your first message in the next five minutes.
Create a workspace, generate an API key, and watch the delivery event come back in the dashboard.