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.
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
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.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
import twilio from "twilio";
const client = twilio(accountSid, authToken);
await client.messages.create({
from: "+14155550172",
to: "+15005550006",
body: "Your code is 123456.",
});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.
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); // → 1Eé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.
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.
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?+
Kan ik in één request naar veel ontvangers versturen?+
Wat gebeurt er als ik een verzending opnieuw probeer na een timeout?+
Hoe weet ik of een bericht is afgeleverd?+
De rest van het SMS-platform
Eén API, één set keys. Verken de andere mogelijkheden.
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.