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

Tweerichtingsverkeer is onderdeel van de Bird SMS API. Wanneer iemand uw nummer sms't, ontvangt u een sms.received event op hetzelfde ondertekende, replay-beschermde endpoint dat al uw bezorgbevestigingen verwerkt. Geen tweede integratie en geen polling: verifieer de handtekening éé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 is op uw nummer binnengekomen: bevat de afzender, uw nummer en de tekst.
  • sms.deliveredEen antwoord dat je verstuurde bereikte het toestel (carrier DLR).
  • sms.opted_outDe afzender heeft STOP gestuurd: Bird heeft hen onderdrukt en blokkeert toekomstige berichten.

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

Voor inkomende berichten heeft u een tweerichtings-geschikt nummer nodig: long codes, short codes en gratis nummers kunnen ontvangen, alfanumerieke afzender-ID's niet. Voor rijkere interactie op hetzelfde toestel (typindicatoren, leesbevestigingen, carrousels) upgradet RCS het gesprek waar het apparaat dit 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 uw ingerichte nummer wordt gestuurd, komt binnen als een HMAC-ondertekende sms.received webhook. U verifieert één handtekening, leest de from, to en text, en routeert het naar uw eigen logica — dezelfde envelop die u al verwerkt voor bezorgbevestigingen.
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 voegt de afzender toe aan uw suppressielijst, activeert sms.opted_out en blokkeert automatisch verdere berichten naar dat nummer. HELP stuurt een helpantwoord terug en START meldt hen weer aan — alles wordt afgehandeld voordat het uw code bereikt, zodat u compliant blijft zonder zelf de zoekwoordlogica 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