# Verify von Twilio migrieren

Diese Seite ordnet Twilio Verify v2 Bird Verify zu. Folgen Sie der [Hauptmigrationsanleitung](/docs/guides/verify/migrate) der Reihe nach und verwenden Sie diese Zuordnungen für die Schritte 1 und 3.

Der Service ist das Element ohne Gegenstück. Twilio adressiert `POST https://verify.twilio.com/v2/Services/{ServiceSid}/Verifications`, und der Service enthält Codelänge, TTL, Lookup, Festnetzbehandlung und Ratenbegrenzungen. Bird adressiert [`POST /v1/verify/verifications`](/docs/api/reference/create-verification) ohne Service-Segment: Diese Einstellungen gehören zu Ihrem Workspace statt zu einer ID im Pfad. Mehrere Service-IDs haben kein Äquivalent innerhalb eines Workspace, und Sie können keine Konfiguration pro Anfrage auswählen.

## Übergeben Sie dies Ihrem Agenten

Fügen Sie dies in Claude Code, Cursor oder Codex ein. Der Agent arbeitet diese Seite gegen Ihr eigenes Repository ab und nutzt die Bird-Oberfläche, die er bereits hat: den MCP-Server, falls einer verbunden ist, oder die CLI, falls sie installiert und angemeldet ist.

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

## Den Create-Aufruf zuordnen

| Funktion                 | Twilio Verify                                               | Bird                                                                                                                    |
| ------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Empfänger                | `To`                                                        | `to.phone_number` oder `to.email`                                                                                       |
| Kanal                    | `Channel`                                                   | `options.channels`, sonst die konfigurierte Reihenfolge des Landes                                                      |
| Codelänge                | Service `CodeLength`                                        | `options.code_length`, sonst der Workspace-Standard                                                                     |
| Code-Gültigkeitsdauer    | Service TTL                                                 | die Workspace-Einstellung **Duration**                                                                                  |
| Versuchslimit            | Service max attempts                                        | die Workspace-Einstellung **Maximum Retries**                                                                           |
| Korrelation              | `Tags`                                                      | `metadata`                                                                                                              |
| Sichere Wiederholungen   | (keine)                                                     | `Idempotency-Key`-Header                                                                                                |
| Eigener Bestätigungscode | `CustomCode`                                                | kein Äquivalent                                                                                                         |
| Lokalisierung            | `Locale`                                                    | `options.language`                                                                                                      |
| Nachrichteninhalt        | `TemplateSid`, `CustomFriendlyName`, `ChannelConfiguration` | kein Äquivalent pro Anfrage; wählen Sie ein genehmigtes WhatsApp-Authentifizierungstemplate in der Verify-Konfiguration |
| Drosselung pro Schlüssel | `RateLimits`                                                | feste Plattform-Leitplanken                                                                                             |
| Betrugskontrollen        | `RiskCheck`, Fraud Guard, `DeviceIp`                        | nicht über die API zugänglich                                                                                           |
| SMS-Autofill             | `AppHash`                                                   | kein Äquivalent                                                                                                         |
| PSD2                     | `Amount`, `Payee`                                           | kein Äquivalent                                                                                                         |

Auch die Kanäle lassen sich nicht eins zu eins zuordnen:

| Twilio `Channel` | Bird                                                        |
| ---------------- | ----------------------------------------------------------- |
| `sms`            | `sms`                                                       |
| `email`          | `email`                                                     |
| `whatsapp`       | `whatsapp`                                                  |
| `call`           | kein Äquivalent                                             |
| `sna`, `auto`    | kein Äquivalent                                             |
| `rcs`            | kein Äquivalent                                             |
| (keine)          | `telegram`, verfügbar für bei Telegram registrierte Nummern |

Ein Ablauf, der `call` als Barrierefreiheits-Fallback nutzt, oder `sna` und `auto` für einen codelosen Pfad, muss neu durchdacht werden, bevor Sie sich auf einen Termin festlegen. Alles andere ist eine Kanalreihenfolge-Änderung auf der Seite [**Countries**](https://bird.com/dashboard/w/verify/countries) statt eines Parameters pro Anfrage.

## Den Check-Aufruf zuordnen

Twilios `POST /v2/Services/{ServiceSid}/VerificationCheck` nimmt `To` **oder** `VerificationSid` entgegen, plus `Code`. Birds [`POST /v1/verify/verifications/check`](/docs/api/reference/create-verification-check) nimmt nur den Empfänger und den Code entgegen, sodass der `VerificationSid`-Pfad zusammen mit der Spalte entfällt, in der Sie ihn gespeichert haben. Übergeben Sie exakt die Adresse, mit der Sie die Verifizierung erstellt haben.

Die Antwortstruktur unterscheidet sich dort, wo es am meisten zählt:

- **Twilio antwortet mit einem `status`-Feld; Bird antwortet mit einem Boolean.** `success: true` bedeutet verifiziert. `success: false` liefert einen `reason` von `incorrect_code`, `expired` oder `attempts_exhausted`, plus `attempts_remaining`, sodass der "how many tries left"-Wert, den Sie möglicherweise selbst zählen, in der Antwort zurückkommt.
- **Beide gehen zu `404`, sobald die Verifizierung verbraucht ist.** Twilio löscht die Verifizierung, wenn sie genehmigt, abgelaufen oder die Versuche aufgebraucht sind; Bird akzeptiert in jedem Endzustand keine Prüfungen mehr. Speichern Sie die erste endgültige Antwort, statt erneut zu prüfen.

## Status übersetzen

| Twilio-Status          | Bird-Status                                                       | Bird-Grund           |
| ---------------------- | ----------------------------------------------------------------- | -------------------- |
| `pending`              | `pending`                                                         | keiner               |
| `approved`             | `verified`                                                        | keiner               |
| `max_attempts_reached` | `failed`                                                          | `attempts_exhausted` |
| `expired`              | `expired`                                                         | `ttl_elapsed`        |
| `canceled`             | kein Äquivalent: eine Verifizierung kann nicht abgebrochen werden |                      |

Es gibt keinen Update-Endpunkt, daher hat das Twilio-Muster, eine Verifizierung von Ihrem Backend aus auf `approved` oder `canceled` zu setzen, kein Gegenstück. Eine Verifizierung endet, wenn der Nutzer sie bestätigt, die Versuche aufbraucht oder sie ablaufen lässt.

## Den Event-Stream migrieren

Twilio Verify meldet Aktivitäten über Event Streams: ein Ziel plus ein Abonnement für Verifizierungsstatus-Events, konfiguriert außerhalb der Verify-API. Bird verwendet denselben Webhook-Mechanismus wie jeder andere Kanal. Abonnieren Sie einen Endpunkt für die gewünschten Event-Typen und benennen Sie jeden einzeln: `verify.verification.created`, `verify.verification.verified` und `verify.verification.failed` für Session-Events sowie `verify.attempt.sent`, `verify.attempt.delivered` und `verify.attempt.undelivered` für einzelne Bestätigungscode-Zustellungen. Es gibt keinen Platzhalter, der sie ersetzt. Prüfen Sie die Signatur gemäß [Standard Webhooks](https://www.standardwebhooks.com). Siehe [Verify-Events](/docs/guides/verify/events).

Die zwei Achsen sind beim Portieren von Dashboards relevant. Twilios Verifizierungsstatus-Events entsprechen den Session-Events von Bird, und die Versuch-Events von Bird liefern zusätzlich Zustellergebnisse pro Versand innerhalb derselben Session, einschließlich der Sendungen, die ein erneuter Versuch oder ein Kanal-Failover auslöst.

## Umstellung

Die [Umstellungsregel](/docs/guides/verify/migrate#5-cut-over-one-code-lifetime-at-a-time) in der Hauptanleitung ist die zentrale Planungsgrundlage: Ein von Twilio ausgestellter Code kann nicht von Bird geprüft werden. Wechseln Sie daher beim Create-Aufruf und leiten Sie Prüfungen weiterhin an den Anbieter, der die Verifizierung erstellt hat, bis der letzte Twilio-Code abläuft.

Prüfen Sie den Absender vor der Umstellung. Sie können Bird Verify oder Authifly wählen, Ihre verifizierte E-Mail-Domain verwenden, eine bestehende SMS Sender ID auswählen oder Ihre verbundene WhatsApp-Nummer mit einem genehmigten Authentifizierungstemplate verknüpfen. Bird wählt nicht aus einem Absenderpool aus. Wenn Sie eine SMS Sender ID als Konfigurationsstandard beibehalten, fällt Verify nur dort auf Bird Verify zurück, wo diese ID für das Ziel nicht zulässig ist; eine explizite Länderauswahl tut das nicht. Prüfen Sie, was Nutzer in jedem Land sehen, und aktualisieren Sie Support-Skripte, wo sich etwas ändert.

## Nächste Schritte

- [Verifizierungen senden](/docs/guides/verify/sending-verifications): der vollständige Vertrag für beide Aufrufe, Status und Limits
- [Länderkonfiguration](/docs/guides/verify/countries): wo Kanalreihenfolge und Verfügbarkeit jetzt hinterlegt sind
- [Absender und Branding](/docs/guides/verify/senders): was der Empfänger auf jedem Kanal sieht
- [Verify-Events](/docs/guides/verify/events): die Events, auf die Ihr Event-Streams-Consumer umzieht

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