Migration guide

How to migrate from smsmode to Sinch

A developer-focused guide to moving your SMS integration from smsmode to Sinch, covering channels, compliance, request-format changes and a migration checklist.

smsmode is a French A2P messaging platform (published by Calade Technologies) exposing SMS, RCS, WhatsApp and text-to-speech APIs, with data hosted in France. Sinch is a publicly traded cloud communications platform offering messaging, voice and email APIs across several regions. On the messaging.dev Score, smsmode rates 53/100 and Sinch 92/100 — this guide covers what changes at the API level when you migrate, not whether you should.

What you gain and what you lose

Every channel smsmode offers — SMS, RCS, WhatsApp and voice — is also available on Sinch, so you lose no channels in the move. You additionally gain MMS, Viber, Facebook Messenger, Telegram, Apple Messages for Business and email.

On compliance, both providers are GDPR and ISO 27001 aligned; Sinch adds SOC 2 and HIPAA. Data residency is the main trade-off. smsmode hosts exclusively in France and states data never leaves the EU (no US servers, no region choice). Sinch offers EU and US servers plus a data-residency choice and additional APAC, Australia and Brazil regions — but its default SMS endpoint is US-hosted, so EU-only routing has to be configured explicitly.

Both use consumption-based pricing, both offer free developer credit, and both support self-serve onboarding. smsmode sells prepaid credits on a sliding volume scale plus optional monthly subscriptions; Sinch is pay-as-you-go per message with volume and committed-use tiers. SDK coverage widens from TypeScript/Node.js only (smsmode) to Java, Python, C#, Node.js and PHP (Sinch). Sinch also provides a sandbox test environment, which smsmode does not. Both documentation sets are rated high quality.

How the request format differs

smsmode:

curl --location 'https://rest.smsmode.com/sms/v1/messages' \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "recipient": { "to": "33600000001" },
    "body": { "text": "Hello from smsmode" }
  }'

Sinch:

curl -X POST 'https://us.sms.api.sinch.com/xms/v1/YOUR_SERVICE_PLAN_ID/batches' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"from":"+15005550006","to":["+15551234567"],"body":"Hello from Sinch"}'

Three things change. The endpoint moves from rest.smsmode.com/sms/v1/messages to us.sms.api.sinch.com/xms/v1/{service_plan_id}/batches — note the region prefix and the required service_plan_id path segment. Authentication switches from an X-Api-Key header to an Authorization: Bearer YOUR_API_TOKEN header. And the payload flattens: smsmode nests the recipient as recipient.to (a single string) and the message as body.text, whereas Sinch takes a top-level to array, a top-level body string, and adds a from sender field that smsmode’s minimal example omits. Use E.164 numbers with a leading + on Sinch.

Migration checklist

  1. Create a Sinch account, then generate an API token and note your service_plan_id from the dashboard.
  2. Map each request field: recipient.toto (as an array), body.textbody, and add a from sender.
  3. Swap the auth header from X-Api-Key to Authorization: Bearer, and re-point the base URL to the Sinch batches endpoint (choosing your region).
  4. Re-point your sending code and update any delivery-receipt or inbound webhooks to Sinch’s callback format.
  5. Re-test against Sinch’s sandbox before sending live traffic.
  6. Run both providers in parallel and compare delivery, then cut over once Sinch matches your baseline.

Watch out for

  • Default US endpoint: the quickstart uses us.sms.api.sinch.com. If you relied on smsmode’s France-only, never-leaves-the-EU guarantee, select an EU region explicitly.
  • Country coverage: Sinch lists 150 countries versus smsmode’s 166 — verify your destinations are supported.
  • Credit sizing: smsmode’s free credit is a defined 20 test SMS; Sinch’s trial credit amount is not published, so confirm it before load-testing.
  • Sender field: Sinch expects a from value; messages may be rejected without a valid sender for your route.

For more, read the Sinch quickstart or the Sinch vs smsmode comparison.