cURL
Senden Sie Ihre erste E-Mail nur mit curl: Exportieren Sie einen API-Schlüssel, senden Sie eine Nachricht per POST und rufen Sie sie per GET ab, um die Zustellung zu verfolgen. Das ist der reine HTTP-Ablauf, auf dem alles aufbaut, was die SDKs tun.
1. Exportieren Sie Ihren API-Schlüssel
Erstellen Sie im Dashboard unter Platform tools > API keys einen Schlüssel (Send your first email beschreibt die Schritte) und exportieren Sie ihn:
export BIRD_API_KEY="bk_us1_..."Das Regionspräfix bestimmt Ihren API-Host: bk_us1_-Schlüssel rufen https://us1.platform.bird.com auf, bk_eu1_-Schlüssel rufen https://eu1.platform.bird.com auf. Die Sendebeispiele verwenden us1. Ändern Sie den Host, wenn Ihr Schlüssel zu einer anderen Region gehört.
2. Senden Sie eine E-Mail
Senden Sie einen POST an /v1/email/messages, mit unserer gemeinsamen Onboarding-Domain als Absender und der delivered@messagebird.dev-Sandbox-Adresse als Empfänger. Sie benötigen dafür weder eine Domainverifizierung noch ein echtes Postfach. Wählen Sie für diesen Schnellstart den Tab cURL.
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>"
}'Die API antwortet mit 202: Bird hat die E-Mail angenommen und stellt sie asynchron zu. Die Felder *_count verfolgen die Empfänger durch die Zustellungsstatus. In der ersten Antwort ist ein Empfänger angenommen und keiner zugestellt:
{
"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"
}Bei reinem HTTP erzeugt kein SDK einen Idempotenzschlüssel für Sie. Zum Schutz bei einem erneuten Versuch geben Sie beim ersten Versuch einen Schlüssel mit und verwenden ihn wieder, wenn Sie es erneut versuchen. Unter Idempotency finden Sie ein Beispiel und die Grenzen für Wiederholungen.
3. Verfolgen Sie die Zustellung
Rufen Sie die Nachricht per GET über ihre em_-ID ab und verfolgen Sie, wie der Status von accepted über processed zu delivered wechselt. Wählen Sie erneut den Tab cURL:
const msg = await bird.email.get("em_abc123");
msg.status; // "accepted" | "processed" | "delivered" | "bounced" | …
msg.delivered_count;
msg.bounced_count;
console.log(msg.subject, msg.subject_recipient_id);message = client.email.get("em_abc123")
print(message.id, message.status, message.delivered_count)
print(message.subject, message.subject_recipient_id)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)
fmt.Println(msg.Subject)
if msg.SubjectRecipientId != nil {
fmt.Println(*msg.SubjectRecipientId)
}
}$message = $bird->email->get('em_01krdgeqcxet5s7t44vh8rt9mg');
echo $message->getStatus();
echo $message->getSubject(), ' ', $message->getSubjectRecipientId();bird email get <message-id>curl https://us1.platform.bird.com/v1/email/messages/em_01ky7ma8y2es1s2akzk53tmjn0 \
-H "Authorization: Bearer $BIRD_API_KEY"Da der Empfänger die delivered@messagebird.dev-Sandbox-Adresse ist, ist die Zustellung garantiert: Die Nachricht durchläuft die echte Pipeline von Bird, erreicht aber nie ein echtes Postfach.
Nächste Schritte
- Referenz zur E-Mail-API: das vollständige Anfrage- und Antwortschema.
- Authentifizierung: Schlüssel, Scopes und der
Authorization-Header. - Ihre erste E-Mail senden: derselbe Ablauf mit dem Dashboard und den SDKs.
- Absenderdomains: Verifizieren Sie Ihre eigene Domain für den Versand im Produktivbetrieb.
Verwandte Ressourcen
Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema.