Migration guide

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

  1. Create a Bird account and generate a region-prefixed API key (bk_us1_ or bk_eu1_) from the dashboard. See how to start with Bird for the full walkthrough.
  2. Map the request fields: message.texttext, message.sender_idfrom, subscribers[].numberto (convert to E.164 with a leading +), and add category.
  3. Re-point your sending code to the regional host and swap the auth headers for the single Bearer key; remove the X-ApifonWS-Date header.
  4. Re-test against Bird’s sandbox before sending live traffic.
  5. Update delivery-status webhooks and callbacks to Bird’s payload format.
  6. Run both providers in parallel on a slice of traffic to compare delivery.
  7. 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.