Verifieer je eerste klant
Bird Verify bevestigt dat iemand een e-mailadres of telefoonnummer beheert. Je vraagt Bird om een eenmalige verificatiecode te versturen. De persoon voert deze in je app in, en je vraagt Bird of de code klopte. Bird genereert en bezorgt de code en handhaaft de vervaltijd en pogingslimieten. Je app ontvangt of bewaart de gegenereerde code nooit.
Deze quickstart verifieert je eigen e-mailadres, wat geen configuratie vereist. Bird verstuurt e-mailcodes via de gedeelde Bird Verify-afzender, dus je hebt geen domein of saldo nodig. Na het opwaarderen van SMS gebruikt een telefoonnummer verifiëren dezelfde twee calls.
1. Maak een API-key aan
Ga in het dashboard naar Developers > API keys en maak een key aan. Keys zijn gekoppeld aan een regio en zien eruit als bk_us1_... of bk_eu1_...; de regio in het prefix vertelt je welke API-host je moet aanroepen: https://us1.platform.bird.com of https://eu1.platform.bird.com.

De volledige key wordt eenmalig getoond, bij het aanmaken. Kopieer deze naar een veilige plek en exporteer de key voor de verstuurvoorbeelden:
Codevoorbeeld
export BIRD_API_KEY="bk_us1_..."2. Verstuur een code
Maak een verificatie aan voor het adres dat je wilt bevestigen. Het enige verplichte veld is to. Gebruik je eigen e-mailadres zodat je de code kunt lezen. Installeer de Bird SDK voor je taal door de bijbehorende SDK-quickstart te volgen.
Vervang in de SDK-tabs de voorbeeld-API-key en user@example.com voordat je de code uitvoert. De CLI gebruikt je login, en het cURL-tabblad gebruikt BIRD_API_KEY.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: "bk_XXXXXXXXXXXXXXXXXXXXXXXX" });
const verification = await bird.verify.verifications.create({
to: { email: "user@example.com" },
});
console.log(verification.id, verification.status);from bird import APIError, Bird
with Bird(api_key="bk_XXXXXXXXXXXXXXXXXXXXXXXX") as client:
try:
verification = client.verify.verifications.create(
to={"email": "user@example.com"},
)
print(verification.id, verification.status)
except APIError as err:
print("could not start the verification:", err)package main
import (
"context"
"fmt"
"log"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey("bk_XXXXXXXXXXXXXXXXXXXXXXXX"))
if err != nil {
log.Fatal(err)
}
verification, err := client.Verify.Verifications.Create(context.Background(), bird.VerifyVerificationsCreateParams{
To: bird.VerificationTo{Email: bird.Email("user@example.com")},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(verification.Id, *verification.Status)
}<?php
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use MessageBird\Bird;
use MessageBird\Wire\Model\VerificationCreateRequest;
use MessageBird\Wire\Model\VerificationTo;
$bird = new Bird('bk_XXXXXXXXXXXXXXXXXXXXXXXX');
$verification = $bird->verify->verifications->create(
(new VerificationCreateRequest())
->setTo((new VerificationTo())->setEmail('user@example.com')),
);
echo $verification->getId(), ' ', $verification->getStatus(), "\n";bird verify verifications create --email user@example.comcurl -X POST https://us1.platform.bird.com/v1/verify/verifications \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": { "email": "user@example.com" }
}'Als je key begint met bk_eu1_, roep dan https://eu1.platform.bird.com aan.
Bird accepteert het verzoek en begint de code te versturen:
Codevoorbeeld
{
"id": "vrf_01ky7q1fdze3695yvyz7z9nm3a",
"status": "pending",
"reason": null,
"to": { "email": "user@example.com" },
"channels": [{ "channel": "email" }],
"last_channel": "email",
"expires_at": "2026-07-23T14:55:58Z",
"verified_at": null,
"created_at": "2026-07-23T14:45:58Z",
"updated_at": "2026-07-23T14:45:58Z"
}Je hoeft geen verificatie-ID op te slaan: de controle in stap 3 is gekoppeld aan dezelfde ontvanger. De e-mail komt van Bird Verify <otp@verify.bird.com> met als onderwerp "Your verification code" en een zescijferige code; het bericht zelf vermeldt wanneer de code verloopt. Codelengte, levensduur, pogingslimiet en herverzendings-cooldown zijn werkruimte-instellingen, en verificatie-instellingen beschrijft de standaardwaarden en bereiken.
3. Controleer de code
Neem de code uit je inbox en verstuur deze, gekoppeld aan dezelfde ontvanger:
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: "bk_XXXXXXXXXXXXXXXXXXXXXXXX" });
const result = await bird.verify.verifications.check({
to: { email: "user@example.com" },
code: "123456",
});
console.log(result.success);from bird import APIError, Bird
with Bird(api_key="bk_XXXXXXXXXXXXXXXXXXXXXXXX") as client:
try:
result = client.verify.verifications.check(
to={"email": "user@example.com"},
code="123456",
)
print(result.success)
except APIError as err:
print("could not check the passcode:", err)package main
import (
"context"
"fmt"
"log"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey("bk_XXXXXXXXXXXXXXXXXXXXXXXX"))
if err != nil {
log.Fatal(err)
}
result, err := client.Verify.Verifications.Check(context.Background(), bird.VerifyVerificationsCheckParams{
To: bird.VerificationTo{Email: bird.Email("user@example.com")},
Code: "123456",
})
if err != nil {
log.Fatal(err)
}
fmt.Println(*result.Success)
}<?php
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use MessageBird\Bird;
use MessageBird\Wire\Model\VerificationCheckRequest;
use MessageBird\Wire\Model\VerificationTo;
$bird = new Bird('bk_XXXXXXXXXXXXXXXXXXXXXXXX');
$result = $bird->verify->verifications->check(
(new VerificationCheckRequest())
->setTo((new VerificationTo())->setEmail('user@example.com'))
->setCode('123456'),
);
echo $result->getSuccess() ? 'verified' : 'not verified', "\n";bird verify verifications check 123456 --email user@example.comcurl -X POST https://us1.platform.bird.com/v1/verify/verifications/check \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": { "email": "user@example.com" },
"code": "123456"
}'Een correcte code komt terug als success: true, en de ingesloten verificatie schakelt naar verified:
Codevoorbeeld
{
"success": true,
"reason": null,
"attempts_remaining": null,
"verification": {
"id": "vrf_01ky7q1fdze3695yvyz7z9nm3a",
"status": "verified",
"reason": null,
"to": { "email": "user@example.com" },
"channels": [{ "channel": "email" }],
"last_channel": "email",
"expires_at": "2026-07-23T14:55:58Z",
"verified_at": "2026-07-23T14:46:47Z",
"created_at": "2026-07-23T14:45:58Z",
"updated_at": "2026-07-23T14:46:47Z"
}
}Houd rekening met deze uitkomsten voordat je deze flow aan een registratie toevoegt:
- Een mislukte controle retourneert HTTP 200. Het antwoord bevat success: false, een reason (incorrect_code, expired of attempts_exhausted), en een attempts_remaining-teller zolang er pogingen resteren. Verwerk dit resultaat in je applicatie. De verificatie mislukt definitief nadat alle controlepogingen zijn opgebruikt.
- Een verificatie wordt één keer afgehandeld. Nadat deze verified bereikt (of mislukt of verloopt), retourneert een nieuwe controle een 404. Behandel het eerste definitieve antwoord als het antwoord. Als de gebruiker een nieuwe code nodig heeft, roep je het create-endpoint opnieuw aan met dezelfde ontvanger: de lopende verificatie wordt hergebruikt en er wordt een nieuwe code verstuurd zodra de herverzendings-cooldown verstreken is.
Elke verificatie die je aanmaakt verschijnt op de Verifications-pagina met status, ontvanger, kanaal en timing. De gegenereerde code wordt niet getoond.

Verifieer een telefoonnummer
Om via SMS te verifiëren, vul je een telefoonnummer in to in E.164-formaat in plaats van een e-mailadres:
const verification = await bird.verify.verifications.create({
to: { phone_number: "+15551234567" },
});
console.log(verification.id, verification.status);verification = client.verify.verifications.create(to={"phone_number": "+15551234567"})
print(verification.id, verification.status)verification, err := client.Verify.Verifications.Create(context.Background(), bird.VerifyVerificationsCreateParams{
To: bird.VerificationTo{PhoneNumber: bird.String("+15551234567")},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(verification.Id, *verification.Status)$verification = $bird->verify->verifications->create(
(new VerificationCreateRequest())->setTo((new VerificationTo())->setPhoneNumber('+15551234567')),
);
echo $verification->getId(), ' ', $verification->getStatus();bird verify verifications create --body-file - <<'JSON'
{
"to": {
"phone_number": "+15551234567"
},
"metadata": {
"correlation_id": "signup-7f3a"
}
}
JSONcurl -X POST "https://{region}.platform.bird.com/v1/verify/verifications" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": {
"phone_number": "+15551234567"
},
"metadata": {
"correlation_id": "signup-7f3a"
}
}'De controle is identiek: vervang email door hetzelfde phone_number. Telefonische bezorging gaat van het SMS-saldo van je werkruimte af, en het bestemmingsland bepaalt de route. Bird probeert WhatsApp eerst in de meeste landen en SMS eerst in sommige. Landconfiguratie toont en configureert de beschikbare kanalen en hun volgorde per bestemming. Afzenders en branding toont wat er op elk kanaal aankomt.
Bereik de gebruiker via beide kanalen
Je hoeft niet één kanaal te kiezen. Voeg zowel een email als een phone_number toe in to, en Bird stelt een bezorgplan samen op basis van je landconfiguratie, die de beschikbare kanalen en hun volgorde per bestemming toont. Bird volgt dat plan totdat een verzending wordt geaccepteerd. Als de bezorging later volledig mislukt, verstuurt Bird een nieuwe code via het volgende kanaal. Controleer de code met hetzelfde to-object dat je gebruikte om de verificatie aan te maken. De gebruiker voert in welke code is aangekomen.
Volgende stappen
- Verificaties versturen: opties, statussen, herverzendings, instellingen en limieten in detail.
- Landconfiguratie: landen inschakelen en kanaalvolgorde per land instellen.
- Afzenders & branding: hoe de codeberichten eruitzien en hoe je e-mail verstuurt vanaf je eigen domein.
- Verify API-referentie: het volledige request- en responseschema.
- Telefoonnummers verifiëren bij registratie: een video die dezelfde flow integreert in een webshop
Gerelateerde bronnen
Ga verder met de documentatie, gidsen en voorbeelden voor dit onderwerp. De bronnen zijn in het Engels.
Begrijp het conceptWhat does OTP mean? One-time passwords explainedOntdek de mogelijkheidCustomer verificationVolg het leerpadBuild your first integration
Probeer de oefening en ontvang een implementatieoverzicht