# Migracja Verify z Twilio

Ta strona mapuje Twilio Verify v2 na Bird Verify. Postępuj zgodnie z [głównym przewodnikiem migracji](/docs/guides/verify/migrate) po kolei i użyj tych mapowań w krokach 1 i 3.

Service to element bez odpowiednika. Twilio adresuje `POST https://verify.twilio.com/v2/Services/{ServiceSid}/Verifications`, a Service przechowuje długość kodu, TTL, lookup, obsługę linii stacjonarnych i limity żądań. Bird adresuje [`POST /v1/verify/verifications`](/docs/api/reference/create-verification) bez segmentu service: te ustawienia należą do Twojego obszaru roboczego, a nie do identyfikatora w ścieżce. Wiele Service ID nie ma odpowiednika w ramach jednego obszaru roboczego i nie można wybrać konfiguracji per żądanie.

## Przekaż to swojemu agentowi

Wklej to do Claude Code, Cursor lub Codex. Agent przetwarza tę stronę w kontekście Twojego repozytorium, korzystając z dowolnej powierzchni Bird, którą już ma: serwera MCP, jeśli jest podłączony, lub CLI, jeśli jest zainstalowany i zalogowany.

```text
I am moving a phone verification integration from Twilio Verify to Bird Verify. Route through it with me.
1. Check what you already have before setting anything up. If Bird's MCP server is connected, use its tools. If the Bird CLI is installed and signed in, use that. Either one is enough, and every step below is an action you take with whichever you have. Only if neither is present, follow https://bird.com/docs/ai/set-up-your-agent.md to set one up and sign me in. Every Bird docs page serves Markdown at its own URL with `.md` appended, so fetch that rather than the HTML.
2. Read https://bird.com/docs/guides/verify/migrate/twilio.md for the create, check and status mapping, and https://bird.com/docs/guides/verify/migrate.md for the order the steps go in.
3. Find and list my Twilio Verify usage in this repository before you change anything: the Verifications and VerificationCheck call sites, every Service SID they name and what each Service is configured with, and any place I read a verification status. Bird has no Service segment and no per-request configuration selection, so tell me if I use more than one Service and what differs between them.
4. Tell me early which of these I depend on. Bird Verify has no voice channel and no silent or network-based authentication. It generates the code itself and never returns it, so I cannot supply my own. It accepts `options.language` but no per-request template or message body. Bird can use an existing SMS Sender ID or a connected WhatsApp number with an approved authentication template, configured per channel or country rather than per request; tell me whether my current sender can be kept. Twilio's Service holds code length, TTL, lookup, landline handling and rate limits; on Bird those belong to the workspace rather than to an ID in the path, so tell me which of my Service settings have no home.
5. Configure my channels and destinations following https://bird.com/docs/guides/verify/countries.md and https://bird.com/docs/guides/verify/senders.md. While you are there, disable every country I do not actually verify into. An enabled destination I never send to is not reach, it is exposure to SMS pumping, so ask me which countries I serve rather than leaving the defaults.
6. Port the create and check calls using the mapping tables on the provider page, and move my status handling to Bird's events: https://bird.com/docs/guides/verify/sending-verifications.md and https://bird.com/docs/guides/verify/events.md.
7. Cut over at the create call, not all at once, because a code issued by Twilio Verify cannot be checked by Bird and a code issued by Bird cannot be checked by Twilio Verify. From the moment I say go, send every NEW verification to Bird, and keep routing each check to whichever provider issued that verification. Keep both paths live for one full code lifetime plus margin, then retire the old one. Tell me how you will decide which provider issued a given verification before you write any of it.
8. Test before any real traffic. Bird Verify has no simulated recipients, so do not look for a sandbox: the thing worth testing is the code arriving. Run the integration against a phone number and a mailbox I control, on each channel I enabled, and show me what arrived on each one.
9. Stop and ask me wherever a step needs a decision. Do not start routing new verifications to Bird until I have seen those test results and replied with the words cut over to Bird. Retiring the Twilio Verify path is a separate step: ask me again and wait for me to reply with the words retire the Twilio Verify path, and do not retire it while any code it issued could still be checked. A reply that agrees without naming what it is authorising is not authorisation. Finish by telling me what is left that only a person can do.
```

## Zmapuj wywołanie create

| Co robi                  | Twilio Verify                                               | Bird                                                                                                        |
| ------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Odbiorca                 | `To`                                                        | `to.phone_number` lub `to.email`                                                                            |
| Kanał                    | `Channel`                                                   | `options.channels`, w przeciwnym razie skonfigurowana kolejność dla kraju                                   |
| Długość kodu             | Service `CodeLength`                                        | `options.code_length`, w przeciwnym razie domyślna wartość obszaru roboczego                                |
| Czas życia kodu          | Service TTL                                                 | ustawienie **Duration** obszaru roboczego                                                                   |
| Limit prób               | Service max attempts                                        | ustawienie **Maximum Retries** obszaru roboczego                                                            |
| Korelacja                | `Tags`                                                      | `metadata`                                                                                                  |
| Bezpieczne ponowienia    | (brak)                                                      | nagłówek `Idempotency-Key`                                                                                  |
| Własny kod weryfikacyjny | `CustomCode`                                                | brak odpowiednika                                                                                           |
| Lokalizacja              | `Locale`                                                    | `options.language`                                                                                          |
| Treść wiadomości         | `TemplateSid`, `CustomFriendlyName`, `ChannelConfiguration` | brak odpowiednika per żądanie; wybierz zatwierdzony szablon uwierzytelniania WhatsApp w konfiguracji Verify |
| Limity per klucz         | `RateLimits`                                                | stałe ograniczenia platformy                                                                                |
| Kontrola oszustw         | `RiskCheck`, Fraud Guard, `DeviceIp`                        | nieudostępnione w API                                                                                       |
| Autouzupełnianie SMS     | `AppHash`                                                   | brak odpowiednika                                                                                           |
| PSD2                     | `Amount`, `Payee`                                           | brak odpowiednika                                                                                           |

Kanały również nie pokrywają się jeden do jednego:

| Twilio `Channel` | Bird                                                           |
| ---------------- | -------------------------------------------------------------- |
| `sms`            | `sms`                                                          |
| `email`          | `email`                                                        |
| `whatsapp`       | `whatsapp`                                                     |
| `call`           | brak odpowiednika                                              |
| `sna`, `auto`    | brak odpowiednika                                              |
| `rcs`            | brak odpowiednika                                              |
| (brak)           | `telegram`, dostępne dla numerów zarejestrowanych w Telegramie |

Przepływ, który używa `call` jako awaryjnego kanału dostępności, lub `sna` i `auto` jako ścieżki bez kodu, wymaga przemyślenia, zanim ustalisz datę. Wszystko inne to zmiana kolejności kanałów na stronie [**Countries**](https://bird.com/dashboard/w/verify/countries), a nie parametr per żądanie.

## Zmapuj wywołanie check

`POST /v2/Services/{ServiceSid}/VerificationCheck` w Twilio przyjmuje `To` **lub** `VerificationSid` oraz `Code`. [`POST /v1/verify/verifications/check`](/docs/api/reference/create-verification-check) w Bird przyjmuje tylko odbiorcę i kod, więc ścieżka `VerificationSid` znika wraz z kolumną, w której go przechowywałeś. Podaj dokładnie ten zestaw adresów, z którym utworzyłeś weryfikację.

Kształt odpowiedzi różni się tam, gdzie ma to największe znaczenie:

- **Twilio odpowiada polem `status`; Bird odpowiada wartością boolean.** `success: true` oznacza zweryfikowano. `success: false` zawiera `reason` o wartości `incorrect_code`, `expired` lub `attempts_exhausted`, a także `attempts_remaining`, więc wartość "how many tries left", którą być może liczysz samodzielnie, wraca w odpowiedzi.
- **Oba przechodzą do `404`, gdy weryfikacja jest wyczerpana.** Twilio usuwa weryfikację po zatwierdzeniu, wygaśnięciu lub wyczerpaniu prób; Bird przestaje przyjmować sprawdzenia w każdym stanie końcowym. Zapisz pierwszą ostateczną odpowiedź zamiast ponownie sprawdzać.

## Przetłumacz statusy

| Status Twilio          | Status Bird                                       | Powód Bird           |
| ---------------------- | ------------------------------------------------- | -------------------- |
| `pending`              | `pending`                                         | brak                 |
| `approved`             | `verified`                                        | brak                 |
| `max_attempts_reached` | `failed`                                          | `attempts_exhausted` |
| `expired`              | `expired`                                         | `ttl_elapsed`        |
| `canceled`             | brak odpowiednika: weryfikacji nie można anulować |                      |

Nie ma endpointu update, więc wzorzec Twilio polegający na wymuszaniu statusu `approved` lub `canceled` z backendu nie ma odpowiednika. Weryfikacja kończy się, gdy użytkownik ją potwierdzi, wyczerpie próby lub pozwoli jej wygasnąć.

## Przenieś strumień zdarzeń

Twilio Verify raportuje aktywność przez Event Streams: sink plus subskrypcja zdarzeń statusu weryfikacji, konfigurowane poza API Verify. Bird używa tego samego mechanizmu webhooków co każdy inny kanał. Zasubskrybuj endpoint na żądane typy zdarzeń, podając każdy z nich: `verify.verification.created`, `verify.verification.verified` i `verify.verification.failed` dla zdarzeń sesji oraz `verify.attempt.sent`, `verify.attempt.delivered` i `verify.attempt.undelivered` dla poszczególnych dostaw kodów weryfikacyjnych. Nie ma symbolu wieloznacznego, który je zastępuje. Zweryfikuj podpis zgodnie ze [Standard Webhooks](https://www.standardwebhooks.com). Zobacz [zdarzenia Verify](/docs/guides/verify/events).

Te dwie osie mają znaczenie przy przenoszeniu dashboardów. Zdarzenia statusu weryfikacji w Twilio odpowiadają zdarzeniom sesji w Bird, a zdarzenia prób w Bird dodają wyniki dostarczenia per wysyłkę w tej samej sesji, w tym wysyłki wynikające z ponowienia lub przełączenia kanału.

## Przełączenie

[Reguła przełączenia](/docs/guides/verify/migrate#5-cut-over-one-code-lifetime-at-a-time) w głównym przewodniku to ta, wokół której planujesz: kodu wydanego przez Twilio nie można zweryfikować przez Bird, więc przełącz się na wywołaniu create i kieruj sprawdzenia do tego dostawcy, który wydał weryfikację, aż ostatni kod Twilio wygaśnie.

Sprawdź nadawcę przed przełączeniem. Możesz wybrać Bird Verify lub Authifly, użyć zweryfikowanej domeny e-mail, wybrać istniejący Sender ID SMS lub powiązać podłączony numer WhatsApp z zatwierdzonym szablonem uwierzytelniania. Bird nie wybiera spośród puli nadawców. Jeśli zachowasz Sender ID SMS jako domyślną konfigurację, Verify przełącza się na Bird Verify tylko tam, gdzie ten ID nie kwalifikuje się dla danego miejsca docelowego; jawny wybór kraju tego nie robi. Sprawdź, co użytkownicy widzą w każdym kraju, i zaktualizuj skrypty obsługi tam, gdzie to się zmienia.

## Następne kroki

- [Wysyłanie weryfikacji](/docs/guides/verify/sending-verifications): pełny kontrakt dla obu wywołań, statusów i limitów
- [Konfiguracja krajów](/docs/guides/verify/countries): gdzie teraz znajduje się kolejność i dostępność kanałów
- [Nadawcy i branding](/docs/guides/verify/senders): co odbiorca widzi w każdym kanale
- [Zdarzenia Verify](/docs/guides/verify/events): zdarzenia, na które przenosi się Twój konsument Event Streams

## Related resources

- [Verify phone numbers at signup](/learn/series/verify-phone-numbers-at-signup) (video)
- [What does OTP mean? One-time passwords explained](/explained/verify/what-does-otp-mean) (answer)
- [Customer verification](/verify-api) (product)
- [Build your first integration](/learn/paths/integration) (course)

[Get an implementation brief](/learn/workspace?topic=verify)
