

























1+---
2+summary: "Twilio SMS channel setup, access controls, and webhook configuration"
3+read_when:
4+ - You want to connect OpenClaw to SMS through Twilio
5+ - You need SMS webhook or allowlist setup
6+title: "SMS"
7+---
8+9+OpenClaw can receive and send SMS through a Twilio phone number or Messaging Service. The Gateway registers an inbound webhook route, validates Twilio request signatures by default, and sends replies back through Twilio's Messages API.
10+11+<CardGroup cols={3}>
12+ <Card title="Pairing" icon="link" href="/channels/pairing">
13+Default DM policy for SMS is pairing.
14+ </Card>
15+ <Card title="Gateway security" icon="shield" href="/gateway/security">
16+Review webhook exposure and sender access controls.
17+ </Card>
18+ <Card title="Channel troubleshooting" icon="wrench" href="/channels/troubleshooting">
19+Cross-channel diagnostics and repair playbooks.
20+ </Card>
21+</CardGroup>
22+23+## Quick setup
24+25+<Steps>
26+ <Step title="Create or choose a Twilio sender">
27+In Twilio, choose an SMS-capable phone number or Messaging Service. Save the Account SID, Auth Token, and sender value.
28+ </Step>
29+30+ <Step title="Configure the SMS channel">
31+32+```json5
33+{
34+ channels: {
35+ sms: {
36+ enabled: true,
37+ accountSid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
38+ authToken: "twilio-auth-token",
39+ fromNumber: "+15551234567",
40+ publicWebhookUrl: "https://gateway.example.com/webhooks/sms",
41+ dmPolicy: "pairing",
42+ },
43+ },
44+}
45+```
46+47+Env fallbacks for the default account:
48+`TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `TWILIO_PHONE_NUMBER` or `TWILIO_SMS_FROM` or `TWILIO_MESSAGING_SERVICE_SID`, and `SMS_PUBLIC_WEBHOOK_URL`.
49+50+ </Step>
51+52+ <Step title="Point Twilio at the Gateway webhook">
53+Set the Twilio Messaging webhook for incoming messages to:
54+55+```text
56+https://gateway.example.com/webhooks/sms
57+```
58+59+Use HTTP `POST`. The default local path is `/webhooks/sms`; change `channels.sms.webhookPath` if you need a different route.
60+61+ </Step>
62+63+ <Step title="Start the Gateway and approve first sender">
64+65+```bash
66+openclaw gateway
67+openclaw pairing list sms
68+openclaw pairing approve sms <CODE>
69+```
70+71+Pairing codes expire after 1 hour.
72+73+ </Step>
74+</Steps>
75+76+## Access control
77+78+`channels.sms.dmPolicy` controls direct SMS access:
79+80+- `pairing` (default)
81+- `allowlist` (requires at least one sender in `allowFrom`)
82+- `open` (requires `allowFrom` to include `"*"`)
83+- `disabled`
84+85+`allowFrom` entries should be E.164 phone numbers such as `+15551234567`. `sms:` prefixes are accepted and normalized. For a private assistant, prefer `dmPolicy: "allowlist"` with explicit phone numbers.
86+87+## Sending SMS
88+89+Outbound SMS targets use the `sms:` service prefix with the SMS channel selected:
90+91+```bash
92+openclaw message send --channel sms --target sms:+15551234567 --message "hello"
93+```
94+95+When channel selection is implicit, `twilio-sms:+15551234567` selects this channel without taking over the existing channel-owned `sms:` service prefix used by iMessage.
96+97+Agent replies from inbound SMS conversations automatically go back to the sender through the configured Twilio sender.
98+99+Set `channels.sms.defaultTo` when operator-initiated sends should have a default phone number if no explicit target is provided.
100+101+Use `messagingServiceSid` instead of `fromNumber` when Twilio should choose the sender through a Messaging Service:
102+103+```json5
104+{
105+ channels: {
106+ sms: {
107+ accountSid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
108+ authToken: "twilio-auth-token",
109+ messagingServiceSid: "MGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
110+ publicWebhookUrl: "https://gateway.example.com/webhooks/sms",
111+ },
112+ },
113+}
114+```
115+116+If both are present after defaults/env resolution, `fromNumber` is used.
117+118+## Webhook security
119+120+By default, OpenClaw validates `X-Twilio-Signature` using `publicWebhookUrl` and `authToken`. Keep `publicWebhookUrl` byte-for-byte aligned with the URL configured in Twilio, including scheme, host, path, and query string.
121+122+For local tunnel testing only, you can set:
123+124+```json5
125+{
126+ channels: {
127+ sms: {
128+ dangerouslyDisableSignatureValidation: true,
129+ },
130+ },
131+}
132+```
133+134+Do not use disabled signature validation on a public Gateway.
135+136+## Multi-account config
137+138+Use `accounts` when you operate more than one Twilio number:
139+140+```json5
141+{
142+ channels: {
143+ sms: {
144+ accounts: {
145+ support: {
146+ enabled: true,
147+ accountSid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
148+ authToken: "twilio-auth-token",
149+ fromNumber: "+15551234567",
150+ publicWebhookUrl: "https://gateway.example.com/webhooks/sms/support",
151+ webhookPath: "/webhooks/sms/support",
152+ dmPolicy: "allowlist",
153+ allowFrom: ["+15557654321"],
154+ },
155+ },
156+ },
157+ },
158+}
159+```
160+161+Each account should use a distinct `webhookPath`.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。