Migration guide

How to migrate from Prelude to Sinch

A developer-focused guide to migrating from Prelude to Sinch, covering channel and compliance differences, request-format mapping, and a step-by-step cutover checklist.

Prelude is a developer platform focused on phone and email verification (OTP), authentication, number intelligence and anti-fraud onboarding, delivered across SMS, RCS, WhatsApp, voice and other channels. Sinch is a broader cloud communications platform for messaging, voice and email APIs. On the messaging.dev Score, Prelude rates 62/100 and Sinch 92/100 — this guide covers what actually changes at the API level when you move, and none of it is a channel downgrade.

What you gain and what you lose

Channels. Sinch is a superset of Prelude’s channel list. You keep SMS, RCS, WhatsApp, Viber, Telegram, voice and email, and you additionally gain MMS, Facebook Messenger and Apple Messages for Business. No channel is lost in the move.

Compliance. Both hold GDPR, ISO 27001 and SOC 2. Sinch also lists HIPAA, which Prelude does not.

Data residency. Prelude hosts in the EU only, with no US region and no residency choice. Sinch offers both EU and US servers, lets you choose your data region, and adds APAC, Australia and Brazil.

Developer experience. Sinch adds a sandbox test environment (Prelude has none) and free trial credit (Prelude offers no free developer credit). Both document at a high quality level. Sinch exposes REST plus SMTP and SMPP; Prelude is REST-only.

SDKs. The two overlap on Node.js, Python, Java, PHP and C#. Prelude additionally ships Go and Ruby SDKs that Sinch does not — note the gap if your code depends on those.

Pricing. Prelude prices per verification plus at-cost per-message (from €0.0043 per SMS, verification fee from €0.032). Sinch is straight pay-as-you-go per message (approx. $0.0075 per US SMS segment) with volume and committed-use discounts. Different model and currency, so re-baseline your cost math.

How the request format differs

Prelude’s quickstart:

curl -X POST https://api.prelude.dev/v2/verification \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "target": {
      "type": "phone_number",
      "value": "+30123456789"
    }
  }'

Sinch’s 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"}'

Endpoint. Prelude posts to one fixed verification endpoint, https://api.prelude.dev/v2/verification. Sinch posts to a regional SMS batches endpoint, https://us.sms.api.sinch.com/xms/v1/{service_plan_id}/batches — note the us. region prefix and that your service_plan_id is part of the URL path, not a header or body field.

Authentication. Both use a Bearer token in the Authorization header (Authorization: Bearer YOUR_API_TOKEN), so the mechanism carries over unchanged. The difference is that Sinch also ties each request to the service_plan_id in the path.

Payload. This is the biggest change. Prelude’s quickstart is a verification call — you send only a target object ({ "type": "phone_number", "value": "+30..." }) and Prelude composes and sends the OTP for you; there is no sender or message body. Sinch’s quickstart is a generic SMS send, so you supply three fields: from (sender), to (an array of recipient numbers) and body (the message text). Mapping: Prelude’s target.value becomes an entry in Sinch’s to array, and you now also provide from and body, which Prelude’s verification flow handled internally.

Migration checklist

  1. Create a Sinch account, generate an API token and note your service_plan_id (free trial credit is included).
  2. Map the request fields: move your recipient from target.value into Sinch’s to array, then add the from sender and body text that Prelude previously generated.
  3. Re-point your sending code to the Sinch base URL, inserting your service_plan_id into the path and keeping the Bearer Authorization header.
  4. Re-test in Sinch’s sandbox before sending any live traffic.
  5. Update your delivery callbacks/webhooks to consume Sinch’s delivery reports instead of Prelude’s.
  6. Run both providers in parallel and compare delivery results.
  7. Cut over once Sinch matches your baseline.

For a from-scratch setup walkthrough, see how to start with Sinch, and for a full feature-by-feature breakdown see the Prelude vs Sinch comparison.

Watch out for

  • OTP logic becomes yours. Prelude’s verification endpoint generated and validated codes; Sinch’s SMS API just sends text, so you rebuild code generation, expiry and verification yourself.
  • No Go or Ruby SDK. Sinch ships Node.js, Python, Java, PHP and C# only — drop those two languages if you relied on them.
  • Narrower country list. Prelude lists 230 countries versus Sinch’s 150; confirm all your destinations are covered before you cut over.
  • Pricing model and currency shift. You move from at-cost per-message plus per-verification fees (EUR) to standard pay-as-you-go per message (USD).

Compliance and data residency are the exceptions — Sinch is equal or broader on both, so nothing is lost there.