# Migrar Verify desde Twilio

Esta página relaciona Twilio Verify v2 con Bird Verify. Sigue la [guía principal de migración](/docs/guides/verify/migrate) en orden y usa estas correspondencias para los pasos 1 y 3.

El Service es la pieza sin equivalente. Twilio se dirige a `POST https://verify.twilio.com/v2/Services/{ServiceSid}/Verifications`, y el Service contiene la longitud del código, el TTL, la consulta de número, el manejo de líneas fijas y los límites de tasa. Bird se dirige a [`POST /v1/verify/verifications`](/docs/api/reference/create-verification) sin segmento de servicio: esos ajustes pertenecen a tu espacio de trabajo en lugar de a un ID en la ruta. Múltiples Service IDs no tienen equivalente dentro de un espacio de trabajo, y no puedes seleccionar una configuración por solicitud.

## Pasa esto a tu agente

Pega esto en Claude Code, Cursor o Codex. El agente trabaja con esta página contra tu propio repositorio, usando cualquier superficie de Bird que ya tenga: el servidor MCP si hay uno conectado, o CLI si está instalado y con sesión iniciada.

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

## Relacionar la llamada de creación

| Qué hace               | Twilio Verify                                               | Bird                                                                                                                     |
| ---------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Destinatario           | `To`                                                        | `to.phone_number` o `to.email`                                                                                           |
| Canal                  | `Channel`                                                   | `options.channels`; de lo contrario, el orden configurado del país                                                       |
| Longitud del código    | Service `CodeLength`                                        | `options.code_length`; de lo contrario, el valor predeterminado del espacio de trabajo                                   |
| Vigencia del código    | Service TTL                                                 | el ajuste **Duration** del espacio de trabajo                                                                            |
| Límite de intentos     | Service max attempts                                        | el ajuste **Maximum Retries** del espacio de trabajo                                                                     |
| Correlación            | `Tags`                                                      | `metadata`                                                                                                               |
| Reintentos seguros     | (ninguno)                                                   | encabezado `Idempotency-Key`                                                                                             |
| Código personalizado   | `CustomCode`                                                | sin equivalente                                                                                                          |
| Localización           | `Locale`                                                    | `options.language`                                                                                                       |
| Contenido del mensaje  | `TemplateSid`, `CustomFriendlyName`, `ChannelConfiguration` | sin equivalente por solicitud; selecciona una plantilla de autenticación WhatsApp aprobada en la configuración de Verify |
| Limitaciones por clave | `RateLimits`                                                | límites fijos de la plataforma                                                                                           |
| Controles antifraude   | `RiskCheck`, Fraud Guard, `DeviceIp`                        | no expuesto en la API                                                                                                    |
| Autocompletado SMS     | `AppHash`                                                   | sin equivalente                                                                                                          |
| PSD2                   | `Amount`, `Payee`                                           | sin equivalente                                                                                                          |

Los canales tampoco se corresponden uno a uno:

| Twilio `Channel` | Bird                                                        |
| ---------------- | ----------------------------------------------------------- |
| `sms`            | `sms`                                                       |
| `email`          | `email`                                                     |
| `whatsapp`       | `whatsapp`                                                  |
| `call`           | sin equivalente                                             |
| `sna`, `auto`    | sin equivalente                                             |
| `rcs`            | sin equivalente                                             |
| (ninguno)        | `telegram`, disponible para números registrados en Telegram |

Un flujo que usa `call` como respaldo de accesibilidad, o `sna` y `auto` para un camino sin código, necesita replanteo antes de comprometerte con una fecha. Todo lo demás es un cambio de orden de canales en la página [**Countries**](https://bird.com/dashboard/w/verify/countries) en lugar de un parámetro por solicitud.

## Relacionar la llamada de verificación

El `POST /v2/Services/{ServiceSid}/VerificationCheck` de Twilio recibe `To` **o** `VerificationSid`, más `Code`. El [`POST /v1/verify/verifications/check`](/docs/api/reference/create-verification-check) de Bird recibe solo el destinatario y el código, así que la ruta `VerificationSid` desaparece junto con la columna donde lo almacenabas. Envía exactamente el conjunto de direcciones con el que creaste la verificación.

La forma de la respuesta difiere donde más importa:

- **Twilio responde con un campo `status`; Bird responde con un booleano.** `success: true` significa verificado. `success: false` incluye un `reason` de `incorrect_code`, `expired` o `attempts_exhausted`, más `attempts_remaining`, así que la cifra de "how many tries left" que quizá estés contando tú mismo vuelve en la respuesta.
- **Ambos pasan a `404` una vez que la verificación se consume.** Twilio elimina la verificación cuando se aprueba, expira o agota los intentos; Bird deja de aceptar comprobaciones en cualquier estado final. Almacena la primera respuesta definitiva en lugar de volver a comprobar.

## Traducir estados

| Estado en Twilio       | Estado en Bird                                         | Razón en Bird        |
| ---------------------- | ------------------------------------------------------ | -------------------- |
| `pending`              | `pending`                                              | ninguna              |
| `approved`             | `verified`                                             | ninguna              |
| `max_attempts_reached` | `failed`                                               | `attempts_exhausted` |
| `expired`              | `expired`                                              | `ttl_elapsed`        |
| `canceled`             | sin equivalente: una verificación no se puede cancelar |                      |

No hay endpoint de actualización, así que el patrón de Twilio de forzar una verificación a `approved` o `canceled` desde tu backend no tiene equivalente. Una verificación termina cuando el usuario la verifica, agota los intentos o la deja expirar.

## Mover el flujo de eventos

Twilio Verify reporta actividad a través de Event Streams: un destino más una suscripción a eventos de estado de verificación, configurados fuera de la API de Verify. Bird usa el mismo mecanismo de webhooks que cualquier otro canal. Suscribe un endpoint a los tipos de evento que necesites, nombrando cada uno: `verify.verification.created`, `verify.verification.verified` y `verify.verification.failed` para eventos de sesión, y `verify.attempt.sent`, `verify.attempt.delivered` y `verify.attempt.undelivered` para entregas individuales de códigos. No existe un comodín que los agrupe. Verifica la firma según [Standard Webhooks](https://www.standardwebhooks.com). Consulta [Verify events](/docs/guides/verify/events).

Los dos ejes importan cuando portas dashboards. Los eventos de estado de verificación de Twilio se corresponden con los eventos de sesión de Bird, y los eventos de intento de Bird añaden resultados de entrega por envío en la misma sesión, incluidos los envíos que produce un reenvío o un failover de canal.

## Transición

La [regla de transición](/docs/guides/verify/migrate#5-cut-over-one-code-lifetime-at-a-time) en la guía principal es la que debes planificar: un código emitido por Twilio no se puede comprobar con Bird, así que cambia en la llamada de creación y sigue enrutando las comprobaciones al proveedor que emitió la verificación hasta que expire el último código de Twilio.

Verifica el remitente antes de la transición. Puedes elegir Bird Verify o Authifly, usar tu dominio de correo verificado, seleccionar un Sender ID SMS existente o vincular tu número WhatsApp conectado con una plantilla de autenticación aprobada. Bird no elige entre un grupo de remitentes. Si mantienes un Sender ID SMS como valor predeterminado de la configuración, Verify recurre a Bird Verify solo donde ese ID no es elegible para el destino; una elección explícita de país no lo hace. Confirma lo que los usuarios ven en cada país y actualiza los guiones de soporte donde cambie.

## Próximos pasos

- [Envío de verificaciones](/docs/guides/verify/sending-verifications): el contrato completo de ambas llamadas, estados y límites
- [Configuración por país](/docs/guides/verify/countries): donde ahora viven el orden y la disponibilidad de canales
- [Remitentes y marca](/docs/guides/verify/senders): lo que el destinatario ve en cada canal
- [Verify events](/docs/guides/verify/events): los eventos a los que migra tu consumidor de 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)
