有人发送到你已开通号码的每条消息都会以 HMAC 签名 webhook 形式送达。读取文本、从同一号码回复,并让 Bird 替你处理 STOP 和 HELP。在你已经在使用的发送 API 上构建会话式流程和自动回复。
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
入站只是又一个 webhook。
双向是 Bird SMS API 的一部分。当有人给你的号码发短信时,你会在同一个已签名、防重放的端点上收到一个 sms.received 事件,而该端点已经在承载你的投递回执。无需第二次集成,也无需轮询——验证一次签名,按 type 进行分支。
监听有回复回来的内容。
一条入站消息和一次退订都是事件,与投递回执相同。验证一个签名,按 type 进行分支,并在你已经写好的处理程序中处理每一个。
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 });
}在每个 Bird 渠道上负载都是相同的信封:一个 evt_ id、一个 HMAC 签名,以及一个防重放的时间戳。
sms.received一条入站消息落到了你的号码上——携带发送者、你的号码和文本。sms.delivered你发送的一条回复到达了手机(运营商 DLR)。sms.opted_out发送者发送了 STOP——Bird 已抑制他们并阻止后续发送。
一条完整的已签名入站消息。
这就是一个 sms.received 事件在传输中的样子。from 是给你发短信的人,to 是你已开通的号码,而 segments 和 encoding 的报告方式与发送时相同,因此一条很长的入站回复永远不会出乎意料。
{
"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
}
}从同一号码回复。
一次回复就是一次把 from 和 to 互换的发送。把 from 设为你的号码、to 设为原始发送者,会话便始终保持在同一号码上,因此接收方看到的是一个会话线程,而不是每次都换一个新的发送者。在此之上构建自动回复、确认或完整的会话式流程。
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 和 START 均由我们为你处理。
Bird 会在保留关键字到达你的处理程序之前识别它们:STOP 会将发送方加入你的抑制列表并触发 sms.opted_out,HELP 会返回自动帮助回复,START 则让其重新订阅。之后发往被抑制号码的消息会被自动拦截。你仍然可以为 YES、BOOK 或流程所需的任何内容保留自己的关键字。完整的关键字与退订规则见 退订处理。