Two-way

Berichten komen terug. Handel ze dus af.

Klaar in:
Cursor

Elk bericht dat iemand naar je geprovisioneerde nummer stuurt, komt binnen als een HMAC-ondertekende webhook. Lees de text, antwoord vanaf hetzelfde nummer, en laat Bird STOP en HELP voor je afhandelen. Bouw conversationele flows en auto-replies op de API waarmee je al verstuurt.

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

Inbound is gewoon nog een webhook.

Two-way is onderdeel van de Bird SMS API. Wanneer iemand je nummer sms't, krijg je een sms.received-event op hetzelfde ondertekende, replay-beschermde endpoint dat al je delivery receipts draagt. Er is geen tweede integratie en geen polling — verifieer de signature één keer en schakel op het type.

Luister naar wat terugkomt.

Een inkomend bericht en een opt-out zijn events, net als een delivery receipt. Verifieer één signature, schakel op het type, en handel elk af in de handler die je al schreef.

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.received":
      await handleInbound(event.data.from, event.data.text);
      break;
    case "sms.opted_out":
      await removeFromCampaigns(event.data.from);
      break;
  }

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

De payload is dezelfde envelope op elk Bird-kanaal: een evt_-id, een HMAC-signature, en een replay-beschermde timestamp.

  • sms.receivedEen inkomend bericht landde op je nummer — draagt de afzender, je nummer en de text.
  • sms.deliveredEen antwoord dat je verstuurde bereikte het toestel (carrier DLR).
  • sms.opted_outDe afzender sms'te STOP — Bird onderdrukte hen en blokkeert toekomstige verzendingen.

Een ondertekend inkomend bericht, volledig.

Zo ziet een sms.received-event er op de lijn uit. De from is wie je sms'te, de to is je geprovisioneerde nummer, en segments en encoding worden op dezelfde manier gerapporteerd als bij een verzending, zodat een lang inkomend antwoord nooit een verrassing is.

sms.received
evt_
{
  "id": "evt_7nQ9xLp2aR...",
  "type": "sms.received",
  "created_at": "2026-06-26T14:03:11Z",
  "data": {
    "id": "sms_5hV02Mr3n...",
    "from": "+15005550006",
    "to": "+14155550172",
    "text": "YES book me in for Thursday",
    "encoding": "GSM-7",
    "segments": 1
  }
}

Antwoord vanaf hetzelfde nummer.

Een antwoord is een verzending met from en to omgewisseld. Zet from op je nummer en to op de oorspronkelijke afzender, en het gesprek blijft op één nummer, zodat de ontvanger een thread ziet in plaats van elke keer een nieuwe afzender. Bouw daarbovenop auto-replies, bevestigingen of een volledige conversationele flow.

reply.ts
200 · reply
async function handleInbound(from: string, text: string) {
  if (/^yes\b/i.test(text)) {
    const { error } = await bird.sms.send({
      from: "+14155550172", // your two-way number
      to:   from,           // reply to the sender
      text: "Booked. See you Thursday at 10am.",
    }).safe();

    if (error) throw error;
  }
}

STOP, HELP en START handelen we voor je af.

Bird herkent de gereserveerde trefwoorden voordat ze je handler bereiken: STOP zet de afzender op je onderdrukkingslijst en activeert sms.opted_out, HELP stuurt een automatisch hulpantwoord en START schrijft ze weer in. Latere verzendingen naar een onderdrukt nummer worden automatisch geblokkeerd. Je kunt je eigen trefwoorden voor YES, BOOK of wat je flow nodig heeft gewoon behouden. De volledige trefwoord- en opt-outregels staan in opt-outafhandeling.

Twee dingen die je hierna wilt.

Inbound vereist een two-way-capabel nummer — long codes, short codes en toll-free kunnen ontvangen, alfanumerieke sender ID's niet. Voor rijkere heen-en-weer-communicatie op hetzelfde toestel (typing indicators, read receipts, carousels) upgradet RCS het gesprek waar het apparaat het ondersteunt.

Ga dieper in de docs.

Wire webhooks aan voor inbound events, lees de error-referentie voor de fouten die je gaat afhandelen, en bekijk misbruik en compliance voor de keyword- en consentregels.

Two-way SMS FAQ

Hoe bereikt een inkomende SMS mijn app?+
Elk bericht dat naar je geprovisioneerde nummer wordt gestuurd, komt binnen als een HMAC-ondertekende sms.received-webhook. Je verifieert één signature, leest de from, to en text, en routeert het naar je eigen logica — dezelfde envelope die je al afhandelt voor delivery receipts.
Kan ik op een inkomend bericht antwoorden?+
Ja. Antwoord door te versturen vanaf hetzelfde nummer waarop het bericht binnenkwam. Zet from op je nummer en to op de oorspronkelijke afzender, en de thread blijft van begin tot eind op één nummer.
Wat gebeurt er wanneer iemand STOP sms't?+
Bird zet de afzender op je onderdrukkingslijst, activeert sms.opted_out en blokkeert latere verzendingen naar dat nummer automatisch. HELP stuurt een hulpantwoord en START schrijft ze weer in — allemaal afgehandeld voordat het je code bereikt, zodat je compliant blijft zonder zelf de trefwoordlogica te schrijven.
Heb ik een speciaal nummer nodig voor two-way?+
Je hebt een two-way-capabel nummer nodig. Long codes, short codes en toll-free nummers ondersteunen inbound; alfanumerieke sender ID's zijn alleen send-only en kunnen geen antwoorden ontvangen.

Verstuur en ontvang op één nummer, één API.

Two-way inbound is één mogelijkheid van de Bird SMS API: verzenden, nummers, 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