cURL
Verstuur je eerste e-mail met alleen curl: exporteer een API-key, POST een bericht, en GET het terug om de aflevering te volgen. Dit is de onbewerkte HTTP-flow; alles wat de SDK's doen begint hier.
1. Exporteer je API-key
Maak een key aan in het dashboard onder Developers > API keys (Verstuur je eerste e-mail legt de stappen uit) en exporteer deze:
Codevoorbeeld
export BIRD_API_KEY="bk_us1_..."Het regioprefix bepaalt je API-host: bk_us1_-keys benaderen https://us1.platform.bird.com, en bk_eu1_-keys benaderen https://eu1.platform.bird.com. De voorbeelden voor verzenden gebruiken us1; wijzig de host als je key een andere regio heeft.
2. Verstuur een e-mail
POST naar /v1/email/messages, waarbij je verzendt vanaf ons gedeelde onboardingdomein naar het delivered@messagebird.dev-sandboxadres. Je hebt geen domeinverificatie of een echt postvak nodig. Selecteer het cURL-tabblad voor deze quickstart.
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); // "em_…", "accepted"msg = 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(msg.id, msg.status)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.Send(context.Background(), 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 {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)
}$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();bird email send \
--category transactional \
--cc manager@acme.com \
--from 'Acme Support <noreply@acme.com>' \
--header X-Campaign=spring-2026 \
--html '<h1>Hi there 👋</h1>' \
--metadata '{"user_id":"usr_12345"}' \
--reply-to support@acme.com \
--subject 'Welcome aboard' \
--tag category=welcome \
--text 'Hi there' \
--to 'Jane Doe <delivered@messagebird.dev>' \
--track-clicks=falsecurl -X POST https://us1.platform.bird.com/v1/email/messages \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "onboarding@messagebird.dev",
"to": ["delivered@messagebird.dev"],
"subject": "Hello from Bird",
"html": "<p>My first Bird email.</p>"
}'De API antwoordt met 202: Bird heeft de e-mail geaccepteerd en levert deze asynchroon af. De *_count-velden volgen ontvangers door de afleverstatussen. In het eerste antwoord is één ontvanger geaccepteerd en geen enkele afgeleverd:
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"
}Raw HTTP heeft geen SDK die een idempotentiesleutel voor je genereert. Geef voor bescherming bij opnieuw proberen een sleutel mee bij de eerste poging en hergebruik die bij een nieuwe poging. Zie Idempotentie voor een voorbeeld en replay-limieten.
3. Volg de aflevering
GET het bericht op basis van zijn em_-ID en volg hoe de status verandert van accepted via processed naar delivered. Selecteer opnieuw het cURL-tabblad:
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 https://us1.platform.bird.com/v1/email/messages/em_01ky7ma8y2es1s2akzk53tmjn0 \
-H "Authorization: Bearer $BIRD_API_KEY"Omdat de ontvanger het delivered@messagebird.dev-sandboxadres is, is aflevering gegarandeerd: het bericht doorloopt de echte pipeline van Bird maar raakt nooit een echt postvak.
Volgende stappen
- Email API-referentie: het volledige request- en responseschema.
- Authenticatie: keys, scopes en de Authorization-header.
- Verstuur je eerste e-mail: dezelfde flow met het dashboard en de SDK's.
- Verzenddomeinen: verifieer je eigen domein voor productieverzending.
Gerelateerde bronnen
Ga verder met de documentatie, gidsen en voorbeelden voor dit onderwerp. De bronnen zijn in het Engels.
Bekijk de gidsGetting started with emailBegrijp 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