Skip to content
SMS SDK
Esc
↑↓navigate↵open⌘Jpreview
On this page

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.