Skip to main content
Version: 0.3

Errors

Sentinel errors

All defined in the root module (sms.go). Providers wrap their own errors to these so callers can match with errors.Is:

result, err := client.Send(ctx, to, body)
if err != nil {
switch {
case errors.Is(err, gosms.ErrInvalidPhone):
log.Println("Invalid phone number")
case errors.Is(err, gosms.ErrInvalidMessage):
log.Println("Invalid message content")
case errors.Is(err, gosms.ErrRateLimited):
log.Println("Rate limited, try again later")
case errors.Is(err, gosms.ErrInsufficientFunds):
log.Println("Account balance too low")
case errors.Is(err, gosms.ErrBlacklisted):
log.Println("Number is blacklisted")
case errors.Is(err, gosms.ErrProviderError):
log.Println("Provider error:", err)
default:
log.Println("Unknown error:", err)
}
}
ErrorMeaning
ErrInvalidConfigProvider configuration failed validation
ErrInvalidPhoneRecipient (or sender) phone number is invalid
ErrInvalidMessageMessage content failed validation (e.g. empty body)
ErrSendFailedGeneric send failure not covered by a more specific error
ErrProviderErrorThe provider's API returned an error
ErrRateLimitedThe provider is rate-limiting this account
ErrInsufficientFundsAccount balance too low to send
ErrBlacklistedRecipient number is blacklisted
ErrUnsupportedThe provider doesn't support the requested operation (e.g. SNS's GetStatus)

Delivery status

DeliveryStatus is a string enum describing where a message is in its lifecycle:

StatusDescription
StatusPendingMessage is pending
StatusQueuedMessage is queued for delivery
StatusAcceptedMessage accepted by provider
StatusSentMessage sent to carrier
StatusDeliveredMessage delivered to recipient
StatusFailedDelivery failed
StatusRejectedMessage was rejected
StatusExpiredMessage expired before delivery
StatusUnknownStatus unknown

Two helpers classify a status:

status, err := client.GetStatus(ctx, "message_id")
if status.Status.IsFinal() {
if status.Status.IsSuccess() {
log.Printf("Message delivered at %v", status.UpdatedAt)
} else {
log.Printf("Delivery failed: %s", status.ErrorMessage)
}
}
  • IsFinal() — true for StatusDelivered, StatusFailed, StatusRejected, StatusExpired. No further status updates are expected.
  • IsSuccess() — true only for StatusDelivered (confirmed delivery).

Don't confuse this with Result.Success() (see Core), which means the provider accepted the message — not that it was confirmed delivered.