Skip to Content
DocumentationDelivery Status

Delivery Status

A common source of confusion is what a success: true send response actually means.

Two kinds of “delivered”

SignalMeaningGuarantee
Send response status: "Success"The provider accepted the message for deliveryNo — it can still fail downstream
sms.delivered webhookThe message reached (or otherwise left) the carrier in a non-failure stateThe authoritative terminal signal

status: "sent" / "Success" in a send or log response means Africa’s Talking accepted the message onto its routes. The handset may still not receive it — invalid destination, blacklisted subscriber, expired message, or carrier rejection all happen after acceptance.

Message lifecycle

The GET /v1/sms/logs status field moves through:

  • pending — queued, no report yet
  • sent — accepted by the upstream provider
  • delivered — carrier confirmed delivery to the handset
  • failed — message was definitively not delivered

Only webhooks give you the terminal delivered/failed states reliably and in real time. Our webhook system maps the provider’s delivery reports into normalized sms.delivered / sms.failed events delivered to your HTTPS endpoint with signature verification and retries.

Read delivery reactively

  1. Send a message and store the message_id returned in the response.
  2. Register a webhook endpoint (see Webhooks).
  3. When an event arrives, correlate it back to your records using message_id and to.
  4. Update your order/notification state only on sms.delivered, and surface a failure path on sms.failed.

Credits still count on failure

A message that fails after acceptance is refunded per the provider reconciliation. Bulk responses report and refund partial failures individually. If a recipient fails in a bulk batch, that recipient’s credits_used is not billed — the item carries an error instead.

Never gate a user-visible outcome (refunds, order fulfillment) on the send response. Gate it on the webhook.

Last updated on