signal-cli-rest-api bridge, no cloud bot token needed.
Quick Start
1
Run the bridge
Signal links a device through the signal-cli-rest-api bridge. Start it with Docker in
native mode.2
Link your device
Open the bridge link URL, then scan the QR from Signal → Settings → Linked Devices → Link New Device.
3
Start the bot
Point the bot at your linked account and the bridge.Message your linked Signal number and the agent replies.
No token needed — Signal links a device via the local bridge. The
token constructor argument exists only for adapter-wiring parity and is unused.How It Works
Signal is poll-based: the bot fetches inbound envelopes from the bridge, routes text to the agent, and sends the reply back through the bridge. The adapter talks HTTP/JSON to these bridge endpoints:Configuration
Signal needs an account and a bridge URL. Configure it with YAML, environment variables, or the Python SDK.- YAML
- Environment
- Python SDK
Config keys
Constructor parameters
Capabilities & Limits
Signal declares honest capabilities so shared engines degrade correctly.Built-in Commands
Every Signal channel ships these commands out of the box.
Register custom commands:
DM Allowlist
Restrict who can DM the bot withallowed_users — phone numbers are normalised to digits so formatting never blocks a match.
What’s Not Supported Yet
This release ships text messaging. The following are intentionally not wired:Troubleshooting
ValueError: Signal account is required
ValueError: Signal account is required
The account is empty. Set it via the constructor,
channels.signal.account, or the SIGNAL_ACCOUNT environment variable before calling start().ImportError: aiohttp is required
ImportError: aiohttp is required
The Signal adapter uses
aiohttp (lazy-imported). Install it:No messages arrive
No messages arrive
Confirm the bridge is linked and reachable. Check
GET /v1/accounts returns your number, and lower poll_interval (minimum 0.2s) for faster pickup. Verify the bridge runs in native or json-rpc mode so /v1/receive returns envelopes.Bridge unreachable on probe
Bridge unreachable on probe
probe() calls GET /v1/accounts. A non-200 means the bridge is down or the URL is wrong. Ensure bridge_url matches the Docker port mapping (default http://localhost:8080).Best Practices
Keep the bridge private
Keep the bridge private
The
signal-cli-rest-api bridge holds your linked device. Run it on localhost or a private network — never expose port 8080 to the public internet.Use the allowlist for DMs
Use the allowlist for DMs
Set
allowed_users so only trusted numbers can start a conversation. Numbers normalise to digits, so any formatting works.Tune the poll interval
Tune the poll interval
poll_interval trades latency for load. Keep the default 1.0s for most bots; lower it toward 0.2s for snappier replies, raise it to reduce bridge traffic.Expect plain text
Expect plain text
Signal has no message editing and this release is text-only. Design replies as self-contained plain-text messages rather than relying on edits or rich media.
Related
WhatsApp Bot
The closest sibling — linked-device / local-bridge model
Channels Gateway
Run Signal alongside Telegram, Discord, Slack, and more
Messaging Bots
All supported messaging platforms
Bot Gateway
Multi-channel gateway architecture

