# Bird vs Prelude for Verify

Bird Verify exposes [recipient-based delivery and code checks](/docs/guides/verify/sending-verifications): create a code, advance the available channel plan and check the answer using the same recipient. Compare that flow with [Prelude’s verification window and risk outcomes](https://docs.prelude.so/verify/v2/documentation/lifecycle) before moving a signup or login.

[Get Started](/dashboard/signup?returnTo=%2Fdashboard%2Fw%2Fverify)

[Contact Sales](/demo?product=verify&source_page=%2Fverify-api%2Fcompare%2Fbird-vs-prelude)

## Set up with your agent

[Read the agent setup guide](/docs/ai/set-up-your-agent)

Copy this prompt into your coding agent:

```text
Bird connects customer communications, data and automation. Help me build with Bird using my coding agent.
1. Read https://bird.com/docs/ai/set-up-your-agent.md and follow its setup workflow for this client. Use an existing connected Bird MCP server or signed-in CLI when available.
2. Read the product guide for the task I want to complete and inspect my existing integration. Identify the workspace, available operations and required setup.
3. Help me complete a first example for the product and destination I choose. Follow the operation through to its actual result, explain any uncertainty, and help me choose the next step.

Use this Bird page as the starting context: https://bird.com/verify-api/compare/bird-vs-prelude
Read its Markdown alternative and linked guides. Keep the first example relevant to this page and the customer outcome I choose. Preserve the supplied campaign context when following Bird signup or sales links.
```

[Read customer stories](/customers)

[Explore Enterprise](/enterprise)

- [Airwallex](/customers/airwallex)
- [Glovo](/customers/glovo)
- [Zillow](/customers/zillow)
- Uber
- [Binance](/customers/binance)
- Adobe
- Meta
- PayPal
- Pinterest
- Square
- [Al Jazeera](/customers/aljazeera)
- [Aramex](/customers/aramex)
- [Bazaar Technologies](/customers/bazaar)
- [ComparaOnline](/customers/compara)
- [Emma](/customers/emma)

## Which verification flow fits your application?

### When Prelude fits

- [Prelude’s create response](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification) distinguishes success, retry, challenged, blocked and shadow_blocked. Its signals feed fraud decisions; challenged and shadow_blocked require account enablement. Keep or replace the risk decision your application relies on before moving its code delivery.
- [Prelude documents](https://docs.prelude.so/verify/v2/documentation/introduction) RCS, Viber, Zalo and silent network authentication alongside SMS, WhatsApp and Telegram; its [request method](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) also accepts voice. Bird’s [selectable plan](/docs/guides/verify/sending-verifications#options) includes SMS, WhatsApp, email and Telegram. Voice is still rolling out and is not a customer migration option today. Retain or redesign a relied-on RCS, Viber, Zalo or silent-authentication method.
- [Prelude’s request options](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) include templates, locale and an enabled sender ID. Custom codes, an explicit channel list, force_challenge and max_auto_fallbacks require account enablement. Those settings need an explicit migration decision, not a field rename.

### Why choose Bird Verify?

- Bird [identifies the verification by the recipient](/docs/guides/verify/sending-verifications), including an email address, phone number or both. Its country plan determines which channels are available; options.channels can trim or reorder that plan.
- Bird’s [check response](/docs/api/reference/create-verification-check) returns success, reason and attempts_remaining. Store success: true in your application; a later check of a finalized verification returns 404 and does not undo that outcome.
- Bird’s [hosted MCP server](/docs/ai/mcp-server) and [CLI examples](/docs/guides/verify/sending-verifications) run create, check and next-channel operations. An agent can request the next delivery channel with the same recipient its application already holds.

## How do the Verify APIs compare?

Compare recipient state, recovery and risk decisions. Channel availability and advanced options depend on destination and account enablement.

| Capability | Bird | Prelude | Who wins |
| --- | --- | --- | --- |
| Create request | [JSON with a bearer key](/docs/api/reference/create-verification) to /v1/verify/verifications, with to.email, to.phone_number or both. | [JSON create-or-retry](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification) with a bearer key and target.type plus target.value. Email verification requires contacting Prelude about the use case. | Even |
| Safe retries | [Idempotency-Key](/docs/guides/idempotency) replays the request. [Recipient resends](/docs/guides/verify/sending-verifications#check-the-code) reuse the live verification, respect its cooldown and send a fresh code after it. | [Repeating the request](https://docs.prelude.so/verify/v2/documentation/lifecycle) within a live verification window creates a retry attempt. The lifecycle guide documents minimum retry spacing and attempt limits. | Even |
| What a failed check tells you | [success: false, reason and attempts_remaining](/docs/api/reference/create-verification-check). Persist a successful result before the verification is finalized. | [Check status](https://docs.prelude.so/verify/v2/api-reference/check-a-code) includes success, failure and expired_or_not_found. Transaction-bound codes can also return transaction_missing or transaction_mismatch. | Bird |
| Channels a passcode can arrive on | [SMS, WhatsApp, email and Telegram](/docs/guides/verify/sending-verifications#options), restricted to the recipient’s resolved country plan. [Voice](/verify-api/features/voice) is still rolling out and is not available for customer traffic. | [Messaging channels](https://docs.prelude.so/verify/v2/documentation/introduction) include SMS, RCS, WhatsApp, Telegram, Viber and Zalo, plus silent authentication; [method: voice](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) requests a phone call. Availability depends on account and destination. | Prelude |
| Delivery events | [Workspace subscriptions](/docs/guides/verify/events) distinguish verification and delivery events; [Standard Webhooks signatures](/docs/guides/webhooks) authenticate the payload. | [options.callback_url](https://docs.prelude.so/verify/v2/documentation/webhook) selects the destination per request. Generate a signing key to enable RSASSA-PSS SHA-256 signatures in X-Webhook-Signature. | Even |
| Fallback control | [Delivery failure advances the resolved plan](/docs/guides/verify/events). [Next-channel](/docs/api/reference/create-verification-next-channel) advances it on request and sends a fresh code; earlier codes remain valid. | [max_auto_fallbacks](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) limits additional automatic attempts and requires account enablement. It is fixed at creation; a requested retry gets a fresh allowance of that same limit. | Even |
| Hosted MCP server | [Authenticated hosted MCP](/docs/ai/mcp-server) runs [create, check and next-channel](/docs/guides/verify/sending-verifications); the bird CLI exposes the same operations. | [Prelude’s backend SDKs](https://docs.prelude.so/verify/v2/documentation/introduction#backend-sdks) let application code call Verify. Its [Node SDK](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) exposes verification.create and verification.check. | Bird |
| Code length | [options.code_length](/docs/guides/verify/sending-verifications#options) chooses the code length; otherwise the workspace setting applies. | [options.code_size](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) accepts 4 to 8 digits and otherwise uses the dashboard setting. | Even |
| Risk outcome | [Recipient send caps, check limits and country configuration](/docs/guides/verify/sending-verifications#abuse-guardrails). The [create response](/docs/api/reference/create-verification) returns a verification, without Prelude’s challenged or shadow_blocked outcome. | [Create status and risk data](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification) support branching on blocked traffic. reason describes a block; risk_factors appears for blocked or shadow_blocked decisions when specific risk signals are detected; those fields are not a rationale for every successful send. | Prelude |

## Who controls the next delivery attempt?

Bird [resolves its channel plan from the recipient and country](/docs/guides/verify/sending-verifications). A delivery failure or explicit next-channel request advances that plan. Each explicit call moves forward at most one channel and sends a fresh code; earlier codes stay valid for the live verification.

Bird: create with to → resolved channel plan → failed delivery or next-channel → fresh code → check with the same to. An exhausted plan returns [NoNextChannel](/docs/api/reference/create-verification-next-channel). Record success before offering another send.

Prelude: create with target and signals → risk outcome → verification window → delivery route → automatic or requested retry → code check. Its [lifecycle guide](https://docs.prelude.so/verify/v2/documentation/lifecycle) treats another create for the same number inside the live window as a retry, not a new verification.

[Prelude’s fallback limit](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) counts additional automatic attempts. A zero value disables automatic provider and channel retries. The value requires enablement and is fixed at creation; changing it on a retry is ignored, while a requested retry receives a fresh allowance of the fixed limit.

## What does success mean in each response?

Bird’s [check endpoint](/docs/api/reference/create-verification-check) returns success: true when the code is accepted. HTTP 200 can also carry success: false and a failure reason. Keep the successful application outcome; a finalized-record 404 is not a reversal of authentication.

Prelude’s [create status: success](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification) means a new verification window was created. Its [check status: success](https://docs.prelude.so/verify/v2/api-reference/check-a-code) is the result to use for code acceptance. Do not grant access from the create result. Both calls identify the target by its type and value.

[Prelude’s check reference](https://docs.prelude.so/verify/v2/api-reference/check-a-code) also defines transaction_missing and transaction_mismatch for prelude:psd2 codes. Preserve that transaction binding or choose an explicit replacement before migrating such a flow.

## Which risk signals and webhook checks must survive migration?

Prelude defines dispatch_id as “The identifier of the dispatch that came from the front-end SDK.” in its [create reference](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification). Supply the SDK’s actual dispatch value when using that integration; an application-generated request UUID is not a substitute.

[Prelude’s fraud guide](https://docs.prelude.so/verify/v2/documentation/prevent-fraud) describes server-provided signals and additional device signals from its frontend SDKs. Its [challenged and shadow_blocked states](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification) require account enablement. Inventory the application branches that consume those results.

Bird’s [send and check caps](/docs/guides/verify/sending-verifications#abuse-guardrails) bound API use. They do not replace a risk verdict your signup flow depends on. Keep the application’s fraud decision around code delivery.

[Prelude signs webhook payloads](https://docs.prelude.so/verify/v2/documentation/webhook) with RSASSA-PSS and SHA-256 after a signing key is generated in its dashboard. Bird uses [Standard Webhooks](/docs/guides/webhooks). Keep signature verification, but replace the verifier and event mapping rather than reusing Prelude’s header logic.

[SMS pricing](/sms-api/pricing)

[carrier fees](/pricing/sms/fees)

[Bird email pricing](/email-api/pricing)

[Bird WhatsApp pricing](/whatsapp-api/pricing)

## How are verification and delivery billed?

[There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Each delivery is charged at that channel's rate for the destination. A resend, or a fallback that moves delivery to a second channel, is a new send and a new charge.

A verdict compares only published delivery rates with the same channel, destination, currency, billing unit and sender type. Per-success verification fees and per-send charges are Not comparable: your own sends and successful checks determine usage.

Pricing verdict: Not comparable

| Published item | Prelude | Bird billing policy |
| --- | --- | --- |
| Pay As You Go. Per verification | [0.032 €](https://prelude.so/pricing) . Per verification plus message costs. Monthly billing and 10,000 verifications selected. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. |
| Startup. Per month | [360 €](https://prelude.so/pricing) . Per month plus message costs. Monthly billing and 10,000 verifications selected. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. |
| Enterprise. Custom volume | [Contact sales](https://prelude.so/pricing) . Contact sales for committed volume pricing. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. |
| SMS (US). Per SMS. Destination: US | [€0.0043](https://prelude.so/pricing) EUR. Message cost for the selected United States destination. Verification charges are separate. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. |
| WhatsApp (US). Per message. Destination: US | [€0.0028](https://prelude.so/pricing) EUR. Message cost for the selected United States destination. Verification charges are separate. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. |
| RCS (US). Per message. Destination: US | [€0.00](https://prelude.so/pricing) EUR. Message cost for the selected United States destination. Verification charges are separate. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. [This method is outside Bird’s documented Verify channel plan.](/docs/guides/verify/sending-verifications#options) |
| Telegram (US). Per message. Destination: US | [€0.012](https://prelude.so/pricing) EUR. Message cost for the selected United States destination. Verification charges are separate. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. |
| Viber (US). Per message. Destination: US | [€0.007](https://prelude.so/pricing) EUR. Message cost for the selected United States destination. Verification charges are separate. as published 2026-09-08 | [There's no plan, seat, or platform fee for Bird Verify.](/verify-api/pricing) Channel sends are billed separately. Check the live channel rates below. [This method is outside Bird’s documented Verify channel plan.](/docs/guides/verify/sending-verifications#options) |

## Bird published SMS channel rates

Bird's SMS catalogue rates are shown by sender type, per message segment. Carrier fees and sender costs may apply separately. These channel rates are not a total verification quote.

[SMS pricing](/sms-api/pricing); [carrier fees](/pricing/sms/fees).

| Destination | Sender type | Per SMS segment |
| --- | --- | --- |
| US | long_code | [EUR 0.003](/sms-api/pricing) |
| US | long_code | [USD 0.0035](/sms-api/pricing) |
| US | toll_free | [EUR 0.003](/sms-api/pricing) |
| US | toll_free | [USD 0.0035](/sms-api/pricing) |
| US | short_code | [EUR 0.006](/sms-api/pricing) |
| US | short_code | [USD 0.007](/sms-api/pricing) |

[Bird email pricing](/email-api/pricing) and [Bird WhatsApp pricing](/whatsapp-api/pricing) publish the other delivery channels.

## How do you start a verification?

[Prelude’s create resource](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) accepts target and options.code_size at /v2/verification. Bird’s [create endpoint](/docs/api/reference/create-verification) accepts to and options.code_length. Supply a real frontend dispatch identifier only when that Prelude integration is in use.

**Prelude** · verify.ts

```typescript
const response = await fetch("https://api.prelude.dev/v2/verification", {
  method:  "POST",
  headers: {
    Authorization:  `Bearer ${process.env.PRELUDE_API_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    target:      { type: "phone_number", value: "+15551234567" },
    options:     { code_size: 6 },
  }),
});

const verification = await response.json();
console.log(verification.id, verification.status);
```

**Bird** · verify.ts

```typescript
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.verify.verifications
  .create(
    {
      to:      { phone_number: "+15551234567" },
      options: { code_length: 6 },
    },
  )
  .safe();

if (error) console.error(error.message);
else console.log(data.id, data.status);
```

## Switching cost: What must change before cutover?

Inventory the methods, risk decisions, templates, sender IDs and transaction-bound checks your application uses. The [Prelude migration guide](/docs/guides/verify/migrate/prelude) maps supported fields. A relied-on voice, RCS, Viber, Zalo or silent-authentication path needs an explicit alternative before it moves to Bird.

Route new creates to the chosen provider and keep pending checks with the provider that issued the code. Map callback events, install the matching signature verifier and persist successful checks. Test timeout retries, user resends, channel advancement and expired verifications before cutover. Review [Bird’s sender and message policy](/docs/guides/verify/senders) with the recipient-facing flow.

[Read the migration guide](/docs/guides/verify/migrate/prelude)

[See the Verify surface](/verify-api)

## What should you check before choosing?

### Is Bird a Prelude alternative for SMS and email?

Bird [sends and checks codes](/docs/guides/verify/sending-verifications) for supported phone and email recipients. Prelude [also documents email verification](https://docs.prelude.so/verify/v2/documentation/email-verification); its [create reference](https://docs.prelude.so/verify/v2/api-reference/create-or-retry-a-verification) asks buyers to contact Prelude about that use case. Compare your actual channel plan and risk decisions, not a count of channel names.

### Does a retry start a new Prelude verification?

[Prelude reuses the verification window](https://docs.prelude.so/verify/v2/documentation/lifecycle) for repeated requests to the same phone number while it remains live. Its retry adds an attempt and remains subject to retry spacing and attempt limits. Bird’s [idempotency key](/docs/guides/idempotency) and [recipient resend](/docs/guides/verify/sending-verifications#check-the-code) are separate controls; test both timeout retries and user-requested resends.

### Can I adjust Prelude’s fallback limit on each retry?

[Prelude’s max_auto_fallbacks](https://github.com/prelude-so/node-sdk/blob/main/src/resources/verification.ts) is recorded when the verification is created and requires account enablement. A retry cannot change that stored limit, but a requested retry gets a fresh allowance of the same size. Bird’s [next-channel call](/docs/api/reference/create-verification-next-channel) instead advances its existing country-resolved plan.

### What should I store after a successful check?

Persist the application’s authenticated state and which provider issued the pending verification. [Bird](/docs/api/reference/create-verification-check) checks the same to set and [Prelude](https://docs.prelude.so/verify/v2/api-reference/check-a-code) checks the target. Their successful check results belong to your application even after a verification expires or is finalized.

## Where to go next

Start with the migration guide, then compare supported channels and billing units.

- [Migrate Verify from Prelude](/docs/guides/verify/migrate/prelude): Map create and check fields, risk decisions and delivery callbacks before moving the flow.
- [Bird vs Twilio Verify](/verify-api/compare/bird-vs-twilio): Compare recipient state, code checks and SNA-to-SMS fallback.
- [Verify comparisons](/verify-api/compare): Choose a verification API by supported channels and application recovery paths.
- [Verify pricing](/verify-api/pricing): Read Bird’s channel-send billing policy and published delivery rates.
- [Bird for AI agents](/docs/ai/mcp-server): Run supported operations through Bird’s authenticated hosted MCP server.

## Make verification part of your product.

Talk through your channels, verification flow, and expected traffic with our team.



## Related resources

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

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