SMS versturen

Eén API voor elke tekst die je verstuurt.

Klaar in:
Cursor

Verstuur één bericht of honderd via dezelfde SMS API. De SDK telt segmenten vóór verzending, kiest GSM-7 of Unicode voor je, en elke verzending is idempotent met een webhook bij elke afleverstatus.

send-notification.ts
202 · 0.4s
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:     "Your order #4821 has shipped. Track it: bird.ly/t/4821x",
  category: "transactional",
}).safe();

if (error) throw error;
console.log(data.id);
// → "sms_4kT01Lq2m..."
Hi Ada, reminder of your appointment tomorrow at 14:30 with Dr. Kowalski.
Your order #4821 has shipped. Track it: bird.ly/t/4821x
Your subscription renews on 3 Sep for €12/mo. Manage it here: bird.ly/account

Verstuur je eerste SMS in vijf minuten.

Vanuit de taal die je al gebruikt.

Verzenden is de kern van de Bird SMS API. De eerste verzending gaat naar een aangewezen testontvanger (+15005550006), zodat je een CI-check kunt uitrollen en webhooks kunt aansluiten voordat je een nummer provisioneert.

1
2
3
4
5
6
7
const msg = await bird.sms.send({
  from: "+15557654321",
  to: "+14155550100",
  text: "Your verification code is 123456.",
  category: "authentication",
});
console.log(msg.id, msg.status);

Vijf dingen die je niet zelf bouwt.

Hetzelfde contract op elk Bird-kanaal.

  1. 01

    Segmenten tellen vóór verzending.

    De SDK meet de gecodeerde lengte en vertelt je hoeveel segmenten een bericht kost, zodat een verdwaald teken nooit stilletjes één tekst in drieën splitst.

  2. 02

    GSM-7 en Unicode, voor je beslist.

    Platte tekst rijdt op GSM-7; een emoji of niet-Latijns schrift zet het hele bericht om naar UCS-2. Bird kiest de encoding en waarschuwt je wanneer één teken de kosten verandert.

  3. 03

    Batch in één call.

    Verstuur veel onafhankelijke berichten in één request, elk met zijn eigen ontvanger en text, gevalideerd als één geheel zodat je nooit half verstuurt.

  4. 04

    Idempotent volgens contract.

    Elke verzending accepteert een idempotency key, zodat een herhaald request na een timeout het oorspronkelijke resultaat teruggeeft in plaats van iemand twee keer te sms'en.

  5. 05

    Een webhook bij elke statuswijziging.

    Queued, sent, delivered, failed. Elk HMAC-ondertekend, replay-beschermd, idempotent, dezelfde envelope op elk kanaal.

Verstuur je al ergens anders? Wissel de client, behoud de call.

De vorm verandert nauwelijks: wissel de client, behoud je from, to en text, richt je webhooks op één endpoint. Hetzelfde authmodel als je email-, voice- en WhatsApp-verzendingen.

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

Ken de kosten voordat de carrier dat doet.

Een GSM-7-bericht past 160 tekens per segment; één enkele emoji of niet-Latijns teken zet het hele bericht om naar UCS-2 en verlaagt dat naar 70. De SDK rapporteert de encoding en het segmentaantal bij elke verzending, zodat facturering nooit een verrassing is en een samengevoegd bericht altijd een bewuste keuze is.

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

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

Eén bericht of honderd, één call.

Batch onafhankelijke berichten in één request, elk met zijn eigen ontvanger en text. De batch valideert als één geheel: één slecht nummer wijst de call af met een 422, zodat je nooit half verstuurt. Eén enkele idempotency key maakt het hele request veilig om opnieuw te proberen.

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

Volg elk bericht door zijn hele leven.

Een verzending geeft direct 202 terug; de uitkomst arriveert als een webhook. Verifieer één signature, schakel op het type: dezelfde envelope die je al afhandelt voor email, voice en 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 });
}

Mislukte verzendingen en STOP-antwoorden werken je suppressielijst automatisch bij, zodat een slecht nummer je nooit twee keer kost.

  • sms.acceptedGeaccepteerd door de API en in de wachtrij voor de carrieroverdracht.
  • sms.sentIngediend bij de SMSC van de bestemmingscarrier.
  • sms.deliveredDelivery receipt ontvangen van de carrier (DLR).
  • sms.failedPermanente fout: afwijzing door provider, ongeldig nummer of suppressielijst geraakt.

Ga dieper in de docs.

Wire webhooks aan, maak elke verzending veilig om opnieuw te proberen met idempotency keys, en lees de error-referentie zodat je elke fout op de juiste manier afhandelt.

Ongeveer 40% van 's werelds commerciële SMS draait al op Bird.

Verzenden is één mogelijkheid van de Bird SMS API: nummers, two-way inbound, compliance, routering en analytics komen ermee mee, op infrastructuur die we al tien jaar draaien.

Begin met één kanaal.
Voeg de rest toe wanneer je er klaar voor bent.

Een test-API-key is direct beschikbaar. Productietoegang wordt ontgrendeld zodra je een betaalmethode toevoegt en een afzender verifieert.

Gebruik je Claude Code, Cursor of Codex? Kopieer een setup-prompt en je agent installeert de Bird CLI en skills voor je. Kies de jouwe:

Cursor