Key Takeaways
- Java DLR parsing is HTTPS/JSON into your store — Jackson/Gson locally, not an SMS Gateway Java SDK.
- HTTP 200 on send is accepted, not delivered. Persist the gateway message id and wait for DLR.
- Unknown status strings fail closed. Confirm live enums in Developer Center.
- Webhook push plus a poll repair job beats either alone when the phone was offline.
- Auto-reply is inbound text, not a delivery report. Do not mash the mappers.
- You bring the Android and operator credit. We meter devices and send volume.
Map JSON, trust the radio
Java parse DLR from an Android SMS gateway API is how your backend turns a status payload into something finance and support can trust: queued, sent, delivered, failed — stored against the message id you got at accept time. It is REST HTTPS/JSON. It is not a branded Java SDK, not Maven “complete SMS kit,” and not a rewrite of the Android SMS gateway API guide.
If your mapper treats unknown strings as delivered, you shipped optimism, not a delivery report.
Not a Java SDK product
Use the JDK HTTP client (or OkHttp) plus Jackson/Gson as a JSON mapper. Live path, headers, and enum names live in Developer Center— this spoke does not invent them. PHP’s parse-DLR sibling is the same physics in another language; do not clone it here. Product DLR behavior: SMS delivery reports.
Status families to persist
| Family | Means | Java handler |
|---|---|---|
| Accepted / queued | Control plane has the job | Store id; do not mark delivered |
| Sent / submitted | Modem handed to the operator | Still wait for DLR |
| Delivered | Handset ack (when the operator provides it) | Idempotent upsert on message id |
| Failed / rejected / expired | Radio, voucher, or operator | Surface reason; do not blind-retry OTP |
| Unknown | Schema drift | Fail closed; alert; check Developer Center |
HMAC on webhooks. Duplicate callbacks must not double-count. Auto-reply inbound is a different mapper — see auto-reply and STOP.
Webhook vs poll repair
Prefer signed webhooks for near-real-time. Add a poll/repair job for rows stuck in accepted after the phone was offline. Device last-seen belongs in the same dashboard as pending DLR age. Confirm fields in Developer Center before you write the poll path.
Cost
You bring the Android and operator SMS credit. We meter devices plus platform volume. Failed sends and retries still hit the voucher. Free is 1 device / 300 SMS lifetime / 300 contacts — a bad soak test for DLR fixtures. See device and SMS volume pricing.
Checklist
- No “Java SDK” branding in docs or comments.
- Message id persisted at accept time.
- Unknown status fails closed with an alert.
- Webhook signature verified.
- Poll repair for stuck accepted rows.
- OTP retries not driven by DLR noise.
- Inbound auto-reply mapper separate.
- Developer Center checked for live enums.
Next steps
Cross-check the phone DLR in-depth guide if you need radio semantics, keep samples on PHP HTTPS/JSON as language cousins, and pair a handset in the device setup guide.
Related product pages
Jump to the live product docs for this topic—not another long-form article.
- SMS delivery reports (DLR)Delivery status tracking
- SMS API documentationLive endpoint reference
- device and SMS volume pricingPlans and allowances
- Android SMS gateway product guideDefinition, product, and how to buy




