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-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

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

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

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.",
}).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.queuedGeaccepteerd 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 — carrierweigering, ongeldig nummer of suppressietreffer.

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.

SMS verzenden FAQ

Hoe lang mag een SMS zijn?+
Een GSM-7-bericht past 160 tekens per segment; overschakelen naar Unicode (UCS-2) voor emoji of niet-Latijnse schriften verlaagt dat naar 70. Langere berichten worden samengevoegd over segmenten, en de SDK rapporteert het aantal voordat je verstuurt.
Kan ik in één request naar veel ontvangers versturen?+
Ja. Batch onafhankelijke berichten in één call, elk met zijn eigen ontvanger en text. De batch valideert als één geheel, en één idempotency key dekt het hele request.
Wat gebeurt er als ik een verzending opnieuw probeer na een timeout?+
Geef een idempotency key mee en een herhaald request geeft het oorspronkelijke resultaat terug in plaats van twee keer te versturen. Zonder key wordt een retry behandeld als een nieuw bericht.
Hoe weet ik of een bericht is afgeleverd?+
Elke statuswijziging vuurt een HMAC-ondertekende webhook af — queued, sent, delivered of failed — met de carrier delivery receipt en het segmentaantal.

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