> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from Infobip to Orbit: SMS, WhatsApp, and number lookup

> Migrate your Infobip integration to Orbit step by step, mapping base-URL auth, SMS, delivery-report callbacks, WhatsApp, Moments flows, Answers bots, and number lookup to their Orbit equivalents.

# Migration from Infobip to Orbit

This guide walks you through migrating your SMS, WhatsApp, and lookup integration from Infobip to Orbit—not just the send endpoint, but the moments flows, Answers bots, and delivery-report handling that come with it. The migration can be completed incrementally.

## Concept Mapping

| Infobip Concept                                     | Orbit Equivalent                                          | Notes                                                                                                    |
| --------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| Base URL (e.g. `abc123.api.infobip.com`) + API key  | Single API key in `X-API-Key` header (`dv_live_sk_xxxx`)  | One endpoint, one key—no per-account host                                                                |
| SMS scenario / destination grouping                 | Messaging Services                                        | Bundle senders + opt-out handling + inbound webhook; pass its id as `messaging_service_id` when you send |
| Delivery-report callbacks                           | Webhook events (`message.delivered`, `message.failed`, …) | One event per outcome instead of a batched array                                                         |
| Moments (omnichannel customer flows)                | Flows (visual builder)                                    | Drag-and-drop flow builder                                                                               |
| Answers (chatbot builder)                           | Agents                                                    | AI-native conversations over SMS/WhatsApp/voice                                                          |
| WhatsApp Business Platform                          | WABA guides (sender setup, templates, 24h window)         | Re-register the sender with Meta on Orbit                                                                |
| Number validation (Validate / Active / Lookup)      | Number Intelligence (lookup)                              | HLR/MNP/risk lookup per number                                                                           |
| Verify 2FA                                          | Verify API                                                | OTP/2FA                                                                                                  |
| Status / callback fields (`callbackData`, `bulkId`) | `status_callback` + idempotent message ids                | Same pattern, JSON instead of Infobip status objects                                                     |

***

## Step 1: Create Your Orbit Account

1. Sign up at [orbit.devotel.io/signup](https://orbit.devotel.io/signup)
2. Generate an API key at **Settings > API Keys**
3. Replace your Infobip base URL + key with that single `X-API-Key` header — every request in this guide targets `https://api.orbit.devotel.io`.

***

## Step 2: Port Your Numbers

Port your existing Infobip numbers to Orbit so SMS keep landing on the same sender ids. 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 upload the signed PDF to Orbit first and submit the returned URL. See the full walkthrough in [Number Porting](/numbers/porting) or use the [interactive port form](https://orbit.devotel.io/numbers/porting).

```bash theme={null}
# 1. Upload the signed LoA PDF (ttl_ms keeps the signed URL valid 24h)
curl -X POST "https://api.orbit.devotel.io/api/v1/files/upload?ttl_ms=86400000" \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -F "file=@./loa.pdf;type=application/pdf"

# 2. Submit the port request with the returned data.url
curl -X POST https://api.orbit.devotel.io/api/v1/numbers/porting \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "numbers": ["+14155551234", "+14155551235"],
    "currentCarrier": "Infobip",
    "country": "US",
    "authorizedSigner": "Your Name",
    "accountNumber": "123456789",
    "accountPin": "1234",
    "loaFileUrl": "https://storage.googleapis.com/.../loa.pdf?X-Goog-Signature=..."
  }'
```

**Alternative:** purchase new numbers and cut traffic over gradually.

***

## Step 3: Map Moments / scenario groupings to Messaging Services

Group the Infobip "scenario" or sender pool concept into an Orbit **Messaging Service** so opt-out handling, inbound webhooks, and sender selection live in one object you reference on every send. Create one in the dashboard under **Messaging > Services** and note its id—you will pass it as `messaging_service_id` below.

***

## Step 4: Update the SMS payload

### Infobip (before)

```javascript theme={null}
const response = await fetch('https://abc123.api.infobip.com/sms/2/text/advanced', {
  method: 'POST',
  headers: {
    Authorization: 'App your_infobip_api_key',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    messages: [
      {
        destinations: [{ to: '+14155552671' }],
        from: '+18005551234',
        text: 'Hello from Infobip!',
        notifyUrl: 'https://yourapp.com/webhooks/sms',
      },
    ],
  }),
})
```

### Orbit (after)

```javascript theme={null}
import { Devotel } from '@devotel-orbit/node'

const orbit = new Devotel({ apiKey: 'dv_live_sk_xxxx' })

await orbit.messages.send({
  channel: 'sms',
  to: '+14155552671',
  body: 'Hello from Orbit!',
  messaging_service_id: 'ms_xxxx',
  status_callback: 'https://yourapp.com/webhooks/sms',
})
```

| Field             | Infobip                                              | Orbit                                                    |
| ----------------- | ---------------------------------------------------- | -------------------------------------------------------- |
| Auth              | `Authorization: App <key>`                           | `X-API-Key: dv_live_sk_xxxx`                             |
| Endpoint          | `POST /sms/2/text/advanced`                          | `POST /api/v1/messages`                                  |
| Payload shape     | `messages: [{ destinations: [{ to }], from, text }]` | `{ channel, to, body }`                                  |
| Delivery callback | `notifyUrl` + `callbackData`                         | `status_callback` (or global webhooks)                   |
| Sender selection  | explicit `from`                                      | auto-selected from Messaging Service, or explicit `from` |

***

## Step 5: Rewrite the delivery-report consumer (Infobip batched arrays → one event per outcome)

Infobip POSTs delivery reports as a **batch** — one HTTP request carries a `results` array with one entry per message outcome. Orbit instead sends one webhook event per outcome, so your handler iterates over one object instead of a list, and signature-verifies a header instead of parsing a batch envelope.

**Infobip (before) — one request, many results:**

```http theme={null}
POST /webhooks/sms HTTP/1.1
Content-Type: application/json

{
  "results": [
    { "messageId": "abc-1", "status": { "name": "DELIVERED" }, "sentAt": "…" },
    { "messageId": "abc-2", "status": { "name": "UNDELIVERED" }, "sentAt": "…" },
    { "messageId": "abc-3", "status": { "name": "DELIVERED" }, "sentAt": "…" }
  ]
}
```

**Orbit (after) — one request per outcome; verify the signature header:**

```http theme={null}
POST /webhooks/sms HTTP/1.1
X-Orbit-Signature: sha256=…
Content-Type: application/json

{
  "id": "evt_msg_001",
  "type": "message.delivered",
  "created_at": "2026-03-08T12:00:00Z",
  "data": {
    "message_id": "msg_abc123",
    "channel": "sms",
    "from": "+14155551234",
    "to": "+14155552671",
    "status": "delivered"
  }
}
```

```javascript theme={null}
// Infobip (before)
const valid = infobipSignatureCheck(req.headers['x-infobip-signature'])
for (const result of body.results) {
  handleStatus(result.messageId, result.status.name)
}

// Orbit (after)
import { verifyWebhookSignature } from '@devotel-orbit/node'
const valid = verifyWebhookSignature(rawBody, req.headers['x-orbit-signature'], 'whsec_your_secret')
handleStatus(body.data.message_id, body.data.status)
```

See the full event catalogue in [Webhook Events](/guides/webhook-event-catalog) and the signature recipe in [Webhook Signature Verification](/guides/webhook-signature-verify-polyglot).

***

## Step 6: Re-register your WhatsApp sender

WhatsApp Business senders must be re-registered under the Orbit WABA integration — you cannot carry the Infobip sender over silently. Follow [WABA setup](/guides/whatsapp/waba-setup), then re-submit your [templates](/guides/whatsapp/templates-create-approve) and reload your [24-hour window policy](/guides/whatsapp/24h-window). If you are moving the sender over an existing Meta account, the [WABA migration](/guides/whatsapp/waba-migration) playbook covers the swap without downtime.

***

## Step 7: Replace Infobip Validate / Lookup with Number Intelligence

If you gate sends on Infobip's "Validate" or "Lookup" services, switch those checks to Orbit's lookup endpoint — same inputs, same HLR/MNP/risk signal, run inside your own tenant.

```javascript theme={null}
// Infobip (before)
// POST /number-validation/2/validate  { phoneNumbers: ["+14155552671"] }

// Orbit (after)
const { data } = await orbit.numbers.lookup('+14155552671')
if (!data.valid) throw new Error('unreachable')
```

See [Number lookup](/numbers/lookup) for the lookup formats and cached-result behaviour, and the dashboard view in [Number Intelligence](/guides/number-intelligence-dashboard).

***

## Step 8: Swap Verify/OTP (if applicable)

```javascript theme={null}
// Infobip (before)
await infobip.verify2fa.create({ to: '+14155552671', channel: 'sms' })

// Orbit (after)
const verification = await orbit.verify.send('+14155552671', 'sms')
const result = await orbit.verify.check({
  verification_id: verification.data.verification_id,
  code: '123456',
})
```

See [Verify in 30 minutes](/guides/verify-in-30-min) for the full setup.

***

## Step 9: Rebuild Moments flows and Answers bots in Orbit (optional)

* **Moments (customer flows)** → [Flows](/flows/overview). Recreate the visual flow in the drag-and-drop builder and point your campaign entry at the new flow id.
* **Answers (chatbot)** → [Agents](/agents). Define the agent's prompt + channels (SMS/WhatsApp/voice) and route inbound messages to it — the [AI-agent rollout pipeline](/guides/ai-agent-rollout-pipeline) guide covers the safe rollout sequence.

***

## Migration Checklist

* [ ] Create Orbit account and generate API keys
* [ ] Replace Infobip base-URL + API-key auth with the single `X-API-Key` header
* [ ] Port numbers or purchase new ones
* [ ] Create a Messaging Service and note its id
* [ ] Install the Orbit SDK (`npm install @devotel-orbit/node`)
* [ ] Swap the SMS payload to `POST /api/v1/messages`
* [ ] Rewrite the DLR consumer from a batched-array handler to a single-event handler
* [ ] Re-register the WhatsApp sender and templates under WABA
* [ ] Swap number-validation calls to the lookup endpoint
* [ ] Swap Verify/OTP if applicable
* [ ] Rebuild Moments flows and Answers bots in Flows / Agents if applicable
* [ ] Update monitoring and alerting on the new webhooks
* [ ] Run parallel sends (Infobip and Orbit side by side)
* [ ] Decommission the Infobip integration

***

## Parallel Running Strategy

Run Infobip and Orbit in parallel while you cut over:

1. **Phase 1 (Week 1–2):** send 10% of traffic through Orbit, 90% through Infobip
2. **Phase 2 (Week 3–4):** split 50/50 and compare delivery rates and callback handling
3. **Phase 3 (Week 5):** route 100% through Orbit, keep Infobip as a fallback webhook sink
4. **Phase 4 (Week 6+):** decommission the Infobip integration and cancel the account

<Tip>
  Need help with your migration? Our solutions team offers free migration support for customers moving from Infobip. Contact [migrate@devotel.io](mailto:migrate@devotel.io).
</Tip>
