Migration guide

How to migrate from Mitto to Sinch

A developer's guide to moving SMS and multichannel messaging from Mitto to Sinch, covering channel, compliance, and request-format differences.

Mitto is a Swiss omnichannel CPaaS that exposes SMS, RCS, WhatsApp, Viber, Telegram, Facebook Messenger, and voice APIs. Sinch is a publicly traded cloud communications platform covering messaging, voice, and email. On the messaging.dev Score, Mitto rates 48/100 and Sinch 92/100; the gap reflects concrete differences in channels, compliance, tooling, and data residency rather than any single factor, and this guide walks through what actually changes in your integration.

What changes when you move

Channels you gain (and none you lose). Every channel Mitto offers exists on Sinch: SMS, RCS, WhatsApp, Viber, Telegram, Facebook Messenger, and voice all carry over. Moving adds three channels Mitto lacks — MMS, Apple Messages for Business, and email. No channel is lost in the migration.

Compliance. Both providers hold GDPR and ISO 27001. Sinch additionally holds SOC 2 and HIPAA, so you gain two certifications and lose none.

Data residency. Mitto publishes neither EU nor US server options and no region choice. Sinch offers both EU and US servers, an explicit data-residency choice, and additional APAC, Australia, and Brazil regions.

Tooling and docs. Mitto ships no official SDKs and rates “med” on documentation quality. Sinch ships Java, Python, C#, Node.js, and PHP SDKs and rates “high.” Both offer a sandbox and REST plus SMPP; Sinch also exposes SMTP for email.

Pricing and credit. Both are pay-as-you-go. Sinch adds committed-use pricing and publishes an approximate starting price of $0.0075 per US SMS segment (plus carrier fees), whereas Mitto’s SMS starting price is not published. New Sinch accounts include free developer credit; Mitto offers none.

How the request format differs

Mitto quickstart:

curl -X POST 'https://rest.mittoapi.net/sms' \
  -H 'Content-Type: application/json' \
  -H 'X-Mitto-API-Key: YOUR_API_KEY' \
  -d '{
    "from": "Mitto SMS",
    "to": "41751231234",
    "text": "Hello, World!",
    "test": true
  }'

Sinch quickstart:

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:

  • Endpoint and base URL. Mitto posts to a single flat path, https://rest.mittoapi.net/sms. Sinch posts to a regional host that embeds your service plan ID and a batches resource: https://us.sms.api.sinch.com/xms/v1/{service_plan_id}/batches. You must pick the correct regional host and supply your service_plan_id.
  • Authentication. Mitto authenticates with an API key in the X-Mitto-API-Key header and also requires your source IP to be whitelisted. Sinch uses a bearer token in the Authorization: Bearer header, with no IP-whitelisting step in the quickstart.
  • Payload fields. The sender stays from, but Mitto’s example uses an alphanumeric sender (Mitto SMS) while Sinch’s uses an E.164 number. The recipient key is to in both, but Mitto takes a single string and Sinch takes an array of numbers. The message body moves from Mitto’s text to Sinch’s body. Mitto’s test: true flag has no Sinch payload equivalent.

Migration checklist

  1. Create a Sinch account, then generate an API token and note your service_plan_id.
  2. Map each request field: textbody, wrap to in an array, and keep from.
  3. Re-point your sending code to the regional batches endpoint and switch auth from X-Mitto-API-Key to Authorization: Bearer.
  4. Re-test in Sinch’s sandbox (it offers one) before sending live traffic.
  5. Update your webhooks and delivery-status callbacks to Sinch’s format.
  6. Run both integrations in parallel and reconcile delivery results.
  7. Cut over once Sinch matches your baseline, then retire the Mitto path.

Watch out for

  • Country coverage drops. Mitto lists 230 countries covered; Sinch lists 150. Confirm your destination markets are supported before cutover.
  • Recipient must be an array. A single-string to that worked against Mitto will fail on Sinch.
  • Regional host and service plan ID. The base URL is region-specific and must include your service_plan_id, unlike Mitto’s single flat endpoint.

For a full side-by-side, see Mitto vs Sinch, and for a from-scratch setup walkthrough, read how to start with Sinch.