Choose a provider
Pick an SMS provider for SMS SDK: a quick decision table, support status, capability matrix, and sender types for Twilio, Telnyx, Plivo, Vonage, Bandwidth, and Sinch.
Every adapter uses the same send() call and the same webhook events, so you can pick by features and switch later. Start with the provider where your numbers and sender registrations already live.
Which one should I pick?
| Your situation | Use |
|---|---|
| You already have an account and registered senders somewhere | That provider |
| You need MMS | Twilio, Telnyx, or Plivo |
| You need short codes | Twilio, Telnyx, Plivo, Bandwidth, or Sinch |
| You need scheduled sends from any sender | Telnyx or Sinch |
| You need scheduling from a Twilio Messaging Service | Twilio |
| You want fallback to trigger on exactly the right errors | Twilio or Telnyx. Their error codes are fully documented. |
| You use the Vonage Messages API | Vonage, with JWT auth if you need webhooks |
| You want a second provider for fallback | Any two. Put a Supported one first if you mix statuses. See Fallback and retries. |
Support status
| Provider | API | Status | Main limits |
|---|---|---|---|
| Twilio | Programmable Messaging, 2010-04-01 |
Supported | None |
| Telnyx | Messaging API v2 | Supported | None |
| Plivo | Message API v1 | Partial | Plivo does not document its error body, so 4xx responses other than 401 and 429 are request and never fall back. |
| Vonage | Messages API v1, channel sms |
Partial | Error classification is inferred. No short codes, no MMS. Basic auth gets no webhooks. |
| Bandwidth | Messaging API v2 | Partial | SMS only. Callbacks are unsigned and checked with Basic credentials. Errors classified by HTTP status; a 429 counts as a rate limit only with a Bandwidth error body. |
| Sinch | SMS API (/xms/v1) |
Partial | No MMS. HMAC callback format is unpublished; Basic is the documented option. Few error codes classified. |
Supported adapters build requests, responses, error mapping, and webhooks from official documentation and pass the adapter contract tests. Partial adapters pass the same tests, but some provider behavior could not be confirmed from official documentation. Each provider page lists the gaps. Read the status at runtime from adapter.support or sms.capabilities().
None of the providers documents send idempotency for SMS, so no adapter has native idempotency. See Prevent duplicate sends.
Capabilities
| Twilio | Telnyx | Plivo | Vonage (JWT) | Vonage (Basic) | Bandwidth | Sinch | |
|---|---|---|---|---|---|---|---|
MMS (mediaUrls) |
✅ max 10 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
Scheduling (sendAt) |
✅ Messaging Service only | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
Validity period (validityPeriodSec) |
1 to 36,000 s | ❌ | 5 to 10,799 s | 20 to 604,800 s | 20 to 604,800 s | ❌ | 1 to 2,592,000 s |
Per-message webhookUrl |
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
| Delivery status webhooks | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Inbound webhooks | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| STOP/HELP detection | ✅ provider OptOutType |
Keyword | Keyword | Keyword | ❌ | Keyword | Keyword |
| Webhook replay window | None | 300 s | None | 300 s | n/a | None | 300 s with HMAC, none with Basic |
Every adapter sends text. An unsupported field throws UnsupportedFieldError before any request, so nothing is sent. “Keyword” means SMS SDK detects STOP and HELP in the message text; Twilio also reports its own opt-out signal. Without a replay window, store each event’s dedupeKey and skip repeats, as covered in Webhook security.
Sender types
| Sender | Twilio | Telnyx | Plivo | Vonage | Bandwidth | Sinch |
|---|---|---|---|---|---|---|
| Long code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Toll-free | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Short code | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Alphanumeric sender ID | ✅ | ✅ needs messagingProfileId |
✅ | ✅ | ❌ | ✅ |
{ messagingService } |
Messaging Service SID | Messaging profile ID | Powerpack UUID | ❌ | ❌ | ❌ |
This table says what the adapter can send from. The provider and the carriers decide whether your account may use that sender in a given country. Each provider page lists its rules under Senders, and Registration and consent covers 10DLC, toll-free verification, short codes, and sender IDs.
Switching providers
Changing the adapter is one line of code. The account work takes longer: senders and their registrations belong to one provider account, and you need new webhook URLs and credentials. See Switch providers for the checklist.
For a provider that is not listed, see Build your own adapter.