How to migrate from BulkSMS to Sinch
A developer-focused guide to migrating from BulkSMS to Sinch, covering channel and compliance differences, API request-format changes, and a step-by-step cutover checklist.
BulkSMS is a business messaging platform focused on sending bulk SMS and RCS to mobile networks worldwide via web app, API, and SMPP. Sinch is a broader cloud communications platform that exposes messaging, voice, and email APIs. On the messaging.dev Score, BulkSMS rates 43/100 and Sinch rates 92/100; this guide covers what actually changes at the API level when you migrate between them.
What you gain and what you lose
Channels. Both providers send SMS and RCS, so those carry over unchanged. Moving to Sinch adds MMS, WhatsApp, Viber, Facebook Messenger, Telegram, Apple Messages for Business, voice, and email on the same account. You do not lose any channel that BulkSMS offered.
Compliance. BulkSMS is GDPR-aligned. Sinch is GDPR-aligned and additionally certified for ISO 27001, SOC 2, and HIPAA. No certification is lost in the move.
Data residency. BulkSMS runs EU servers only, with no US option and no region choice. Sinch offers both EU and US servers, supports data-residency choice, and lists additional regions (APAC, Australia, Brazil).
Tooling. BulkSMS ships no official SDKs and has no sandbox; its docs are rated medium. Sinch ships SDKs for Java, Python, C#, Node.js, and PHP, provides a sandbox, and its docs are rated high. Both support self-onboarding and offer a free developer credit (BulkSMS gives 5 free test SMS on signup; Sinch gives free trial credit).
Pricing. Both are pay-as-you-go per outbound message. BulkSMS uses prepaid credits with no headline price, so rates vary by destination network. Sinch publishes approximately $0.0075 per US SMS segment (plus carrier fees) and adds volume and committed-use pricing.
How the request format differs
Source (BulkSMS):
curl -X POST https://api.bulksms.com/v1/messages \
-u 'API_TOKEN_ID:API_TOKEN_SECRET' \
-H 'Content-Type: application/json' \
-d '{"to": "+27000000000", "body": "Hello, World!"}'
Target (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:
- Endpoint. BulkSMS posts to a single base URL,
https://api.bulksms.com/v1/messages. Sinch posts to a region-specific host with your service plan ID embedded in the path:https://us.sms.api.sinch.com/xms/v1/{service_plan_id}/batches. - Authentication. BulkSMS uses HTTP Basic auth (the
-u 'ID:SECRET'flag, sending your token ID and secret). Sinch uses a Bearer token in theAuthorizationheader. Move your credentials out of-uand intoAuthorization: Bearer YOUR_API_TOKEN. - Payload. The recipient field
tochanges from a single string to an array of strings. Sinch also requires afromsender field, which the minimal BulkSMS example omits. The message body field isbodyin both, so that name maps one-to-one.
Migration checklist
- Create a Sinch account, then copy your service plan ID and API token from the dashboard. See how to start with Sinch for the full from-scratch walkthrough.
- Map the request fields: wrap
toin an array, add afromsender, and keepbodyas-is. - Swap the endpoint to your region’s host with the service plan ID in the path, and change auth from Basic to Bearer.
- Re-point your sending code at the new endpoint and credentials.
- Re-test against the Sinch sandbox before sending live traffic.
- Update your delivery-report and webhook callbacks to Sinch’s format.
- Run both providers in parallel and compare delivery and reporting.
- Cut over once results match, then retire the BulkSMS path.
Watch out for
- Country coverage is lower. BulkSMS lists 213 countries versus Sinch’s 150 — confirm your key destinations are supported before cutting over.
- Region lives in the URL. The sample host is
us.*; choose the region that matches your data-residency needs. tomust be an array. A bare string will be rejected by the Sinch batches endpoint.fromis now required. Sender IDs or numbers must be provisioned and, where applicable, registered.
Before committing, review the full BulkSMS vs Sinch comparison.