Text your openclaw via iMessage or SMS.
- Go to sendblue.com/api and click "Try for free"
- After signing up, verify your phone number in the dashboard (required for free tier)
- Find these three things in your dashboard:
- API Key
- API Secret
- Your Sendblue phone number (e.g.,
+15551234567)
git clone https://github.com/njerschow/openclaw-sendblue ~/.openclaw/extensions/sendblue
cd ~/.openclaw/extensions/sendblue
npm install && npm run buildAdd this to ~/.openclaw/openclaw.json:
{
"plugins": {
"entries": {
"sendblue": {
"enabled": true,
"config": {
"apiKey": "paste-your-api-key",
"apiSecret": "paste-your-api-secret",
"phoneNumber": "+15551234567",
"allowFrom": ["+15559876543"]
}
}
}
}
}Replace:
| Field | What to put |
|---|---|
apiKey |
Your Sendblue API key |
apiSecret |
Your Sendblue API secret |
phoneNumber |
The Sendblue number (from your dashboard) |
allowFrom |
Your phone number (the one you'll text from) |
Phone numbers must start with +1 (e.g., +15551234567).
openclaw gateway restartNow text the Sendblue number from your phone. You should get a reply from openclaw!
No response?
- Make sure you're texting from the number in
allowFrom - Check logs:
openclaw logs - Verify your API credentials are correct
"Unknown channel id" error?
- Run
npm run buildin the plugin folder
By default, only numbers in allowFrom can text the bot. To allow anyone:
"config": {
...
"dmPolicy": "open"
}By default, the plugin checks for messages every 5 seconds. For instant delivery, enable webhooks:
"config": {
...
"webhook": {
"enabled": true,
"port": 3141,
"secret": "your-secret-here"
}
}Setup:
- Expose port 3141 to the internet (use ngrok, Cloudflare Tunnel, or a public server)
- In your Sendblue dashboard, set the webhook URL to
https://your-server/webhook/sendblue - In Sendblue, set the same
secretvalue for webhook authentication
Security notes:
- Always set a secret - Without it, anyone can send fake messages to your webhook
- Use HTTPS - Use a reverse proxy (nginx, Caddy) or tunnel service for SSL
- Rate limiting - Built-in at 60 req/min to prevent abuse
| Option | Description |
|---|---|
apiKey |
Sendblue API key (required) |
apiSecret |
Sendblue API secret (required) |
phoneNumber |
Sendblue phone number (required) |
allowFrom |
Phone numbers that can text the bot |
dmPolicy |
"allowlist" (default), "open", or "disabled" |
pollIntervalMs |
Poll interval in ms (default: 5000) |
webhook.enabled |
Enable webhook server (default: false) |
webhook.port |
Webhook port (default: 3141) |
webhook.secret |
Secret for webhook authentication |
webhook.rateLimit.maxRequests |
Max requests per minute (default: 60) |
MIT