Providers overview
Compare the Twilio, Telnyx, Plivo, and Vonage adapters: support status, sender types, MMS, scheduling, webhooks, and limits.
Every adapter uses the same send() call and the same webhook events. Pick a provider by the capabilities below, the provider’s own coverage and pricing, and where your senders are already provisioned.
Support status
| Provider | API | Status | Why |
|---|---|---|---|
| Twilio | Programmable Messaging, Message resource, 2010-04-01 |
Supported | Request, response, error codes, statuses, and webhook signing come from Twilio’s docs. Twilio’s published signature example is a test vector. |
| Telnyx | Messaging API v2, POST /v2/messages |
Supported | Request, response, error catalog, and Ed25519 webhook signing come from Telnyx’s docs and official SDK source. |
| Plivo | Message API, POST /v1/Account/{auth_id}/Message/ |
Partial | Plivo does not document its API error body, so only 401 (auth) and 429 with Plivo’s api_id (rate limit) are told apart. Other 4xx responses are request rejections and never fall back. |
| Vonage | Messages API v1, POST /v1/messages, channel sms |
Partial | Vonage does not document the HTTP status for each error code. Classification uses the documented 401, 402, and 422 statuses and the error code in the response. No short codes, no MMS. |
Supported adapters implement 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. Read the status at runtime from adapter.support or sms.capabilities().
None of the four providers documents send idempotency for SMS, so no adapter has native idempotency. See Idempotency.
Capabilities
| Twilio | Telnyx | Plivo | Vonage (JWT) | Vonage (Basic) | |
|---|---|---|---|---|---|
| Send text | ✅ | ✅ | ✅ | ✅ | ✅ |
MMS (mediaUrls) |
✅ max 10 | ✅ | ✅ | ❌ | ❌ |
Scheduling (sendAt) |
✅ Messaging Service only | ✅ | ❌ | ❌ | ❌ |
Validity period (validityPeriodSec) |
1 to 36000 s | ❌ | 5 to 10799 s | 20 to 604800 s | 20 to 604800 s |
Per-message webhookUrl |
✅ | ✅ | ✅ | ✅ | ❌ |
| Delivery status webhooks | ✅ | ✅ | ✅ | ✅ | ❌ |
| Inbound webhooks | ✅ | ✅ | ✅ | ✅ | ❌ |
| Provider-declared STOP/HELP | ✅ OptOutType |
Keyword only | Keyword only | Keyword only | ❌ |
| Webhook replay window | None | 300 s | None | 300 s | n/a |
Sender types
| Sender | Twilio | Telnyx | Plivo | Vonage |
|---|---|---|---|---|
| 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 decides whether your account may use that sender in a given country. Each provider page lists the provider’s rules under Regions and countries, and Senders and E.164 numbers covers the general idea.
Choosing
| You need | Use |
|---|---|
| Scheduling with any sender | Telnyx |
| Scheduling from a Twilio Messaging Service | Twilio |
| MMS | Twilio, Telnyx, or Plivo |
| Short codes | Twilio, Telnyx, or Plivo |
| The most precise rejection categories, so fallback triggers on the right errors | Twilio or Telnyx |
| A second provider for fallback | Any two. Put the supported one first if you mix statuses. |
Switching providers
Changing the adapter is one line of code. The account work takes longer:
- Provision and register a sender with the new provider. Numbers, short codes, 10DLC campaigns, and toll-free verifications belong to one provider account.
- Configure webhook URLs and webhook credentials on the new provider.
- Check sender rules for each destination country.
See Switch Twilio to Telnyx for the full checklist.
Another provider
For a provider that is not listed, implement the adapter contract and check it with the contract harness. See Build a provider adapter.