How to migrate from Apifon to Bird
A developer's guide to moving an SMS integration from Apifon to Bird, covering channel, compliance, and request-format differences plus a step-by-step checklist.
Apifon is a Greek business-messaging platform offering SMS, Viber, WhatsApp, RCS, Facebook Messenger and email through REST and SMPP APIs. Bird (formerly MessageBird) is an Amsterdam-based communications-infrastructure platform with unified APIs for email, SMS, WhatsApp and voice. On the messaging.dev Score, Apifon rates 52/100 and Bird 76/100; this guide covers what actually changes when you move an integration from one to the other.
What changes at a glance
Channels you keep: SMS, WhatsApp and email are on both platforms. Neither supports MMS, Telegram or Apple Messages for Business.
Channels you gain: Bird adds Voice.
Channels you lose: Bird does not offer RCS, Viber or Facebook Messenger, all of which Apifon supports. If any current traffic uses those three, you will need a replacement channel or a second provider.
Compliance: Both carry GDPR and ISO 27001. Bird additionally holds SOC 2 and HIPAA, which Apifon does not.
Data residency: Apifon hosts in the EU only, with no region choice. Bird runs both EU and US regions and lets you choose where data lives — the choice is encoded in the API host and key prefix.
Pricing and credit: Apifon uses prepaid pay-as-you-go with per-message rates quoted per account (not published). Bird uses usage-based pricing with published per-country SMS rates (from $0.0073 per US message, carrier fees extra). The free credit also differs in kind: Apifon gives a trial bonus on verification, while Bird’s free tier is email-only (1,000 messages/month) — there is no free SMS allowance.
SDKs and tooling: The only shared official SDK language is Python. Apifon ships Java, PHP, C#, Python and Node.js; Bird ships TypeScript, Python and Go. Bird also provides a sandbox for pre-production testing, which Apifon does not. Both document at a high quality. On protocols, Apifon offers REST + SMPP while Bird offers REST + SMTP, so an SMPP binding does not carry over.
How the request format differs
Apifon:
curl -X POST "https://ars.apifon.com/services/api/v1/sms/send" \
-H "Content-Type: application/json" \
-H "X-ApifonWS-Date: $(date -u '+%a, %d %b %Y %H:%M:%S GMT')" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{"message":{"text":"Hello There!","sender_id":"Apifon"},"subscribers":[{"number":"306999999999"}]}'
Bird:
curl -X POST "https://us1.platform.bird.com/v1/sms/messages" \
-H "Authorization: Bearer bk_us1_..." \
-H "Content-Type: application/json" \
-d '{
"to": "+14155550100",
"from": "Bird",
"text": "Your Bird verification code is 481920. It expires in 10 minutes.",
"category": "authentication"
}'
Both send a POST with a JSON body, but the shape differs. The endpoint moves from Apifon’s fixed https://ars.apifon.com/services/api/v1/sms/send to Bird’s region-prefixed https://us1.platform.bird.com/v1/sms/messages (swap us1 for eu1 to keep data in the EU). Authentication changes too: Apifon expects either an HMAC-signed Authorization: ApifonWS <key>:<signature> header with a companion X-ApifonWS-Date header, or an OAuth2 Bearer token; Bird uses a single region-prefixed Bearer key (bk_us1_... / bk_eu1_...) and drops the date header entirely.
The payload flattens. Apifon nests the body and sender under a message object and puts recipients in a subscribers array (subscribers[].number, shown without a leading +). Bird uses top-level fields: text for the body, from for the sender ID, and a single to string in E.164 format (+14155550100). Bird also expects a category field (e.g. authentication) to classify the message.
Migration checklist
- Create a Bird account and generate a region-prefixed API key (
bk_us1_orbk_eu1_) from the dashboard. See how to start with Bird for the full walkthrough. - Map the request fields:
message.text→text,message.sender_id→from,subscribers[].number→to(convert to E.164 with a leading+), and addcategory. - Re-point your sending code to the regional host and swap the auth headers for the single Bearer key; remove the
X-ApifonWS-Dateheader. - Re-test against Bird’s sandbox before sending live traffic.
- Update delivery-status webhooks and callbacks to Bird’s payload format.
- Run both providers in parallel on a slice of traffic to compare delivery.
- Cut over once delivery and reporting match, then decommission the Apifon path.
Watch out for
- Lost channels: RCS, Viber and Facebook Messenger are not available on Bird — migrate those flows separately.
- No free SMS credit: Bird’s free tier covers email only (1,000/month); Apifon’s trial bonus applied more broadly.
- SMPP gone: Bird offers SMTP, not SMPP, so any SMPP binding must be rebuilt as REST.
- SDK coverage narrows: Only Python carries over; Java, PHP, C# and Node.js users switch to REST or TypeScript/Go.
- Fewer countries covered: Bird lists 150 versus Apifon’s 200 — verify your destinations.
For a full side-by-side, see the Apifon vs Bird comparison.