Migration from Sinch to Orbit
This guide walks you through migrating your SMS, multipurpose Conversation API, and Verification integration from Sinch to Orbit. Sinch’s account shape — aservice_plan_id-scoped API token, a batch-only send surface, and (for omnichannel) the Conversation API “app” wrapping every channel — differs from Orbit’s model, and each of those concepts has a direct equivalent. The migration is incremental: every step below works alongside your live Sinch traffic until you cut over.
Concept Mapping
Prefer not to do it by hand?
The import tooling covers the configuration layer — numbers, messaging services, templates, and consent/contact data — before you touch any code:- Dashboard wizard — Settings → Import walks you through connecting a read-only credential, a dry-run preview, and a one-click commit with rollback.
- CLI —
npm install -g @devotel/cli,devotel auth login, then preview withdevotel migrateand commit with--run.
Step 1: Create Your Orbit Account
- Sign up at orbit.devotel.io/signup
- Generate an API key at Settings → API Keys
- Note your key prefix:
dv_live_sk_xxxx
Authorization: Bearer <service_plan_id token> header with X-API-Key: dv_live_sk_xxxx — one header, one key, for SMS, Verify, Numbers, and webhooks alike.
Step 2: Port Your Numbers
Sinch supports LOA-based port-out, so you can move existing numbers to Orbit. The process takes 7–14 business days. A port request must carry a Letter of Authorization (LoA). Orbit only accepts an LoA URL it issued itself, so you upload the signed PDF to Orbit first and submit the returned URL.Step 3: Swap the SMS Send Path
Sinch’s SMS surface is theBatches resource — batch-shaped even for a single recipient — so “one endpoint to all your to[] values” has to be read as either a single send or a batch.
Sinch (Before)
Orbit (After)
Field-by-field mapping
If your Sinch send was a single-recipient call, leave it single in Orbit. If it genuinely fanned out over
to[], move it to /batch; the per-recipient map mirrors what Sinch’s per-batch DLR would have told you.
Step 4: Migrate Delivery-Report Webhooks
Sinch pushes DLRs as HTTP callbacks into an envelope you registered on the batch. Orbit subscribers see the same signal as signed webhook events with a stable event id — you dedupe on it instead of building idempotency out of per-message state.Envelope mapping
Sinch DLR callback (before)Handler migration
- Subscribe once —
POST /api/v1/webhookswithevents: ["message.delivered", "message.failed", "message.received"]— instead of embeddingdelivery_report: "full"on every send. - Read the raw body before parsing, and verify against
X-Orbit-Signature(HMAC-SHA256 overtimestamp.body).X-Devotel-Signaturestill exists for backward compatibility only. - Dedupe on the envelope
id— Orbit retries at-least-once for about 4–5 hours, so the id is the durable key for yourseen_eventstable. - Ack fast (
2xxin milliseconds) and hand the work to a queue.
Step 5: Map the Conversation API
Sinch’s Conversation API wraps multiple channels inside one “app” that owns the sender and the inbound webhook. In Orbit the equivalent construct is a Messaging Service scoped to a channel, and sends name the channel explicitly. If your Sinch app handled WhatsApp — the most common Conversation-API case — the split looks exactly like the WhatsApp guides.
If your Sinch app mixed SMS and WhatsApp traffic, split it into a SMS Messaging Service plus the WhatsApp WABA path — you’ll get a per-channel throughput cap and a cleaner opt-out list instead of one shared envelope.
Step 6: Migrate Verification
Sinch Verification is the same send/check OTP model as Orbit Verify — two backend calls, plus an optional webhook for asynchronous completion.Sinch (Before)
Orbit (After)
POST /api/v1/verify/send then POST /api/v1/verify/check — see Verify without the SDK.
Migration Checklist
- Create Orbit account and generate an API key
- Port numbers (or purchase new ones) with an LoA
- Install the Orbit SDK (
npm install @devotel-orbit/node) or use plain HTTPS - Swap single sends to
POST /api/v1/messages, batches toPOST /api/v1/messages/batch - Rewire per-batch
delivery_reportflags to one webhook subscription - Update webhook handler to verify
X-Orbit-Signatureand dedupe on eventid - Split any Conversation API app into a per-channel Messaging Service (+ WhatsApp WABA if applicable)
- Migrate Verification to
/verify/send+/verify/check - Update monitoring and alerting for the new event names
- Run parallel sends against both providers
- Decommission the Sinch
service_plan_idcredential only after cutover - Cancel the Sinch account once cutover is stable
Parallel Running Strategy
We recommend running Sinch and Orbit in parallel during migration:- Phase 1 (Week 1–2): Send 10% of traffic through Orbit, 90% through Sinch
- Phase 2 (Week 3–4): Split 50/50 and compare delivery rates
- Phase 3 (Week 5): Route 100% through Orbit, keep Sinch as fallback
- Phase 4 (Week 6+): Decommission Sinch