# Migracja SMS z Infobip

Ta strona mapuje SMS API, Blocklist i raporty doręczeń z Infobip na Bird. Postępuj zgodnie z [głównym przewodnikiem migracji](/docs/guides/sms/migrate) po kolei i użyj tych mapowań w krokach 3, 4 i 5.

Dwie różnice robią większość pracy. Payload Infobip jest zbudowany pod wysyłkę masową, więc jedna wiadomość do jednej osoby to tablica wiadomości, z których każda zawiera tablicę odbiorców, a treść jest dwa poziomy niżej w `content.text`; [`POST /v1/sms/messages`](/docs/api/reference/create-sms-message) przyjmuje `from`, `to` i `text` na najwyższym poziomie. Twój base URL w Infobip jest spersonalizowany per konto, w formacie `xxxxx.api.infobip.com`, uwierzytelniany przez `Authorization: App <key>`. Bird wysyła z hosta regionalnego z kluczem bearer, więc host w Twoim kodzie zmienia się jednocześnie ze strukturą payloadu.

## Przekaż to swojemu agentowi

Użyj tego opisu w swoim agencie kodującym. Zaczyna się od rozpoznania i tworzy plan migracji do przejrzenia, zanim cokolwiek zmieni się na produkcji.

```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.
```

## Zmapuj wywołanie wysyłki

Tabela przemapowań jest krótka, bo to zmiana struktury stanowi właściwą pracę:

| Co robi                | Infobip                             | Bird                                                                   |
| ---------------------- | ----------------------------------- | ---------------------------------------------------------------------- |
| Odbiorca               | `messages[].destinations[].to`      | `to` (jeden na żądanie)                                                |
| Nadawca                | `messages[].sender`                 | `from`                                                                 |
| Treść                  | `messages[].content.text`           | `text`                                                                 |
| Cel                    | (brak)                              | `category`, wymagane przy dowolnym tekście                             |
| Raporty doręczeń       | `webhooks.delivery`, per wiadomość  | webhook obszaru roboczego subskrybowany na poniższe zdarzenia doręczeń |
| Kontekst dwukierunkowy | `webhooks.callbackData`             | `metadata`, ale zobacz uwagę o rozmiarze poniżej                       |
| Grupowanie kampanii    | `options.campaignReferenceId`       | `tags`, tylko do filtrowania; zobacz poniżej                           |
| Flash                  | `options.flash`                     | brak odpowiednika                                                      |
| Ważność                | `options.validityPeriod`            | brak odpowiednika: `validity_period` jest odrzucane                    |
| Okno doręczenia        | `options.deliveryTimeWindow`        | brak odpowiednika                                                      |
| Bezpieczne ponowienia  | (brak w ich generowanych klientach) | nagłówek `Idempotency-Key`                                             |

Uwagi do portowania:

- **Trzy poziomy znikają.** Zagnieżdżenie istnieje, żeby przenosić wiele wiadomości i wiele odbiorców w jednym żądaniu. Przy wysyłce jednej wiadomości do jednej osoby Bird przyjmuje trzy pola na najwyższym poziomie, więc builder składający tablice jest usuwany, a nie tłumaczony.
- **`callbackData` jest większe niż `metadata`.** Infobip akceptuje do 4000 znaków i zwraca je w raporcie doręczenia. `metadata` w Bird jest ograniczone do 2 KB po serializacji i jest dołączane do każdego zdarzenia dla wiadomości, nie tylko do końcowego. Echo jest lepszą opcją; limit nie, więc wszystko zbliżające się do limitu trzeba przyciąć do klucza, po którym można wyszukać dane, zamiast przenosić je w całości.
- **`campaignReferenceId` to kontekst raportowy, nie migracja kampanii.** `tags` w Bird to pary `{name, value}`, które stają się wymiarami zapytań, więc możesz rozkładać analitykę po kampaniach tak jak dotychczas. Nie wiąże się z nimi jednak obiekt kampanii: tag nie tworzy ani nie konfiguruje broadcastu. Oceń [workflow kampanii](/products/sms/marketing/campaigns) osobno, gdy przenosisz kampanie do grup odbiorców.
- **`campaignReferenceId` nie jest kluczem idempotentności.** Infobip definiuje go jako ID do śledzenia wyników kampanii, więc grupuje, ale nie deduplikuje. Jeśli polegałeś na nim, żeby zabezpieczyć ponowne wysyłki, nie byłeś chroniony; to nagłówek `Idempotency-Key` spełnia tę rolę tutaj.
- **Nic nie odpowiada `category`.** Opcje wiadomości Infobip obejmują ważność, okno doręczenia, flash i ustawienia regionalne, ale żadna z nich nie deklaruje, dlaczego wiadomość jest wysyłana. Zdecyduj per typ wiadomości, czy to `transactional`, `marketing`, `authentication`, czy `service`.
- **Dwa pola opcji nie mają odpowiednika.** `validityPeriod` jest [zarezerwowane](/docs/guides/sms/sending-sms#reserved-fields) i odpowiada na `422 SMSUnsupportedFeature`; `deliveryTimeWindow` nie ma odpowiednika, więc okna harmonogramu przenieś do własnego dispatchera.

## Przenieś rezygnacje

Infobip prowadzi **Blocklist**: listę odbiorców, którzy zrezygnowali z Twojej komunikacji, zarządzaną przez API Blocklist lub przez People w interfejsie webowym, z odmową wysyłki do każdego, kto się na niej znajduje. Wyzwalacze słów kluczowych dodają do niej automatycznie, więc subskrybent wysyłający `STOP` trafia tam bez udziału Twojej aplikacji.

To sprawia, że eksport jest najłatwiejszy ze wszystkich dostawców w tym zestawie, a rozszerzenie największe. **Wpis Blocklist to jeden subskrybent dla całego konta; suppression Bird to para nadawca-subskrybent.** Każdy wpis staje się więc tyloma suppressions, ilu masz nadawców: tysiąc wpisów Blocklist i sześciu nadawców to sześć tysięcy rekordów. Oblicz mnożnik przed rozpoczęciem, bo to różnica między importem trwającym minutę a takim, który wymaga batchowania i logu postępu.

Zachowaj pierwotny zakres Blocklist. Nie zawężaj wycofania zgody podczas migracji tylko dlatego, że nowy model techniczny pozwala wyrażać węższe pary. Preferencja na poziomie obszaru roboczego może reprezentować szersze żądanie; to oddzielny właściciel od suppressions nadawcy. Sprawdź oba przy podejmowaniu decyzji o kwalifikowalności.

Importuj przez [pętlę suppressions](/docs/guides/sms/migrate#4-carry-over-your-opt-out-list). [Odczyt i zarządzanie suppressions](/docs/guides/sms/opt-outs-and-keywords#reading-and-managing-suppressions) zawiera komendę i wyjaśnienie, dlaczego ręczne suppression blokuje każdą kategorię, w tym transakcyjną.

Na tym etapie Bird sam odpowiada na słowa kluczowe stop z własnego katalogu per kraj, więc wyzwalacze słów kluczowych, które skonfigurowałeś, nie mają odpowiednika do odtworzenia, a niestandardowe stają się [regułami słów kluczowych](/docs/guides/sms/opt-outs-and-keywords#campaign-keywords). Powody kumulują się zamiast łączyć, więc para zaimportowana jako `manual`, która później wyśle `STOP`, ma dwa rekordy, a wiadomości pozostają zablokowane, dopóki oba się nie zakończą.

## Przetłumacz statusy doręczeń

Użyj tej tabeli do porównania koncepcji cyklu życia, nie do mechanicznego przemianowywania zdarzeń. Bird wybiera zdarzenie błędu na podstawie zgłoszonego statusu i powodu. Odrzucone żądanie API nie tworzy wiadomości; odrzucenie po akceptacji może wygenerować `sms.rejected`, w tym odrzucenie przez operatora. Brak dowodu doręczenia pozostaje nieznany. Zachowaj surowy status i kod dostawcy obok znormalizowanego wyniku.

Infobip raportuje grupę statusu i nazwę statusu w każdym raporcie doręczenia, a Bird emituje typ zdarzenia:

| Wynik                           | Grupa statusu Infobip | Bird              |
| ------------------------------- | --------------------- | ----------------- |
| API zaakceptował wiadomość      | `PENDING`             | `sms.accepted`    |
| Przekazano operatorowi          | `PENDING`             | `sms.sent`        |
| Operator potwierdził doręczenie | `DELIVERED`           | `sms.delivered`   |
| Operator zgłosił niedoręczenie  | `UNDELIVERABLE`       | `sms.undelivered` |
| Trwały błąd                     | `REJECTED`            | `sms.failed`      |
| Odrzucono przed wysłaniem       | `REJECTED`            | `sms.rejected`    |
| Upłynęło okno ważności          | `EXPIRED`             | `sms.expired`     |

`EXPIRED` to wiersz, który trzeba przeczytać uważnie, bo obejmuje dwie różne rzeczy po ich stronie, a tutaj istnieje tylko jedna z nich. Infobip wygasza wiadomość albo gdy upłynie okres ważności ich platformy, domyślnie 48 godzin, albo gdy operator zwróci expired jako status końcowy. Bird nie ustawia własnego okna ważności i nie uruchamia żadnego timera kończącego wiadomość, więc `sms.expired` pochodzi wyłącznie z potwierdzenia doręczenia od operatora. Połowa raportowana przez operatora mapuje się wprost; połowa z timera platformy nie ma odpowiednika, a wiadomość, która wygasłaby na ich zegarze, tutaj pozostaje w locie, dopóki operator nie zdecyduje.

`REJECTED` pojawia się dwa razy celowo. Infobip używa go zarówno dla wiadomości odrzuconej przez siebie, jak i dla takiej, którą operator zwrócił jako odrzuconą, co odpowiada zdarzeniom Bird wybranym na podstawie wyniku przetwarzania lub operatora i jego powodu; odrzucenie przez operatora może wygenerować `sms.rejected`. Nazwa statusu wewnątrz grupy jest tym, co je rozróżnia, więc handler rozgałęziający się tylko po grupie potrzebuje tu nazwy. `PENDING` również obejmuje dwa wiersze, bo to grupa, w której wiadomość się znajduje od akceptacji aż do nadejścia końcowego raportu.

Trzy mechanizmy zmieniają się wraz z nazwami:

- **Subskrypcje zastępują webhooki per wiadomość.** Infobip wskazuje webhook przy każdej wiadomości, więc cel wybiera ten, kto pisze wywołanie, a typ zawartości jest wybierany razem z nim. Bird dostarcza JSON do endpointów zarejestrowanych w Twoim obszarze roboczym, z których każdy subskrybuje wybrane typy zdarzeń, więc drugi konsument to druga subskrypcja, a nie zmiana w każdym miejscu wywołania.
- **Tracisz wybór per wiadomość, w tym XML.** Infobip pozwala wiadomości wybrać JSON lub XML i dołączyć do 4000 znaków danych callback. Bird wysyła wyłącznie JSON, a `callbackData` staje się `metadata`, które jest dołączane do każdego zdarzenia dla tej wiadomości, nie tylko do raportu.
- **Pull staje się push.** Infobip pozwala pobierać raporty z endpointu reports oraz je otrzymywać. Bird nie ma odpowiednika pollowania zdarzeń; subskrybuj i odczytuj stan wiadomości przez API, gdy potrzebujesz go na żądanie.

Zarejestruj endpoint raz, podając typy zdarzeń, których oczekuje Twój handler: powyższe zdarzenia `sms.*` to lista do subskrypcji i nie ma wildcardu, który je zastępuje. Bird wysyła JSON podpisane zgodnie ze [Standard Webhooks](https://www.standardwebhooks.com); [Utwórz endpoint](/docs/guides/webhooks#create-an-endpoint) zawiera komendę i jedną rzecz, którą trzeba zrobić dobrze przy pierwszym wywołaniu: zapisanie sekretu podpisu, który odpowiedź pokazuje dokładnie raz.

Bird raportuje błąd ze standaryzowanym kodem `error`, takim jak `invalid_destination`, `content_rejected`, `provider_unavailable` lub `recipient_opted_out`; pełna lista jest na [stronie zdarzeń](/docs/guides/sms/events#failure-events). Mapuj swoje alerty na te kody zamiast na numeryczne pary grupy i nazwy Infobip.

## Przełączenie

[Destinations](/docs/guides/sms/migrate#1-enable-your-destination-countries), [nadawcy](/docs/guides/sms/migrate#2-set-up-a-sender) i [rampa ruchu](/docs/guides/sms/migrate#6-test-against-simulated-destinations) są niezależne od dostawcy i opisane w głównym przewodniku. Trzy elementy specyficzne dla Infobip należą do planu przełączenia.

**Host się zmienia i to konfiguracja, nie kod.** Twój base URL w Infobip jest wydawany per konto; Bird wysyła z hosta regionalnego wybranego przy tworzeniu Twojego obszaru roboczego. Znajdź każde miejsce, gdzie ten host jest ustawiony, przed przełączeniem, w tym zmienne środowiskowe, menedżery sekretów i manifesty wdrożeniowe, bo pominięty wpis powoduje błąd w runtime, nie przy budowaniu.

Twoja marka i kampania 10DLC są zarejestrowane w The Campaign Registry przez API rejestracji numerów Infobip i nie stają się automatycznie rejestracjami Bird. Potwierdź odpowiednią procedurę migracji lub rejestracji przed zleceniem płatnej pracy. Zacznij od [Register for 10DLC](/docs/guides/sms/10dlc): opisuje, co oznacza każde pole, jakie typy podmiotów rozpoznaje rejestr i jakie wywołanie requirements mówi, co dostarczyć, zanim utworzysz markę, czyli krok płatny.

Numery posiadane w Infobip wymagają portu, który organizuje wsparcie, według własnego harmonogramu, nie Twojego.

## Kolejne kroki

- [Porównanie Bird i Infobip dla SMS](/products/sms/compare/bird-vs-infobip): ocena produktu i kwestie migracyjne

- [Wysyłanie SMS](/docs/guides/sms/sending-sms): pełny payload, na który portujesz
- [Rezygnacje i słowa kluczowe](/docs/guides/sms/opt-outs-and-keywords): pokrycie słów kluczowych per kraj i zarządzanie suppressions
- [Zdarzenia SMS](/docs/guides/sms/events): słownik zdarzeń, na który przechodzi Twój handler raportów
- [Webhooks i zdarzenia](/docs/guides/webhooks): konfiguracja endpointu i weryfikacja 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)
