Wysyłka email

Jedno API dla każdego emaila, który wysyłasz.

Skonfiguruj w:
Cursor

Transakcyjne czy marketingowe, jedna wiadomość czy sto, wysyłane przez to samo Email API, z wbudowaną idempotencją, listą wykluczeń i webhookami. Przekaż surowy HTML lub wyrenderuj swoje szablony React Email.

welcome.tsx
200 · 1.2s
import { BirdClient } from "@messagebird/sdk";
import { render } from "@react-email/render";
import { WelcomeEmail } from "./emails/welcome";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.email.send({
  from:    "Bird <hello@bird.com>",
  to:      ["ada@example.com"],
  subject: "Your invite is ready",
  html:    await render(<WelcomeEmail name="Ada" />),
}).safe();

if (error) throw error;
console.log(data.id);
// → "em_2bX91Yk8h..."

Wyślij pierwszy email w pięć minut.

W języku, którego już używasz.

Wysyłanie to rdzeń Bird Email API. Pierwszą wiadomość możesz wysłać na adres sandbox (delivered@messagebird.dev), aby przetestować całą platformę (wysyłki, webhooki, supresję), zanim zweryfikujesz domenę.

1
2
3
4
5
6
7
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"

Pięć rzeczy, których nie budujesz sam.

Ten sam kontrakt na każdym kanale Bird.

  1. 01

    Transakcyjny i marketingowy.

    Ten sam endpoint wysyła reset hasła i kampanię. Pole kategorii decyduje, jak stosowane są wykluczenia i wypisy z subskrypcji.

  2. 02

    Szablony po swojemu.

    Przekaż surowy HTML, wyrenderuj szablony React Email do HTML w swojej aplikacji i wyślij wynik, albo wskaż zapisany szablon, a my go wyrenderujemy za Ciebie. Twój toolchain — bez zmian.

  3. 03

    Wysyłka wsadowa do 100.

    Do 100 niezależnych wiadomości na wywołanie, każda z własnym odbiorcą i zmiennymi, walidowanych jako jedna całość, więc nigdy nie wysyłasz połowicznie.

  4. 04

    Idempotentny z kontraktu.

    Każda wysyłka przyjmuje klucz idempotencji, więc ponowione żądanie po przekroczeniu limitu czasu zwraca pierwotny wynik zamiast wysyłać podwójnie.

  5. 05

    Webhook przy każdej zmianie stanu.

    Przyjęto, dostarczono, otwarto, kliknięto, odbicie, skarga. Każde zdarzenie podpisane HMAC, zabezpieczone przed powtórzeniem, idempotentne, ta sama koperta na każdym kanale.

Już wysyłasz gdzie indziej? Przejdź w jedno popołudnie.

Wywołanie, które już wykonujesz, ledwo się zmienia: podmień klienta, zachowaj szablony, skieruj webhooki na jeden endpoint. Przewodniki migracji obejmują SendGrid, Amazon SES, Mailgun i Resend.

sendgrid.ts
SendGrid
import sgMail from "@sendgrid/mail";

sgMail.setApiKey(process.env.SENDGRID_API_KEY!);

await sgMail.send({
  from:    "hello@yourdomain.com",
  to:      "delivered@messagebird.dev",
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});
bird.ts
Bird
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

await bird.email.send({
  from:    "hello@yourdomain.com",
  to:      ["delivered@messagebird.dev"],
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});

Jedna wiadomość czy sto, jedno wywołanie.

Złącz wsadowo do 100 niezależnych wiadomości w jednym żądaniu, każda z własnym odbiorcą i zmiennymi. Wsad jest walidowany jako całość: jedna błędna wiadomość odrzuca wywołanie z kodem 422, więc nigdy nie wyślesz połowicznie. Pojedynczy klucz idempotencji sprawia, że całe żądanie można bezpiecznie ponowić.

digest.ts
202 · batch
import { BirdClient } from "@messagebird/sdk";
import { render } from "@react-email/render";
import { Digest } from "./emails/digest";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const messages = await Promise.all(
  users.map(async (u) => ({
    from:    "Acme <hello@yourdomain.com>",
    to:      [u.email],
    subject: "Your weekly digest",
    html:    await render(<Digest user={u} />),
  })),
);

const { data: batch, error } = await bird.email
  .sendBatch(messages, { idempotencyKey: `digest-${runId}` })
  .safe();

if (error) throw error;
console.log(`queued ${batch.data.length} messages`);

Dołącz własny kontekst do każdej wysyłki.

Tagi to pełnoprawny, filtrowalny wymiar: dziel dostarczalność i zaangażowanie według kampanii, szablonu lub eksperymentu w stats API (do 20 na wiadomość). Metadane to dowolny JSON, do 2 KB, który wraca nietknięty przy każdym odczycie i webhooku, więc Twoje własne identyfikatory podróżują razem z wiadomością.

tagged.ts
await bird.email.send({
  from:     "Acme <hello@yourdomain.com>",
  to:       ["delivered@messagebird.dev"],
  subject:  "Your invite is ready",
  html:     "<p>Welcome aboard, Ada.</p>",
  tags:     [{ name: "campaign", value: "spring-2026" }],
  metadata: { user_id: "u_2bX91", order_id: "ord_5512" },
});

Obserwuj każdą wiadomość przez całe jej życie.

Wysyłka zwraca natychmiast 202; wynik przychodzi jako webhook dla każdego odbiorcy. Zweryfikuj jeden podpis, rozgałęź według typu: ta sama koperta, którą już obsługujesz dla SMS, voice i WhatsApp.

app/api/webhooks/bird/route.ts
signed
import { bird } from "@/lib/bird";

export async function POST(req: Request) {
  const event = bird.webhooks.unwrap(
    await req.text(),
    Object.fromEntries(req.headers),
  );

  switch (event.type) {
    case "email.delivered":
      await markDelivered(event.data.email_id);
      break;
    case "email.bounced":
      await flag(event.data.recipient, event.data.bounce_type);
      break;
  }

  return new Response(null, { status: 204 });
}

Twarde odbicia, skargi i wypisy z subskrypcji również automatycznie aktualizują Twoją listę wykluczeń, więc błędny adres nigdy nie kosztuje Cię reputacji dwukrotnie.

  • email.acceptedWysyłka została zaakceptowana i jest przygotowywana do dostarczenia.
  • email.processedW kolejce do serwera pocztowego odbiorcy.
  • email.deliveredSerwer pocztowy odbiorcy zaakceptował wiadomość.
  • email.deferredTymczasowo odrzucona — ponowimy próbę.
  • email.bouncedTrwałe niepowodzenie: typ odrzucenia i kod SMTP w ładunku.
  • email.openedOdbiorca otworzył wiadomość. Może wystąpić więcej niż raz.
  • email.clickedOdbiorca kliknął śledzony link.
  • email.complainedOdbiorca zgłosił wiadomość jako spam.
  • email.unsubscribedOdbiorca zrezygnował z subskrypcji przez śledzony link rezygnacji.

Przetestuj każdy wynik, zanim wejdziesz na żywo.

W sandboxie to adres odbiorcy decyduje o wyniku, nie stan Twojego konta. Wyślij na delivered@messagebird.dev, aby uzyskać poprawne dostarczenie, lub na bounce@, softbounce@, deferred@, complaint@ i suppressed@, aby przetestować każdą ścieżkę błędu przez prawdziwy pipeline i prawdziwe webhooki. Bez domeny do weryfikacji, bez ryzyka dla Twojej reputacji. Produkcja jest celowo ograniczona: najpierw weryfikujesz domenę, a nowa domena lub dedykowane IP przechodzi przez rozgrzewkę, zanim zacznie obsługiwać pełny wolumen.

Zgłęb temat w dokumentacji.

Przeczytaj przewodnik po wysyłce, podłącz zdarzenia e-mail i webhooki, a jeśli przechodzisz od innego dostawcy, skorzystaj z przewodnika migracji z SendGrid, SES, Mailgun lub Resend.

Około 40% komercyjnej poczty e-mail na świecie już działa na Bird.

E-maile transakcyjne i marketingowe na infrastrukturze, którą prowadzimy od dekady. Wysyłka to jedna z możliwości Bird Email API: dostarczalność, dedykowane adresy IP, lista wykluczeń i analityka są w komplecie.

Zacznij od jednego kanału.
Dodaj kolejne, gdy będziesz gotowy.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i weryfikacji nadawcy.

Używasz Claude Code, Cursor lub Codex? Skopiuj prompt konfiguracyjny, a Twój agent zainstaluje za Ciebie Bird CLI i umiejętności. Wybierz swój:

Cursor