# Migrasi SMS dari Infobip

Halaman ini memetakan API SMS Infobip, Blocklist, dan laporan pengiriman ke Bird. Ikuti [panduan migrasi utama](/docs/guides/sms/migrate) secara berurutan dan gunakan pemetaan ini untuk langkah 3, 4, dan 5.

Dua perbedaan menyelesaikan sebagian besar pekerjaan. Payload Infobip dirancang untuk kasus massal, sehingga satu pesan ke satu orang berupa array pesan yang masing-masing berisi array tujuan, dengan isi teks dua level ke bawah di `content.text`; [`POST /v1/sms/messages`](/docs/api/reference/create-sms-message) menerima `from`, `to`, dan `text` di level teratas. Base URL Infobip Anda bersifat personal per akun, dalam format `xxxxx.api.infobip.com`, diautentikasi dengan `Authorization: App <key>`. Bird mengirim dari host regional dengan bearer key, jadi host yang disimpan kode Anda berubah bersamaan dengan bentuk payload.

## Serahkan ini ke agen Anda

Gunakan brief ini di coding agent Anda. Brief ini dimulai dengan penemuan dan menghasilkan rencana migrasi yang dapat ditinjau sebelum perubahan apa pun di produksi.

```text
Help me migrate my SMS integration from Infobip to Bird.
1. Inspect this repository's sends, senders, callbacks, schedules, templates, opt-outs and tests. List the traffic and behavior that must survive the migration.
2. Read the Markdown guides at https://bird.com/docs/guides/sms/migrate/infobip.md and https://bird.com/docs/guides/sms/migrate.md. Use an existing authenticated Bird MCP or CLI connection. If neither is available, follow https://bird.com/docs/ai/set-up-your-agent.md. Discover the actual operations; do not invent commands or ask me to paste credentials into chat.
3. Prepare the code changes, sender/destination requirements, consent migration, webhook verification and rollout/rollback plan. Preserve the scope of each customer's preferences, including requests outside SMS replies. Separate API batches from audience broadcasts and preserve any behavior that has no direct endpoint equivalent.
4. Show me the exact affected resources, destinations, test volume and known costs before an action that sends messages, spends money, registers or changes a sender, or moves production traffic. Require explicit human authorization for each paid submission or production change. Name one-off 10DLC registration and resubmission fees before requesting approval. An existing explicit approval for that exact action is sufficient; broad migration approval is not. Simulated SMS destinations are billable and still require authorization.
5. If I am keeping Infobip numbers, prepare the human support port request and obtain authorization to send it. Read bird support-tickets create --help, then use the available CLI or MCP support operation with the reviewed number list and requirements. Return the ticket ID and follow the reply; support arranges the port on its own schedule, separately from the code cutover.
6. Run local and intercepted tests first. When authorized, perform the agreed bounded integration tests, inspect accepted and final outcomes separately, and report failures or uncertainty. Do not claim a delivery receipt proves reading or that request idempotency guarantees exactly-once delivery.
7. Keep production cutover and retiring the old provider as explicit steps in the approved rollout. Finish with the diff, evidence, unresolved requirements and the next action.
```

## Petakan panggilan kirim

Tabel pemetaan ini pendek karena perubahan bentuk-lah yang menjadi pekerjaan utama:

| Fungsi                 | Infobip                                | Bird                                                          |
| ---------------------- | -------------------------------------- | ------------------------------------------------------------- |
| Penerima               | `messages[].destinations[].to`         | `to` (satu per permintaan)                                    |
| Pengirim               | `messages[].sender`                    | `from`                                                        |
| Isi                    | `messages[].content.text`              | `text`                                                        |
| Intent                 | (tidak ada)                            | `category`, wajib pada teks bebas                             |
| Laporan pengiriman     | `webhooks.delivery`, per pesan         | webhook workspace yang berlangganan event pengiriman di bawah |
| Konteks bolak-balik    | `webhooks.callbackData`                | `metadata`, tetapi lihat catatan ukuran di bawah              |
| Pengelompokan kampanye | `options.campaignReferenceId`          | `tags`, hanya untuk pemfilteran; lihat di bawah               |
| Flash                  | `options.flash`                        | tidak ada padanan                                             |
| Validitas              | `options.validityPeriod`               | tidak ada padanan: `validity_period` ditolak                  |
| Jendela pengiriman     | `options.deliveryTimeWindow`           | tidak ada padanan                                             |
| Coba ulang yang aman   | (tidak ada di generated client mereka) | header `Idempotency-Key`                                      |

Catatan porting:

- **Tiga level menjadi nol.** Nesting ini ada untuk membawa banyak pesan dan banyak tujuan dalam satu permintaan. Untuk mengirim satu pesan ke satu orang, Bird menerima tiga field di level teratas, sehingga builder yang menyusun array dihapus, bukan diterjemahkan.
- **`callbackData` lebih besar dari `metadata`.** Infobip menerima hingga 4.000 karakter dan mengembalikannya pada laporan pengiriman. `metadata` milik Bird dibatasi 2 KB dalam bentuk serial dan disertakan pada setiap event untuk pesan tersebut, bukan hanya pada event terminal. Echo-nya lebih menguntungkan; batasnya tidak, jadi apa pun yang mendekati batas harus dipangkas menjadi kunci yang dapat Anda cari, bukan dibawa utuh.
- **`campaignReferenceId` adalah konteks pelaporan, bukan migrasi kampanye.** `tags` milik Bird adalah pasangan `{name, value}` yang menjadi dimensi kueri, sehingga Anda dapat memotong analitik berdasarkan kampanye seperti sebelumnya. Yang tidak ikut adalah objek kampanye: tag tidak membuat atau mengonfigurasi broadcast. Evaluasi [alur kerja kampanye](/products/sms/marketing/campaigns) secara terpisah saat memindahkan kampanye audiens.
- **`campaignReferenceId` bukan kunci idempotensi.** Infobip mendefinisikannya sebagai ID untuk melacak performa kampanye, jadi ia mengelompokkan tetapi tidak mendeduplikasi. Jika Anda mengandalkannya untuk membuat percobaan ulang aman, Anda tidak terlindungi; header `Idempotency-Key` adalah yang melakukannya di sini.
- **Tidak ada yang berpadanan dengan `category`.** Opsi pesan Infobip mencakup validitas, jendela pengiriman, flash, dan pengaturan regional, dan tidak satu pun menyatakan mengapa pesan dikirim. Tentukan per tipe pesan apakah itu `transactional`, `marketing`, `authentication`, atau `service`.
- **Dua field opsi tidak punya tempat.** `validityPeriod` [dicadangkan](/docs/guides/sms/sending-sms#reserved-fields) dan menjawab `422 SMSUnsupportedFeature`; `deliveryTimeWindow` tidak memiliki padanan, sehingga jendela penjadwalan berpindah ke dispatcher Anda sendiri.

## Pindahkan opt-out

Infobip menyimpan **Blocklist**: daftar penerima yang telah memilih keluar dari komunikasi Anda, dikelola melalui API Blocklist atau melalui People di antarmuka web, dengan pengiriman ke siapa pun di dalamnya ditolak. Trigger kata kunci menambahkan secara otomatis, sehingga pelanggan yang mengirim SMS `STOP` masuk ke sana tanpa aplikasi Anda melakukan apa pun.

Ini menjadikan ekspor paling mudah dari semua penyedia di set ini, dan ekspansinya paling besar. **Satu entri Blocklist adalah satu pelanggan untuk seluruh akun; satu suppression Bird adalah satu pasangan pengirim-dan-pelanggan.** Jadi setiap entri menjadi sebanyak suppression sesuai jumlah pengirim Anda: Blocklist seribu entri dan enam pengirim menghasilkan enam ribu rekaman. Hitung pengalinya sebelum Anda mulai, karena ini adalah perbedaan antara impor yang memakan waktu satu menit dan impor yang membutuhkan batching serta log progres.

Pertahankan cakupan asli Blocklist. Jangan mempersempit pencabutan selama migrasi hanya karena model teknis baru dapat mengekspresikan pasangan yang lebih sempit. Preferensi seluruh workspace dapat mewakili permintaan yang lebih luas; pemiliknya terpisah dari suppression pengirim. Periksa ulang keduanya saat menentukan kelayakan.

Impor melalui [suppression loop](/docs/guides/sms/migrate#4-carry-over-your-opt-out-list). [Membaca dan mengelola suppression](/docs/guides/sms/opt-outs-and-keywords#reading-and-managing-suppressions) berisi perintahnya, dan alasan mengapa suppression manual memblokir setiap kategori termasuk transaksional.

Setelah Anda di sini, Bird menjawab kata kunci stop sendiri dari katalognya per negara, sehingga trigger kata kunci yang Anda konfigurasikan tidak memiliki padanan untuk dibangun ulang, dan yang kustom menjadi [aturan kata kunci](/docs/guides/sms/opt-outs-and-keywords#campaign-keywords). Alasan bertumpuk, bukan bergabung, sehingga pasangan yang Anda impor sebagai `manual` yang kemudian mengirim SMS `STOP` menyimpan dua rekaman, dan pesan tetap dihentikan sampai keduanya berakhir.

## Terjemahkan status pengiriman

Gunakan tabel ini untuk membandingkan konsep siklus hidup, bukan untuk mengganti nama event secara mekanis. Bird memilih event kegagalan dari status dan alasan yang dilaporkan. Permintaan API yang ditolak tidak membuat pesan; penolakan setelah penerimaan dapat menghasilkan `sms.rejected`, termasuk penolakan operator. Bukti pengiriman yang hilang tetap unknown. Simpan status dan kode mentah penyedia di samping hasil yang telah Anda normalkan.

Infobip melaporkan status group dan status name pada setiap laporan pengiriman, dan Bird mengeluarkan event type:

| Hasil                              | Infobip status group | Bird              |
| ---------------------------------- | -------------------- | ----------------- |
| API menerima pesan                 | `PENDING`            | `sms.accepted`    |
| Diserahkan ke operator             | `PENDING`            | `sms.sent`        |
| Operator mengonfirmasi pengiriman  | `DELIVERED`          | `sms.delivered`   |
| Operator melaporkan tidak terkirim | `UNDELIVERABLE`      | `sms.undelivered` |
| Kegagalan permanen                 | `REJECTED`           | `sms.failed`      |
| Ditolak sebelum dikirim            | `REJECTED`           | `sms.rejected`    |
| Jendela validitas habis            | `EXPIRED`            | `sms.expired`     |

`EXPIRED` adalah baris yang perlu dibaca dengan cermat, karena mencakup dua hal berbeda di sisi mereka dan hanya satu yang ada di sini. Infobip mengekspirasi pesan baik ketika periode validitas platform mereka habis, yang default-nya 48 jam, atau ketika operator mengembalikan expired sebagai status akhir. Bird tidak menetapkan jendela validitas sendiri dan tidak menjalankan timer yang mengakhiri pesan, sehingga `sms.expired` hanya datang dari tanda terima pengiriman operator. Bagian yang dilaporkan operator terpetakan; bagian timer platform tidak memiliki padanan, dan pesan yang seharusnya kedaluwarsa di jam mereka tetap dalam penerbangan di sini sampai operator memutuskan.

`REJECTED` muncul dua kali dengan sengaja. Infobip menggunakannya baik untuk pesan yang ditolak sendiri maupun untuk pesan yang dikembalikan operator sebagai rejected, yang merupakan event Bird yang dipilih dari hasil pemrosesan atau operator beserta alasannya; penolakan operator dapat menghasilkan `sms.rejected`. Status name di dalam group-lah yang membedakannya, sehingga handler yang bercabang hanya berdasarkan group memerlukan name begitu berada di sini. `PENDING` juga mencakup dua baris, karena ini adalah group tempat pesan berada sejak penerimaan hingga laporan terminal tiba.

Tiga mekanisme berubah bersama namanya:

- **Subscription menggantikan webhook per pesan.** Infobip menamai webhook pada setiap pesan, sehingga tujuan dipilih oleh siapa pun yang menulis panggilan, dan tipe konten dipilih bersamanya. Bird mengirimkan JSON ke endpoint yang didaftarkan workspace Anda, masing-masing berlangganan tipe event yang diinginkan, sehingga konsumen kedua adalah subscription kedua, bukan perubahan di setiap call site.
- **Anda kehilangan pilihan per pesan, termasuk XML.** Infobip memungkinkan pesan memilih JSON atau XML dan melampirkan hingga 4.000 karakter data callback. Bird mengirimkan JSON saja, dan `callbackData` menjadi `metadata`, yang disertakan pada setiap event untuk pesan tersebut, bukan hanya pada laporan.
- **Pull menjadi push.** Infobip memungkinkan Anda mengambil laporan dari endpoint reports maupun menerimanya. Bird tidak memiliki padanan poll untuk event; berlangganan, dan baca status pesan melalui API saat Anda membutuhkannya secara on-demand.

Daftarkan endpoint sekali, dengan menyebutkan tipe event yang diinginkan handler Anda: event `sms.*` di atas adalah daftar yang harus Anda langgani, dan tidak ada wildcard yang menggantikannya. Bird mengirimkan JSON yang ditandatangani sesuai [Standard Webhooks](https://www.standardwebhooks.com); [Buat endpoint](/docs/guides/webhooks#create-an-endpoint) berisi perintahnya dan satu hal yang harus benar pada panggilan pertama, yaitu menyimpan signing secret yang ditampilkan respons tepat satu kali.

Bird melaporkan kegagalan dengan kode `error` standar seperti `invalid_destination`, `content_rejected`, `provider_unavailable`, atau `recipient_opted_out`; daftar lengkapnya ada di [halaman event](/docs/guides/sms/events#failure-events). Petakan alerting Anda ke kode tersebut, bukan ke pasangan group dan name numerik Infobip.

## Cutover

[Tujuan](/docs/guides/sms/migrate#1-enable-your-destination-countries), [pengirim](/docs/guides/sms/migrate#2-set-up-a-sender), dan [ramp trafik](/docs/guides/sms/migrate#6-test-against-simulated-destinations) bersifat independen dari penyedia dan dibahas di panduan utama. Tiga item spesifik Infobip perlu masuk dalam rencana cutover.

**Host berpindah, dan ini adalah konfigurasi, bukan kode.** Base URL Infobip Anda diterbitkan per akun; Bird mengirim dari host regional yang dipilih saat workspace Anda dibuat. Temukan setiap tempat host tersebut diatur sebelum cutover, termasuk environment variable, secrets manager, dan deploy manifest, karena yang terlewat akan gagal saat runtime, bukan saat build.

Brand dan kampanye 10DLC Anda terdaftar di The Campaign Registry melalui API pendaftaran nomor Infobip dan tidak otomatis menjadi registrasi Bird. Konfirmasi prosedur migrasi atau registrasi yang berlaku sebelum mengirimkan pekerjaan berbayar. Mulai dari [Daftar untuk 10DLC](/docs/guides/sms/10dlc): halaman ini menjelaskan arti setiap field, tipe entitas yang dikenali registry, dan panggilan requirements yang memberi tahu apa yang harus Anda siapkan sebelum membuat brand, yang merupakan langkah berbayar.

Nomor yang Anda miliki di Infobip memerlukan port yang diatur oleh dukungan, sesuai jadwal mereka, bukan jadwal Anda.

## Langkah selanjutnya

- [Bandingkan Bird dan Infobip untuk SMS](/products/sms/compare/bird-vs-infobip): evaluasi produk dan pertimbangan migrasi

- [Mengirim SMS](/docs/guides/sms/sending-sms): payload tujuan porting Anda, secara lengkap
- [Opt-out dan kata kunci](/docs/guides/sms/opt-outs-and-keywords): cakupan kata kunci per negara dan manajemen suppression
- [Event SMS](/docs/guides/sms/events): kosakata event tujuan handler laporan Anda berpindah
- [Webhooks & events](/docs/guides/webhooks): pengaturan endpoint dan verifikasi Standard Webhooks

## Related resources

- [Choose a sender for your markets](/explained/sms/which-sms-sender-type-should-i-use) (answer)
- [Check your message segments](/tools/sms-segment-calculator) (tool)
- [Compare SMS providers](/products/sms/compare) (product)
