Hermes connects to SMS through the Twilio API. People text your Twilio phone number and get AI responses back — same conversational experience as Telegram or Discord, but over standard text messages.
Info: Shared Credentials
The SMS gateway shares credentials with the optional telephony skill. If you’ve already set up Twilio for voice calls or one-off SMS, the gateway works with the same TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER.
Twilio needs to know where to send incoming messages. In the Twilio Console:
Go to Phone Numbers → Manage → Active Numbers
Click your phone number
Under Messaging → A MESSAGE COMES IN, set:
Webhook: https://your-server:8080/webhooks/twilio
HTTP Method: POST
Tip: Exposing Your Webhook
If you’re running Hermes locally, use a tunnel to expose the webhook:
Terminal window
# Using cloudflared
cloudflaredtunnel--urlhttp://localhost:8080
# Using ngrok
ngrokhttp8080
Set the resulting public URL as your Twilio webhook.
Set SMS_WEBHOOK_URL to the same URL you configured in Twilio. This is required for Twilio signature validation — the adapter will refuse to start without it:
Terminal window
# Must match the webhook URL in your Twilio Console
Hermes validates that inbound webhooks genuinely originate from Twilio by verifying the X-Twilio-Signature header (HMAC-SHA1). This prevents attackers from injecting forged messages.
SMS_WEBHOOK_URL is required. Set it to the public URL configured in your Twilio Console. The adapter will refuse to start without it.
For local development without a public URL, you can disable validation:
The gateway denies all users by default. Configure an allowlist:
Terminal window
# Recommended: restrict to specific phone numbers
SMS_ALLOWED_USERS=+15559876543,+15551112222
# Or allow all (NOT recommended for bots with terminal access)
SMS_ALLOW_ALL_USERS=true
Warning
SMS has no built-in encryption. Don’t use SMS for sensitive operations unless you understand the security implications. For sensitive use cases, prefer Signal or Telegram.