Verstuur je eerste e-mail
Maak een API-sleutel aan, verstuur via het gedeelde onboardingdomein van Bird en controleer het resultaat. Je hoeft voor deze handleiding geen verzenddomein te verifiëren of DNS-records te publiceren. Verifieer je eigen domein voordat je naar klanten verstuurt.
1. Maak een API-sleutel aan
Ga in het dashboard naar Developers > API keys en maak een sleutel aan. Sleutels zijn gekoppeld aan een regio en zien er uit als bk_us1_... of bk_eu1_...; de regio in het voorvoegsel vertelt je welke API-host je moet aanroepen: https://us1.platform.bird.com of https://eu1.platform.bird.com.

De volledige sleutel wordt één keer getoond, bij het aanmaken. Kopieer hem naar een veilige plek en exporteer hem zodat de codefragmenten uit stap 2 hem kunnen lezen:
Codevoorbeeld
export BIRD_API_KEY="bk_us1_..."2. Verstuur een e-mail
Verstuur vanaf onboarding@messagebird.dev, het gedeelde onboardingdomein van Bird, dat zonder configuratie beschikbaar is in je werkruimte. Adresseer het aan delivered@messagebird.dev, een sandbox-ontvanger die altijd bezorgt, zodat het resultaat deterministisch is zonder een echte mailbox.
De cURL-aanroep noemt de US-host. Als je sleutel begint met bk_eu1_, roep dan https://eu1.platform.bird.com aan. De SDK leest de regio uit je sleutel en selecteert de host. Het TypeScript-tabblad vereist npm install @messagebird/sdk.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const msg = await bird.email.send({
from: { email: "onboarding@messagebird.dev", name: "Bird" },
to: ["delivered@messagebird.dev"],
subject: "Hello from Bird",
html: "<p>My first Bird email.</p>",
});
console.log(msg.id, msg.status);from bird import APIError, Bird
with Bird() as client:
try:
message = client.email.send(
from_={"email": "onboarding@messagebird.dev", "name": "Bird"},
to=["delivered@messagebird.dev"],
subject="Hello from Bird",
html="<p>My first Bird email.</p>",
)
print(message.id, message.status)
except APIError as err:
print("send failed:", err)package main
import (
"encoding/json"
"errors"
"log"
"net/http"
"os"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
if err != nil {
log.Fatal(err)
}
http.HandleFunc("POST /send", func(w http.ResponseWriter, r *http.Request) {
msg, err := client.Email.Send(r.Context(), bird.EmailSendParams{
From: "onboarding@messagebird.dev",
To: []string{"delivered@messagebird.dev"},
Subject: "Hello from Bird",
HTML: "<p>My first Bird email.</p>",
})
if err != nil {
var apiErr *bird.APIError
if errors.As(err, &apiErr) {
http.Error(w, apiErr.Error(), apiErr.StatusCode)
return
}
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusAccepted)
_ = json.NewEncoder(w).Encode(msg)
})
log.Fatal(http.ListenAndServe(":3000", nil))
}<?php
// Send your first email. Set BIRD_API_KEY in your environment, then run:
// php examples/quickstart-email.php
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use MessageBird\Bird;
$bird = new Bird(getenv('BIRD_API_KEY') ?: '');
$message = $bird->email->send(
from: 'Bird <onboarding@messagebird.dev>',
to: ['delivered@messagebird.dev'],
subject: 'Hello from Bird',
html: '<p>My first Bird email.</p>',
);
echo $message->getId(), ' ', $message->getStatus(), "\n";bird email send \
--from 'Bird <onboarding@messagebird.dev>' \
--html '<p>My first Bird email.</p>' \
--subject 'Hello from Bird' \
--to delivered@messagebird.devcurl -X POST "https://us1.platform.bird.com/v1/email/messages" \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": { "email": "onboarding@messagebird.dev", "name": "Bird" },
"to": ["delivered@messagebird.dev"],
"subject": "Hello from Bird",
"html": "<p>My first Bird email.</p>"
}'Gebruik voor volledige installatie- en uitvoerstappen in elke taal of elk framework de SDK-quickstarts.
3. Bekijk het resultaat
De API antwoordt met 202: Bird heeft de verzending geaccepteerd voor asynchrone verwerking. Controleer de bezorgstatus apart. De *_count-velden volgen ontvangers door de bezorgstatussen. In het eerste antwoord is één ontvanger geaccepteerd en zijn er geen bezorgd.
Codevoorbeeld
{
"id": "em_01ky7ma8y2es1s2akzk53tmjn0",
"status": "accepted",
"category": "marketing",
"from": { "email": "onboarding@messagebird.dev" },
"to": [{ "email": "delivered@messagebird.dev" }],
"subject": "Hello from Bird",
"accepted_count": 1,
"processed_count": 0,
"delivered_count": 0,
"deferred_count": 0,
"bounced_count": 0,
"complained_count": 0,
"rejected_count": 0,
"open_count": 0,
"click_count": 0,
"track_opens": true,
"track_clicks": true,
"created_at": "2026-07-23T13:58:20.866Z"
}Haal het bericht op aan de hand van zijn em_-ID om de huidige status te zien. Een bericht gaat van accepted via processed naar delivered. Poll totdat het sandbox-bericht delivered bereikt:
const msg = await bird.email.get("em_abc123");
msg.status; // "accepted" | "processed" | "delivered" | "bounced" | …
msg.delivered_count;
msg.bounced_count;message = client.email.get("em_abc123")
print(message.id, message.status, message.delivered_count)package main
import (
"context"
"fmt"
"log"
"os"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
if err != nil {
log.Fatal(err)
}
msg, err := client.Email.Get(context.Background(), "em_abc123")
if err != nil {
log.Fatal(err)
}
fmt.Println(*msg.Status, *msg.DeliveredCount)
}$message = $bird->email->get('em_01krdgeqcxet5s7t44vh8rt9mg');
echo $message->getStatus();bird email get <message-id>curl -X GET "https://{region}.platform.bird.com/v1/email/messages/{message_id}" \
-H "Authorization: Bearer $TOKEN"Vervang in het cURL-tabblad {region} en {message_id}, en gebruik $BIRD_API_KEY in plaats van $TOKEN.
Het opgehaalde bericht toont nu status: "delivered", delivered_count: 1 en een delivered_at-tijdstempel. Zie de events-handleiding voor wat delivered vaststelt bij een echte ontvanger.
Omdat je naar delivered@messagebird.dev hebt verstuurd, is de uitkomst gegarandeerd: het bericht doorloopt de echte bezorgpipeline van Bird, inclusief productie-event- en webhook-structuren, maar raakt nooit een echte mailbox. Om een bounce te testen, verstuur je naar bounce@messagebird.dev. De testing-sandbox-handleiding vermeldt elk sandbox-adres en de gesimuleerde uitkomst ervan.
Over het onboardingdomein
De gedeelde onboarding@messagebird.dev-afzender is beschikbaar voor onboarding en heeft de volgende beperkingen:
- Afgezien van de @messagebird.dev-sandbox-adressen bezorgt het alleen aan geverifieerde leden van je werkruimte; elke andere ontvanger wordt geweigerd met een 422.
- Verzendingen zijn beperkt tot 50 ontvangers per organisatie per UTC-dag, inclusief elk to-, cc- en bcc-adres en sandbox-ontvangers. Voorbij de limiet retourneert de API een 429.
Wanneer je klaar bent om echte klanten te e-mailen, verifieer je eigen verzenddomein en zet je eigen adres in from; de rest van het verzoek blijft hetzelfde.
Volgende stappen
- Quickstarts per SDK: dezelfde flow in je taal en framework.
- Verzenddomeinen: verifieer je eigen domein voor productieverzending.
- Testing-sandbox: elk sandbox-adres en de events die het activeert.
- Email API-referentie: het volledige verzoek- en antwoordschema.
- Aan de slag met e-mail: een video van de dashboard-onboarding, die verder gaat dan deze pagina en een verzenddomein met bijbehorende DNS-records toevoegt
Gerelateerde bronnen
Ga verder met de documentatie, gidsen en voorbeelden voor dit onderwerp. De bronnen zijn in het Engels.
Begrijp het conceptShould I use a Bird SDK or call the API directly?Ontdek de mogelijkheidEmailVolg het leerpadBuild your first integration
Probeer de oefening en ontvang een implementatieoverzicht