Wysyłaj SMS

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

Skonfiguruj w:
Cursor

Wyślij jedną wiadomość albo sto przez to samo API SMS. SDK liczy segmenty przed wysyłką, wybiera za Ciebie GSM-7 lub Unicode, a każda wysyłka jest idempotentna z webhookiem na każdym stanie dostarczenia.

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

Wyślij swój pierwszy SMS w pięć minut.

Z języka, którego już używasz.

Wysyłanie to rdzeń API SMS od Bird. Pierwsza wysyłka trafia do dopuszczonego odbiorcy testowego (+15005550006), więc możesz dostarczyć test CI i podłączyć webhooki, zanim udostępnisz numer.

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();

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

Ten sam kontrakt na każdym kanale Bird.

  1. 01

    Liczenie segmentów przed wysyłką.

    SDK mierzy zakodowaną długość i mówi Ci, ile segmentów kosztuje wiadomość, więc zabłąkany znak nigdy po cichu nie rozdzieli jednego tekstu na trzy.

  2. 02

    GSM-7 i Unicode, rozstrzygane za Ciebie.

    Zwykły tekst jedzie na GSM-7; emoji lub pismo niełacińskie przerzuca całą wiadomość na UCS-2. Bird wybiera kodowanie i ostrzega Cię, gdy pojedynczy znak zmienia koszt.

  3. 03

    Wsad w jednym wywołaniu.

    Wyślij wiele niezależnych wiadomości w jednym żądaniu, każda z własnym odbiorcą i tekstem, walidowanych jako całość, więc nigdy nie wysyłasz połowicznie.

  4. 04

    Idempotentne z kontraktu.

    Każda wysyłka przyjmuje klucz idempotencji, więc ponowione żądanie po przekroczeniu czasu zwraca oryginalny wynik zamiast wysłać do kogoś SMS dwa razy.

  5. 05

    Webhook na każdej zmianie stanu.

    Queued, sent, delivered, failed. Każdy podpisany HMAC, chroniony przed powtórzeniem, idempotentny, ta sama koperta na każdym kanale.

Już wysyłasz gdzie indziej? Zmień klienta, zachowaj wywołanie.

Kształt prawie się nie zmienia: podmień klienta, zachowaj pola from, to i text, skieruj swoje webhooki na jeden endpoint. Ten sam model uwierzytelniania co Twoje wysyłki e-mail, głosowe i WhatsApp.

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.",
});

Poznaj koszt, zanim pozna go operator.

Wiadomość GSM-7 mieści 160 znaków na segment; pojedyncze emoji lub znak niełaciński przerzuca całą wiadomość na UCS-2 i obniża to do 70. SDK raportuje kodowanie i liczbę segmentów przy każdej wysyłce, więc rozliczenie nigdy nie jest niespodzianką, a połączona wiadomość jest zawsze świadomym wyborem.

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

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

Połącz wsadowo niezależne wiadomości w jednym żądaniu, każda z własnym odbiorcą i tekstem. Wsad jest walidowany jako całość: jeden zły numer odrzuca wywołanie z kodem 422, więc nigdy nie wysyłasz połowicznie. Pojedynczy klucz idempotencji sprawia, że całe żądanie jest bezpieczne do ponowienia.

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`);

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

Wysyłka zwraca 202 natychmiast; wynik przychodzi jako webhook. Zweryfikuj jeden podpis, rozgałęź na typie: ta sama koperta, którą już obsługujesz dla e-maila, głosu 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 "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 });
}

Nieudane wysyłki i odpowiedzi STOP aktualizują Twoją listę blokowanych automatycznie, więc zły numer nigdy nie kosztuje Cię dwa razy.

  • sms.queuedPrzyjęta przez API i zakolejkowana do przekazania operatorowi.
  • sms.sentPrzekazana do SMSC operatora docelowego.
  • sms.deliveredPotwierdzenie dostarczenia otrzymane od operatora (DLR).
  • sms.failedTrwała awaria — odrzucenie przez operatora, nieprawidłowy numer lub trafienie na listę blokowanych.

Zagłęb się w dokumentacji.

Podłącz webhooki, uczyń każdą wysyłkę bezpieczną do ponowienia za pomocą kluczy idempotencji i przeczytaj opis błędów, abyś obsłużył każdą awarię we właściwy sposób.

FAQ dotyczące wysyłania SMS

Jak długi może być SMS?+
Wiadomość GSM-7 mieści 160 znaków na segment; przejście na Unicode (UCS-2) dla emoji lub pism niełacińskich obniża to do 70. Dłuższe wiadomości są łączone z segmentów, a SDK raportuje ich liczbę, zanim wyślesz.
Czy mogę wysłać do wielu odbiorców w jednym żądaniu?+
Tak. Połącz wsadowo niezależne wiadomości w jednym wywołaniu, każda z własnym odbiorcą i tekstem. Wsad jest walidowany jako całość, a jeden klucz idempotencji obejmuje całe żądanie.
Co się dzieje, jeśli ponowię wysyłkę po przekroczeniu czasu?+
Przekaż klucz idempotencji, a ponowione żądanie zwróci oryginalny wynik zamiast wysłać dwukrotnie. Bez niego ponowienie jest traktowane jako nowa wiadomość.
Skąd mam wiedzieć, czy wiadomość została dostarczona?+
Każda zmiana stanu wyzwala webhook podpisany HMAC — queued, sent, delivered lub failed — niosący potwierdzenie dostarczenia od operatora i liczbę segmentów.

Około 40% komercyjnego ruchu SMS na świecie już działa na Bird.

Wysyłanie to jedna z możliwości API SMS od Bird: numery, ruch przychodzący dwukierunkowy, zgodność, routing i analityka są dostarczane wraz z nim, na infrastrukturze, którą prowadzimy od dekady.

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