# Create the next verification channel attempt

`POST /v1/verify/verifications/next-channel`

Advances an in-progress verification to the next channel in its plan and sends a fresh passcode there. Identify the verification by the same `to` recipient used to create it; no verification ID is required.

The send bypasses the resend cooldown and does not draw on the recipient's hourly send cap; what bounds it is the channel plan, since each call advances by at most one channel. Passcodes sent earlier remain valid. The response sets `last_channel` to the most recent completed send. Concurrent requests each advance the plan by at most one channel and return committed state.

A recipient with no in-progress verification returns `404 E13000`, whether none was ever created or the most recent one is already resolved. A recipient who has already verified is in that set, so a `404` here is not evidence they still need verifying, and creating another verification would send a passcode they no longer need. A plan with no further channel returns `422 NoNextChannel`; create the verification again to resend on the current channel. If every remaining channel fails, the operation returns `422 NoAvailableChannel`. Requests that exceed the send rate limit return `429`.

## Code samples

**TypeScript**

```ts
const verification = await bird.verify.verifications.nextChannel({
  to: { phone_number: "+15551234567" },
});
console.log(verification.last_channel);
```

Examples: [TypeScript](/docs/api/reference/create-verification-next-channel.ts.md) · [Python](/docs/api/reference/create-verification-next-channel.py.md) · [Go](/docs/api/reference/create-verification-next-channel.go.md) · [PHP](/docs/api/reference/create-verification-next-channel.php.md) · [CLI](/docs/api/reference/create-verification-next-channel.cli.md) · [MCP](/docs/api/reference/create-verification-next-channel.mcp.md) · [cURL](/docs/api/reference/create-verification-next-channel.curl.md)

## Example response `200`

```json
{
  "id": "vrf_01krdgeqcxet5s7t44vh8rt9mg",
  "status": "pending",
  "reason": null,
  "to": {
    "email": "user@example.com"
  },
  "channels": [
    {
      "channel": "email"
    }
  ],
  "last_channel": "email",
  "expires_at": "2026-05-20T09:24:52Z",
  "created_at": "2026-05-20T09:14:52Z",
  "updated_at": "2026-05-20T09:14:52Z"
}
```

## Request body

- `to` (object, required): The recipient to verify. Provide an `email`, a `phone_number`, or both; at least one is required. The addresses also identify the verification: a check must supply exactly the set used on the create call, so a verification created with both addresses is not found by either one alone.
- `to.email` (string): The recipient's email address. Case does not matter; the address is lowercased before use.
- `to.phone_number` (string): The recipient's phone number in E.164 format, with the leading `+` and country code (for example `+15551234567`). A number in any other format is rejected as an invalid recipient (`422`).

## Response body

- `id` (string, required)
- `status` (string, required)

  The verification's current state:

  - `pending`: Awaiting a correct passcode.
  - `verified`: A correct passcode was submitted.
  - `failed`: The verification cannot be completed. Either too many
    incorrect passcodes were submitted, or no planned channel could
    deliver one. Read `reason` to tell those apart.
  - `expired`: The validity window elapsed before a correct passcode.
  - `canceled`: The verification was canceled before completion.
  - `blocked`: A fraud or abuse control stopped the verification.

  Possible values: `pending`, `verified`, `failed`, `expired`, `canceled`, `blocked`
- `reason` (nullable string): Why the verification reached its final state, or `null` while `pending` and once `verified`. See the enum for the values it can take.
- `to` (object, required): The recipient to verify. Provide an `email`, a `phone_number`, or both; at least one is required. The addresses also identify the verification: a check must supply exactly the set used on the create call, so a verification created with both addresses is not found by either one alone.
- `to.email` (string): The recipient's email address. Case does not matter; the address is lowercased before use.
- `to.phone_number` (string): The recipient's phone number in E.164 format, with the leading `+` and country code (for example `+15551234567`). A number in any other format is rejected as an invalid recipient (`422`).
- `channels` (array of object, required): The channels this verification uses to deliver the passcode, in attempt order: the first entry is tried first and later entries are fallbacks. An email recipient is verified over email; a phone recipient is verified over the phone channels enabled for its destination country, in the order that country's configuration sets.
- `channels.channel` (string, required)

  The channel a passcode is delivered over. Open enum: new channels may be added over time, so treat any unrecognized value as a future channel rather than an error.

  Possible values (may grow over time): `email`, `sms`, `whatsapp`, `telegram`, `voice`
- `last_channel` (nullable string)

  The channel the most recent passcode was sent on, or `null` before the first send. Open enum; new channels may be added over time, so treat any unrecognized value as a future channel rather than an error.

  Possible values (may grow over time): `email`, `sms`, `whatsapp`, `telegram`, `voice`
- `metadata` (object): The key/value pairs attached when the verification was created.
- `expires_at` (string, required): When the verification expires if no correct passcode is submitted first. After this time its status reports `expired`.
- `verified_at` (nullable string): When the verification was completed, or `null` if it is not yet verified.
- `created_at` (string, required)
- `updated_at` (string, required)

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