SMS senden

Eine API für jeden Text, den Sie senden.

Eingerichtet in:
Cursor

Senden Sie eine Nachricht oder hundert über dieselbe SMS-API. Das SDK zählt Segmente vor dem Versand, wählt GSM-7 oder Unicode für Sie, und jeder Versand ist idempotent mit einem Webhook bei jedem Zustellungsstatus.

send-otp.ts
200 · 0.4s
import { BirdClient } from "@messagebird/sdk";

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

const code = generateOtp();

const { data, error } = await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: `Your Bird verification code is ${code}. Reply STOP to opt out.`,
}).safe();

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

Today at 2:14 PM

Hey Ada — your Bird sign-in code is 482917. It'll expire in 10 minutes. Don't share it with anyone.
482917
Delivered

Senden Sie Ihre erste SMS in fünf Minuten.

Aus der Sprache, die Sie bereits verwenden.

Das Senden ist der Kern der Bird SMS-API. Der erste Versand geht an einen autorisierten Testempfänger (+15005550006), sodass Sie einen CI-Check ausliefern und Webhooks verdrahten können, bevor Sie eine Nummer bereitstellen.

1
2
3
4
5
6
7
8
9
import { BirdClient } from "@messagebird/sdk";

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

const { data, error } = await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: "Hello from Node.",
}).safe();

Fünf Dinge, die Sie nicht selbst bauen.

Derselbe Vertrag auf jedem Bird-Kanal.

  1. 01

    Segmentzählung vor dem Versand.

    Das SDK misst die kodierte Länge und sagt Ihnen, wie viele Segmente eine Nachricht kostet, sodass ein verirrtes Zeichen nie stillschweigend einen Text in drei aufteilt.

  2. 02

    GSM-7 und Unicode, für Sie entschieden.

    Klartext fährt auf GSM-7; ein Emoji oder eine nicht-lateinische Schrift kippt die gesamte Nachricht auf UCS-2. Bird wählt die Kodierung und warnt Sie, wenn ein einzelnes Zeichen die Kosten ändert.

  3. 03

    In einem Aufruf bündeln.

    Senden Sie viele unabhängige Nachrichten in einer Anfrage, jede mit eigenem Empfänger und Text, als Einheit validiert, sodass Sie nie halb senden.

  4. 04

    Idempotent per Vertrag.

    Jeder Versand akzeptiert einen Idempotenz-Key, sodass eine erneut versuchte Anfrage nach einem Timeout das ursprüngliche Ergebnis liefert, statt jemandem zweimal zu schreiben.

  5. 05

    Ein Webhook bei jeder Statusänderung.

    In Warteschlange, gesendet, zugestellt, fehlgeschlagen. Jeder HMAC-signiert, replay-geschützt, idempotent, dasselbe Envelope auf jedem Kanal.

Senden Sie bereits anderswo? Wechseln Sie den Client, behalten Sie den Aufruf.

Die Struktur ändert sich kaum: Tauschen Sie den Client, behalten Sie Ihr from, to und text, richten Sie Ihre Webhooks auf einen Endpunkt. Dasselbe Auth-Modell wie bei Ihren E-Mail-, Voice- und WhatsApp-Sendungen.

twilio.ts
Twilio
import twilio from "twilio";

const client = twilio(accountSid, authToken);

await client.messages.create({
  from: "+14155550172",
  to:   "+15005550006",
  body: "Your code is 123456.",
});
bird.ts
Bird
import { BirdClient } from "@messagebird/sdk";

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

await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: "Your code is 123456.",
});

Kennen Sie die Kosten, bevor der Carrier sie kennt.

Eine GSM-7-Nachricht fasst 160 Zeichen pro Segment; ein einzelnes Emoji oder nicht-lateinisches Zeichen kippt die gesamte Nachricht auf UCS-2 und senkt das auf 70. Das SDK meldet die Kodierung und Segmentanzahl bei jedem Versand, sodass die Abrechnung nie eine Überraschung ist und eine verkettete Nachricht immer eine bewusste Wahl bleibt.

segments.ts
200 · 1 segment
const { data } = await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: "Your code is 123456.",
}).safe();

console.log(data.encoding); // → "GSM-7"
console.log(data.segments); // → 1

Eine Nachricht oder hundert, ein Aufruf.

Bündeln Sie unabhängige Nachrichten in einer Anfrage, jede mit eigenem Empfänger und Text. Der Batch wird als Einheit validiert: Eine fehlerhafte Nummer weist den Aufruf mit einem 422 ab, sodass Sie nie halb senden. Ein einzelner Idempotenz-Key macht die gesamte Anfrage sicher wiederholbar.

reminders.ts
202 · batch
const { data: batch, error } = await bird.sms
  .sendBatch(
    users.map((u) => ({
      from: "Bird",
      to:   u.phone,
      text: `Hi ${u.name}, your appointment is tomorrow at ${u.time}.`,
    })),
    { idempotencyKey: `reminders-${runId}` },
  )
  .safe();

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

Verfolgen Sie jede Nachricht durch ihr ganzes Leben.

Ein Versand liefert sofort 202 zurück; das Ergebnis trifft als Webhook ein. Verifizieren Sie eine Signatur, verzweigen Sie auf den Typ: dasselbe Envelope, das Sie bereits für E-Mail, Voice und WhatsApp behandeln.

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 "sms.delivered":
      await markDelivered(event.data.sms_id);
      break;
    case "sms.failed":
      await flag(event.data.to, event.data.reason);
      break;
  }

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

Fehlgeschlagene Sendungen und STOP-Antworten aktualisieren Ihre Sperrliste automatisch, sodass eine fehlerhafte Nummer Sie nie zweimal kostet.

  • sms.queuedVon der API akzeptiert und für die Carrier-Übergabe in die Warteschlange gestellt.
  • sms.sentAn das SMSC des Ziel-Carriers übermittelt.
  • sms.deliveredZustellbestätigung vom Carrier erhalten (DLR).
  • sms.failedDauerhafter Fehler — Carrier-Ablehnung, ungültige Nummer oder Sperrtreffer.

Vertiefen Sie sich in der Dokumentation.

Verdrahten Sie Webhooks, machen Sie jeden Versand mit Idempotenz-Keys sicher wiederholbar und lesen Sie die Fehlerreferenz, damit Sie jeden Fehlschlag auf die richtige Weise behandeln.

SMS-Versand-FAQ

Wie lang darf eine SMS sein?+
Eine GSM-7-Nachricht fasst 160 Zeichen pro Segment; der Wechsel zu Unicode (UCS-2) für Emoji oder nicht-lateinische Schriften senkt das auf 70. Längere Nachrichten werden über Segmente hinweg verkettet, und das SDK meldet die Anzahl, bevor Sie senden.
Kann ich in einer Anfrage an viele Empfänger senden?+
Ja. Bündeln Sie unabhängige Nachrichten in einem einzigen Aufruf, jede mit eigenem Empfänger und Text. Der Batch wird als Einheit validiert, und ein Idempotenz-Key deckt die gesamte Anfrage ab.
Was passiert, wenn ich einen Versand nach einem Timeout erneut versuche?+
Übergeben Sie einen Idempotenz-Key, und eine erneut versuchte Anfrage liefert das ursprüngliche Ergebnis zurück, statt zweimal zu senden. Ohne einen wird ein erneuter Versuch als neue Nachricht behandelt.
Woher weiß ich, ob eine Nachricht zugestellt wurde?+
Jede Statusänderung löst einen HMAC-signierten Webhook aus — in Warteschlange, gesendet, zugestellt oder fehlgeschlagen — der die Carrier-Zustellbestätigung und die Segmentanzahl trägt.

Etwa 40% der weltweiten kommerziellen SMS laufen bereits über Bird.

Das Senden ist eine Funktion der Bird SMS-API: Nummern, eingehende Zwei-Wege-Kommunikation, Compliance, Routing und Analytics gehören dazu, auf einer Infrastruktur, die wir seit einem Jahrzehnt betreiben.

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Sie nutzen Claude Code, Cursor oder Codex? Kopieren Sie einen Setup-Prompt und Ihr Agent installiert die Bird CLI und Skills für Sie. Wählen Sie Ihren:

Cursor