India's premier SMS solution, offering cost-effective pricing.
SMS Gateway ProviderSMS Gateway ProviderSMS Gateway Provider
24 x 7 Sales / Support
info@smsgatewayprovider.com
Coimbatore. TN
Developer Docs · DLR API

SMS Delivery Reports (DLR) API — Real‑Time Message Status

Know exactly what happened to every message. Pull delivery status on demand, or have us push operator receipts to your webhook the moment they arrive — delivered, failed, expired or rejected — so your dashboards, retries and audit trails stay perfectly in sync.

Pull + PushTwo modes
Real-timeWebhook DLR
Per-messageGranular status
AuditTimestamps kept
DELIVRD PENDING FAILED
Two ways to get status

Pull or push — your choice

Pull (polling)

Call the DLR endpoint with a broadcast ID or message ID whenever you want the latest status. Simplest to build — ideal for batch reconciliation and reports.

Push (webhook)

Register a callback URL once. We POST each delivery receipt to you in real time as the operator confirms it — no polling, instant retries and live dashboards.

Pull mode

Query delivery status

Pass your credentials and the broadcast_id returned by the send API (or a specific message_id) to get current status.

GET https://smsgatewayprovider.com/api/smsdlr?username=acme&apikey=YOUR_API_KEY&broadcast_id=1706donef4-2b9c-4d1a
ParameterRequiredDescription
usernameYesYour account username / API login.
apikeyYesYour secret API key.
broadcast_idYes*The broadcast ID returned when you sent the message(s). Returns status for the whole batch.
message_idYes*Status for one specific message. *Provide either broadcast_id or message_id.
responseNojson (default) or text for a plain‑text status.

Response

{
  "broadcast_id": "1706donef4-2b9c-4d1a",
  "reports": [
    {
      "message_id": "48386421654978667841",
      "number": "919876543210",
      "sender": "ACMEIN",
      "status": "DELIVRD",
      "submitted_at": "2026-08-14 13:50:02",
      "delivered_at": "2026-08-14 13:50:18",
      "parts": 1
    }
  ]
}
Push mode

Delivery webhook (callback)

Register a public HTTPS URL in your API settings (or send it as notifyUrl when submitting). We POST a receipt to it for every status change. Respond with HTTP 200 to acknowledge; we retry with backoff if you don't.

# We POST to your callback URL
POST https://your-app.com/webhooks/sms-dlr
Content-Type: application/json

{
  "message_id": "48386421654978667841",
  "broadcast_id": "1706donef4-2b9c-4d1a",
  "number": "919876543210",
  "sender": "ACMEIN",
  "status": "DELIVRD",
  "submitted_at": "2026-08-14 13:50:02",
  "delivered_at": "2026-08-14 13:50:18"
}

Security tip: verify the source IP or a shared secret/signature header before trusting a callback, and always return 200 quickly — queue any heavy processing so retries aren't triggered by slow responses.

Reference

DLR status codes

We normalise operator receipts to a consistent set of statuses. The raw operator value is kept alongside for auditing.

StatusFinal?Meaning
DELIVRDYesDelivered to the handset — confirmed by the operator.
SENTNoAccepted and submitted to the operator (SMSC); awaiting the final receipt.
PENDINGNoQueued or in transit; a final status will follow.
UNDELIVYesUndeliverable — handset unreachable, switched off or invalid.
FAILEDYesOperator rejected or the message could not be processed.
EXPIREDYesValidity period elapsed before delivery could be confirmed.
REJECTDYesBlocked — DND/NDNC, template mismatch, or blacklisted number.

Final statuses will not change — safe to close the record. Non‑final statuses (SENT, PENDING) are interim; keep polling or wait for the push callback.

FAQ

DLR API — frequently asked questions

Should I poll (pull) or use a webhook (push)?
Use push webhooks in production — you get status the instant the operator confirms it, with no wasted polling. Use pull for batch reconciliation, back‑office reports, or when your app can't expose a public callback URL. Many teams do both: push for live updates and a nightly pull to reconcile.
How long does a delivery report take?
Most operator receipts arrive within seconds to a couple of minutes. Some networks are slower, and a message can sit as SENT or PENDING until the handset is reachable, up to the validity period, after which it becomes EXPIRED.
Why is a message stuck at SENT?
SENT means the operator accepted it but hasn't returned a final receipt yet — usually the handset is off or out of coverage. It will resolve to DELIVRD, UNDELIV or EXPIRED. Treat only final statuses as conclusive.
How do I match a report back to my message?
Every send returns a broadcast_id, and each recipient gets a message_id. Both appear in pull responses and push callbacks, so you can reconcile against your own records reliably.
Do you keep delivery history?
Yes. Reports are retained and available through the DLR API and the reporting endpoints, with submitted and delivered timestamps, so you have a complete audit trail for compliance and analytics.
How should my webhook respond?
Return HTTP 200 as fast as possible to acknowledge receipt, then process asynchronously. If you return a non‑200 or time out, we retry with exponential backoff so no receipt is lost.

Close the loop on every message

Get real‑time delivery receipts by webhook or on‑demand pull, with a full audit trail and 24×7 support.

At vero eos et accusamus et iusto odio digni goikussimos ducimus qui to bonfo blanditiis praese. Ntium voluum deleniti atque.

Shopping Cart (0 items)