The short version

When an SMS fails, your support team needs more than a generic "delivery failed" message. They need to know what the error means, whether to retry, and when to escalate. This runbook maps the most common SMS API error codes you'll encounter with Notilify and other transactional SMS providers into clear support workflows—so your team can resolve delivery issues faster and with confidence.

  • Error codes fall into three buckets: provider-level, carrier-level, and number-specific failures—each requires different handling
  • Webhook payloads include delivery state, error codes, and retry timestamps that your support team can query directly
  • Not all errors warrant retries; understanding idempotency keys prevents duplicate sends and frustrated users
  • Certain errors signal sender identity problems that require upstream fixes before retrying will work
  • Support visibility into routing decisions and carrier responses reduces back-and-forth with users

SMS API Error Codes by Category

Provider-level errors occur before the message reaches the carrier network. These typically indicate configuration issues or API misuse. Common codes include 4001 (invalid payload), 4002 (missing required field like sender_id or recipient), 4003 (rate limit exceeded), and 4004 (authentication failure). When your support team sees these, the issue is usually in your integration code or API credentials—not the carrier.

Carrier-level errors come back from the downstream networks after submission. These are where observability matters most. The most common carrier rejections include 5001 (invalid destination format—wrong number of digits or country code), 5002 (number not allocated—the line doesn't exist), 5003 (temporary network failure—carrier temporarily unable to route), and 5004 (permanent delivery failure—the number is permanently unavailable).

Number-specific errors target individual recipients. Error 6001 means the number is on a carrier blocklist; 6002 indicates the subscriber has opted out of your sender ID; 6003 signals possible fraud or pumping behavior triggering carrier filters. These often require checking your sender ID registration status or reviewing your sending patterns.

Support Runbook: From Error to Resolution

  • Step 1: Pull the message ID and check the webhook delivery payload. Identify whether the error is provider-level, carrier-level, or number-specific. Provider errors mean fix your code or config; carrier errors mean check the recipient number or retry later; number-specific errors may require sender ID changes or user contact.
  • Step 2: For rate limit errors (4003), implement exponential backoff in your code. Your team should not manually retry—build it into your retry logic using the idempotency key to avoid duplicates. Wait at least 60 seconds before the first retry, then scale exponentially.
  • Step 3: For invalid number errors (5001, 5002), verify the number format includes the correct country code. If the format is correct but you're getting rejections, check whether the number type is supported in your pricing tier—some countries require premium routes.
  • Step 4: For carrier-level timeouts (5003), retry after 5-10 minutes. If you see repeated 5003 errors for a specific carrier, that's a routing issue your provider should investigate. Document the pattern and timestamp for escalation.
  • Step 5: For blocklist or opt-out errors (6001, 6002), do not retry without investigation. Check your sender ID registration status and verify the user hasn't opted out. If you're using a new sender ID, carriers may be filtering messages until registration propagates—typically 24-72 hours.
  • Step 6: Use the Notilify dashboard delivery timeline to trace each message. Your support team can see exactly where in the pipeline the failure occurred, what the carrier returned, and whether previous delivery attempts were made.

Make Error Codes Operational, Not Ambiguous

The difference between a support team that can resolve SMS issues and one that can't often comes down to having concrete error definitions and clear next steps. When your support operators understand that a 5002 error means the number doesn't exist and they should verify the user's phone number, not retry the same message, they close tickets faster and avoid frustrating users with duplicate deliveries.

Build these error codes into your internal dashboards, document them in your support wiki, and ensure your team knows which errors warrant retry, which require investigation, and which need escalation to engineering. Delivery failures won't disappear, but your team's response time can shrink dramatically when error codes become actionable instead of ambiguous.

What's the difference between a provider error and a carrier error?

Provider errors occur in your API call or the provider's platform before reaching the carrier—think invalid payloads, authentication failures, or rate limits. Carrier errors come back from the downstream mobile networks after submission, indicating the carrier rejected the message. Provider errors usually require code fixes; carrier errors often require checking the recipient number or waiting for network issues to resolve.

Should my support team manually retry failed messages?

Only for specific error types. For temporary carrier failures (5003), a manual retry after 5-10 minutes is reasonable. For rate limit errors (4003), never manually retry—implement exponential backoff in your code instead. For number-specific errors (6001, 6002), investigate before retrying. The safest approach is building automatic retry logic with idempotency keys so retries happen systematically without manual intervention.

How do I know if a failed message is due to sender ID issues?

Look for consistent failures across multiple recipients from the same sender ID, particularly if you're using a new or unregistered sender ID. Carrier responses like "sender not authorized" or elevated 6001/6002 errors often indicate sender ID registration problems. Check your Notilify sender ID dashboard to verify registration status and propagation timelines.

Can delivery receipts prove a user saw the message?

No. Delivery receipts (DLRs) indicate the carrier accepted the message or delivered it to the handset, but they don't confirm the user actually saw or read it. Devices may be off, in airplane mode, or the message may sit in a notification tray unread. Treat DLRs as carrier-level signals, not proof of user engagement.

Read API docs

Use Notilify to build transactional SMS with clearer delivery state, sender planning, and support visibility.

Read API docs