# Migrasi Verify dari Twilio

Halaman ini memetakan Twilio Verify v2 ke Bird Verify. Ikuti [panduan migrasi utama](/docs/guides/verify/migrate) secara berurutan dan gunakan pemetaan ini untuk langkah 1 dan 3.

Service adalah bagian yang tidak memiliki padanan. Twilio mengalamatkan `POST https://verify.twilio.com/v2/Services/{ServiceSid}/Verifications`, dan Service menyimpan panjang kode, TTL, lookup, penanganan telepon rumah, dan pembatasan laju permintaan. Bird mengalamatkan [`POST /v1/verify/verifications`](/docs/api/reference/create-verification) tanpa segmen service: pengaturan tersebut berada di workspace Anda, bukan di ID pada path. Beberapa Service ID tidak memiliki padanan dalam satu workspace, dan Anda tidak dapat memilih konfigurasi per permintaan.

## Serahkan ini ke agen Anda

Tempel ini ke Claude Code, Cursor, atau Codex. Agen akan mengerjakan halaman ini terhadap repositori Anda sendiri, menggunakan antarmuka Bird yang sudah tersedia: MCP server jika sudah terhubung, atau CLI jika sudah terpasang dan login.

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

## Petakan panggilan create

| Fungsi                 | Twilio Verify                                               | Bird                                                                                                       |
| ---------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| Penerima               | `To`                                                        | `to.phone_number` atau `to.email`                                                                          |
| Channel                | `Channel`                                                   | `options.channels`, jika tidak mengikuti urutan yang dikonfigurasi per negara                              |
| Panjang kode           | Service `CodeLength`                                        | `options.code_length`, jika tidak mengikuti default workspace                                              |
| Masa berlaku kode      | Service TTL                                                 | pengaturan **Duration** di workspace                                                                       |
| Batas percobaan        | Service max attempts                                        | pengaturan **Maximum Retries** di workspace                                                                |
| Korelasi               | `Tags`                                                      | `metadata`                                                                                                 |
| Percobaan ulang aman   | (tidak ada)                                                 | header `Idempotency-Key`                                                                                   |
| Kode verifikasi kustom | `CustomCode`                                                | tidak ada padanan                                                                                          |
| Lokalisasi             | `Locale`                                                    | `options.language`                                                                                         |
| Konten pesan           | `TemplateSid`, `CustomFriendlyName`, `ChannelConfiguration` | tidak ada padanan per permintaan; pilih template autentikasi WhatsApp yang disetujui di konfigurasi Verify |
| Throttle per kunci     | `RateLimits`                                                | batas tetap dari platform                                                                                  |
| Kontrol penipuan       | `RiskCheck`, Fraud Guard, `DeviceIp`                        | tidak diekspos di API                                                                                      |
| Autofill SMS           | `AppHash`                                                   | tidak ada padanan                                                                                          |
| PSD2                   | `Amount`, `Payee`                                           | tidak ada padanan                                                                                          |

Channel juga tidak berpasangan satu-satu:

| Twilio `Channel` | Bird                                                        |
| ---------------- | ----------------------------------------------------------- |
| `sms`            | `sms`                                                       |
| `email`          | `email`                                                     |
| `whatsapp`       | `whatsapp`                                                  |
| `call`           | tidak ada padanan                                           |
| `sna`, `auto`    | tidak ada padanan                                           |
| `rcs`            | tidak ada padanan                                           |
| (tidak ada)      | `telegram`, tersedia untuk nomor yang terdaftar di Telegram |

Alur yang menggunakan `call` sebagai fallback aksesibilitas, atau `sna` dan `auto` untuk jalur tanpa kode, perlu dirancang ulang sebelum Anda menetapkan tanggal. Yang lainnya adalah perubahan urutan channel di halaman [**Countries**](https://bird.com/dashboard/w/verify/countries), bukan parameter per permintaan.

## Petakan panggilan check

`POST /v2/Services/{ServiceSid}/VerificationCheck` Twilio menerima `To` **atau** `VerificationSid`, ditambah `Code`. [`POST /v1/verify/verifications/check`](/docs/api/reference/create-verification-check) Bird hanya menerima penerima dan kode, sehingga jalur `VerificationSid` hilang bersama kolom tempat Anda menyimpannya. Berikan tepat set alamat yang Anda gunakan saat membuat verifikasi.

Bentuk respons berbeda pada bagian yang paling penting:

- **Twilio menjawab dengan field `status`; Bird menjawab dengan boolean.** `success: true` berarti terverifikasi. `success: false` membawa `reason` berupa `incorrect_code`, `expired`, atau `attempts_exhausted`, ditambah `attempts_remaining`, sehingga angka "how many tries left" yang mungkin Anda hitung sendiri dikembalikan dalam respons.
- **Keduanya menjadi `404` setelah verifikasi selesai.** Twilio menghapus verifikasi saat disetujui, kedaluwarsa, atau kehabisan percobaan; Bird berhenti menerima pengecekan dalam status final apa pun. Simpan jawaban definitif pertama, jangan periksa ulang.

## Terjemahkan status

| Status Twilio          | Status Bird                                          | Alasan Bird          |
| ---------------------- | ---------------------------------------------------- | -------------------- |
| `pending`              | `pending`                                            | tidak ada            |
| `approved`             | `verified`                                           | tidak ada            |
| `max_attempts_reached` | `failed`                                             | `attempts_exhausted` |
| `expired`              | `expired`                                            | `ttl_elapsed`        |
| `canceled`             | tidak ada padanan: verifikasi tidak dapat dibatalkan |                      |

Tidak ada endpoint update, sehingga pola Twilio yang memaksa verifikasi ke `approved` atau `canceled` dari backend Anda tidak memiliki padanan. Verifikasi berakhir saat pengguna memverifikasinya, menghabiskan percobaan, atau membiarkannya kedaluwarsa.

## Pindahkan event stream

Twilio Verify melaporkan aktivitas melalui Event Streams: sebuah sink ditambah subscription ke event status verifikasi, dikonfigurasi di luar API Verify. Bird menggunakan mekanisme webhook yang sama seperti channel lainnya. Subscribe endpoint ke tipe event yang Anda inginkan, sebutkan masing-masing: `verify.verification.created`, `verify.verification.verified` dan `verify.verification.failed` untuk event sesi, serta `verify.attempt.sent`, `verify.attempt.delivered` dan `verify.attempt.undelivered` untuk pengiriman kode verifikasi individual. Tidak ada wildcard yang menggantikan semuanya. Verifikasi tanda tangan sesuai [Standard Webhooks](https://www.standardwebhooks.com). Lihat [Verify events](/docs/guides/verify/events).

Kedua sumbu ini penting saat Anda memindahkan dashboard. Event status verifikasi Twilio sejajar dengan event sesi Bird, dan event percobaan Bird menambahkan hasil pengiriman per pengiriman pada sesi yang sama, termasuk pengiriman yang dihasilkan oleh pengiriman ulang atau failover channel.

## Cutover

[Aturan cutover](/docs/guides/verify/migrate#5-cut-over-one-code-lifetime-at-a-time) di panduan utama adalah yang harus Anda rencanakan: kode yang diterbitkan oleh Twilio tidak dapat diperiksa oleh Bird, jadi alihkan di panggilan create dan tetap arahkan pengecekan ke provider mana pun yang menerbitkan verifikasi tersebut sampai kode Twilio terakhir kedaluwarsa.

Periksa pengirim sebelum cutover. Anda dapat memilih Bird Verify atau Authifly, menggunakan domain email terverifikasi Anda, memilih Sender ID SMS yang sudah ada, atau memasangkan nomor WhatsApp yang terhubung dengan template autentikasi yang disetujui. Bird tidak memilih dari kumpulan pengirim. Jika Anda mempertahankan Sender ID SMS sebagai default konfigurasi, Verify beralih ke Bird Verify hanya jika ID tersebut tidak memenuhi syarat untuk tujuan; pilihan negara eksplisit tidak melakukan hal ini. Pastikan apa yang dilihat pengguna di setiap negara dan perbarui skrip dukungan jika ada perubahan.

## Langkah selanjutnya

- [Mengirim verifikasi](/docs/guides/verify/sending-verifications): kontrak lengkap untuk kedua panggilan, status, dan batas
- [Konfigurasi negara](/docs/guides/verify/countries): tempat urutan dan ketersediaan channel sekarang berada
- [Pengirim dan branding](/docs/guides/verify/senders): apa yang dilihat penerima di setiap channel
- [Verify events](/docs/guides/verify/events): event tujuan pindah konsumer Event Streams Anda

## 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)
