Layer 1 - SMS statusCode (immediate API response)
This comes back inside SMSMessageData.Recipients[] the moment you fire the request. It tells you whether AT accepted the message, not whether it was delivered.
100 - Processed - Accepted and being processed.
101 - Sent - Handed off to the telco. This is your "success" for most flows.
102 - Queued - Accepted and queued for sending.
401 - RiskHold - Flagged by AT's risk/fraud system. Usually new accounts, suspicious content, or unusual volume. Contact support to lift.
402 - InvalidSenderId - Your sender ID / shortcode isn't registered or approved for that country.
403 - InvalidPhoneNumber - Malformed recipient number (missing country code, wrong length).
404 - UnsupportedNumberType - Number type not supported for that route.
405 - InsufficientBalance - Top up your AT account.
406 - UserInBlacklist - Recipient has opted out / is blacklisted.
407 - CouldNotRoute - AT couldn't find a route to that number/network.
500 - InternalServerError - AT's side broke.
501 - GatewayError - Error at the gateway layer.
502 - RejectedByGateway - The gateway (telco-facing) rejected it.
Note the trap: 101 "Sent" is not "Delivered." It only means AT passed it to the telco. A message can be 101 and still fail to reach the handset.
Layer 2 - Delivery Report (DLR) status (async, via callback)
This arrives later at your registered delivery-report callback URL, once the telco reports back. These are the ones that actually tell you what happened to the handset:
Sent: Handed to the mobile service provider/telco.
Submitted: Telco accepted it.
Buffered: Telco has queued it (network congestion, phone off).
Success / Delivered: Reached the handset. This is the real win.
Rejected: Telco refused it (often sender ID / content rules).
Failed: Did not reach the handset.
Expired: The message validity period lapsed before the telco could deliver it. Common when the recipient's phone stays off or unreachable past the retry window.
