beeper-api-cli
LLM-friendly wrapper around the Beeper CLI for reading and sending messages across all connected chat networks.
⚠️ CRITICAL: Message Sending Policy
🚨 NEVER SEND ANY MESSAGE WITHOUT EXPLICIT USER APPROVAL 🚨
MANDATORY PROTOCOL FOR ALL MESSAGING:
- ALWAYS show the complete message draft first - display full content
- WAIT for explicit verbal approval - "send it", "looks good", "go ahead", etc.
- NEVER assume permission to send - even if user says "draft a message"
- Apply to ALL platforms: WhatsApp, Telegram, Signal, Instagram, Twitter, Facebook, LinkedIn, etc.
- NO EXCEPTIONS EVER - This applies to new messages, replies, and forwards
This rule is NON-NEGOTIABLE and applies to ALL beeper send commands.
Quick Start
Step 1: Get Your Token from Beeper Desktop
1. Open Beeper Desktop
2. Settings → Advanced → API
3. Enable API access
4. Copy the Bearer token
Step 2: Set Environment Variables
# REQUIRED: Set your token
export BEEPER_TOKEN="paste-your-token-here"
# OPTIONAL: Override default localhost URL
export BEEPER_API_URL="http://[::1]:23373" # Default
Step 3: Use the CLI
# Use the skill wrapper (recommended)
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output json
# Or use the binary directly
/Users/ashrafali/clawd/beeper-api-cli/beeper chats list --output json
⚠️ Important: Without setting BEEPER_TOKEN, all commands will fail with "Unauthorized" errors.
Prerequisites
1. Beeper Desktop Must Be Running
The CLI connects to Beeper Desktop's local API server.
2. Enable API Access in Beeper Desktop
⚠️ REQUIRED: You must configure the API token in Beeper Desktop first!
- Open Beeper Desktop
- Go to Settings → Advanced → API
- Enable API access
- Generate and copy the Bearer token
- (Optional) Configure allowed IP addresses
- Default: Only
localhost(127.0.0.1 / ::1) is allowed - If running CLI from remote machine, add its IP address in Beeper settings
- Default: Only
3. Set Environment Variables
You must set the token before the CLI will work:
# REQUIRED: Set your token from Beeper Desktop
export BEEPER_TOKEN="your-token-from-beeper-settings"
# OPTIONAL: Override API URL (default: http://[::1]:23373)
export BEEPER_API_URL="http://[::1]:23373"
Where to get the token:
- Beeper Desktop → Settings → Advanced → API → Copy Bearer Token
Important:
- ❌ The CLI will NOT work without setting
BEEPER_TOKEN - ⚠️ Default API URL is
localhost(http://[::1]:23373) - 🔒 If accessing from another machine, you must:
- Add that machine's IP in Beeper Desktop API settings
- Update
BEEPER_API_URLto use the correct host IP
Commands
List All Chats
# JSON output (LLM-friendly)
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output json
# Human-readable text
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output text
# Markdown format
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output markdown
Example JSON output:
[
{
"id": "!wcn4YMCOtKUEtxYXYAq1:beeper.local",
"title": "beeper-api-cli - Lion Bot",
"type": "group",
"network": "Telegram",
"unreadCount": 15
}
]
Get Specific Chat
~/clawd/skills/beeper-api-cli/beeper.sh chats get <chat-id> --output json
List Messages from Chat
# Get last 50 messages (default)
~/clawd/skills/beeper-api-cli/beeper.sh messages list --chat-id <chat-id>
# Get specific number of messages
~/clawd/skills/beeper-api-cli/beeper.sh messages list --chat-id <chat-id> --limit 20 --output json
Example JSON output:
[
{
"id": "42113",
"chatID": "!wcn4YMCOtKUEtxYXYAq1:beeper.local",
"senderName": "ClawdBot",
"text": "Hello world!",
"timestamp": "2026-01-19T22:17:38.000Z",
"isSender": true
}
]
Send a Message
# ⚠️ REQUIRES USER APPROVAL FIRST - see Message Sending Policy above
~/clawd/skills/beeper-api-cli/beeper.sh send --chat-id <chat-id> --message "Your message here"
Example output:
{
"success": true,
"message_id": "msg_123",
"chat_id": "!wcn4YMCOtKUEtxYXYAq1:beeper.local"
}
Search Messages
# Search across all chats
~/clawd/skills/beeper-api-cli/beeper.sh search --query "keyword" --limit 10 --output json
Auto-Discover API URL
~/clawd/skills/beeper-api-cli/beeper.sh discover
LLM Workflows
Find Chat and Send Message
# 1. List chats to find the right one
CHATS=$(~/clawd/skills/beeper-api-cli/beeper.sh chats list --output json)
# 2. Extract chat ID (using jq)
CHAT_ID=$(echo "$CHATS" | jq -r '.[] | select(.title | contains("Project")) | .id')
# 3. Send message
~/clawd/skills/beeper-api-cli/beeper.sh send --chat-id "$CHAT_ID" --message "Update ready!"
Get Conversation Context
# Get recent messages for context
~/clawd/skills/beeper-api-cli/beeper.sh messages list --chat-id <chat-id> --limit 20 --output json | jq
Monitor Unread Messages
# Get all chats with unread count
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output json | jq '.[] | select(.unreadCount > 0) | {title, network, unread: .unreadCount}'
Output Formats
JSON (Default - LLM-Optimized)
- Structured data ready for parsing
- Perfect for programmatic use
- Pipe to
jqfor filtering
Text (Human-Readable)
ID: !wcn4YMCOtKUEtxYXYAq1:beeper.local
Title: beeper-api-cli - Lion Bot
Type: group
Network: Telegram
Unread: 15
Markdown (Documentation)
## beeper-api-cli - Lion Bot
- **ID**: !wcn4YMCOtKUEtxYXYAq1:beeper.local
- **Type**: group
- **Network**: Telegram
- **Unread**: 15
Chat ID Formats
Different networks use different ID formats:
- Telegram:
!wcn4YMCOtKUEtxYXYAq1:beeper.local - WhatsApp: Phone number format (e.g.,
15551234567@s.whatsapp.net) - Signal: Phone number (e.g.,
+15551234567) - Instagram/Twitter: Platform-specific IDs
Use chats list to discover the exact format for your chats.
Environment Variables
Required Configuration
You MUST set these environment variables before using the CLI:
BEEPER_TOKEN (Required)
export BEEPER_TOKEN="your-bearer-token-from-beeper-desktop"
How to get your token:
- Open Beeper Desktop
- Settings → Advanced → API
- Enable API access
- Copy the Bearer token shown in the settings
- Set it as an environment variable
Without this token, the CLI will return "Unauthorized" errors.
BEEPER_API_URL (Optional)
export BEEPER_API_URL="http://[::1]:23373" # Default value
Default behavior:
- Uses
http://[::1]:23373(localhost on IPv6) - This works when running CLI on the same machine as Beeper Desktop
When to change:
- Running CLI from a remote machine
- Beeper Desktop is on a different host
- Using a custom port
If running remotely:
- Find the IP address of the machine running Beeper Desktop
- In Beeper Desktop → Settings → Advanced → API → Add the remote machine's IP to allowed list
- Set
BEEPER_API_URLto:http://<beeper-host-ip>:23373
Example for remote access:
export BEEPER_API_URL="http://192.168.1.100:23373"
export BEEPER_TOKEN="your-token-here"
Skill Wrapper Behavior
The skill wrapper (beeper.sh) will:
- ✅ Use
$BEEPER_TOKENfrom environment (you must set this!) - ✅ Default
$BEEPER_API_URLtohttp://[::1]:23373if not set - ❌ Fail with error if
BEEPER_TOKENis not set
Troubleshooting
"Connection refused"
# Check if Beeper Desktop is running
ps aux | grep -i beeper
# Start Beeper Desktop
open -a "Beeper Desktop" # macOS
"Unauthorized" or "Invalid or missing token"
This means you haven't set BEEPER_TOKEN or it's invalid.
Fix:
# 1. Check if token is set
echo $BEEPER_TOKEN
# If empty or wrong, get a new token from Beeper Desktop:
# - Open Beeper Desktop
# - Settings → Advanced → API
# - Enable API if not already enabled
# - Copy the Bearer token shown
# - Set it in your environment:
export BEEPER_TOKEN="paste-the-token-here"
# Test it works:
~/clawd/skills/beeper-api-cli/beeper.sh chats list
Important Notes:
- The token is generated in Beeper Desktop settings, not in this CLI
- You must copy it exactly from Settings → Advanced → API
- Without a valid token, no commands will work
- Tokens don't expire unless you regenerate them in Beeper settings
"Chat not found"
# List all chats to find correct ID
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output text | grep -i "search-term"
Remote Access (CLI on different machine than Beeper Desktop)
If you want to run the CLI from a different computer:
1. Configure Beeper Desktop to allow remote access:
- Open Beeper Desktop (on the machine running Beeper)
- Settings → Advanced → API
- Find the "Allowed IP Addresses" section
- Add the IP address of the machine running the CLI
- Example: 192.168.1.50
2. Set BEEPER_API_URL to point to the remote machine:
# On the machine running the CLI:
export BEEPER_API_URL="http://<beeper-desktop-ip>:23373"
export BEEPER_TOKEN="your-token"
# Example:
export BEEPER_API_URL="http://192.168.1.100:23373"
Default behavior (localhost only):
- Default URL:
http://[::1]:23373(IPv6 localhost) - Only works when CLI is on same machine as Beeper Desktop
- No remote access unless you configure allowed IPs in Beeper settings
Examples
Example 1: Check Unread Messages
#!/bin/bash
BEEPER="$HOME/clawd/skills/beeper-api-cli/beeper.sh"
# Get chats with unread messages
$BEEPER chats list --output json | \
jq -r '.[] | select(.unreadCount > 0) | "\(.title) (\(.network)): \(.unreadCount) unread"'
Example 2: Read Recent Messages
#!/bin/bash
BEEPER="$HOME/clawd/skills/beeper-api-cli/beeper.sh"
CHAT_ID="!wcn4YMCOtKUEtxYXYAq1:beeper.local"
# Get last 10 messages in readable format
$BEEPER messages list --chat-id "$CHAT_ID" --limit 10 --output text
Example 3: Search and Respond
#!/bin/bash
BEEPER="$HOME/clawd/skills/beeper-api-cli/beeper.sh"
# Search for mentions
RESULTS=$($BEEPER search --query "@clawdbot" --limit 5 --output json)
# Process results and respond (LLM integration point)
echo "$RESULTS" | jq
Integration with Clawdbot
When using from Clawdbot tools, the environment variables are already configured:
# Direct usage from exec tool
~/clawd/skills/beeper-api-cli/beeper.sh chats list --output json
The skill wrapper handles:
- ✅ Auto-configuration of
BEEPER_API_URLandBEEPER_TOKEN - ✅ Error checking for required environment variables
- ✅ Clean passthrough of all CLI arguments
Binary Location
- Skill wrapper:
~/clawd/skills/beeper-api-cli/beeper.sh - Beeper CLI binary:
/Users/ashrafali/clawd/beeper-api-cli/beeper - Source code: https://github.com/nerveband/beeper-api-cli
Features
✅ Read-only and write operations (unlike other tools)
✅ LLM-optimized JSON output
✅ Human-readable text and markdown formats
✅ Auto-discovery of Beeper Desktop API
✅ Cross-platform binaries (macOS, Linux, Windows)
✅ Environment variable configuration
✅ Comprehensive error messages
✅ Unix pipeline friendly
Notes
- The skill requires Beeper Desktop to be running
- API access must be enabled in Beeper Desktop settings
- Token is stored in Clawdbot config (already configured)
- All networks connected to Beeper are accessible (WhatsApp, Telegram, Signal, etc.)
- Use JSON output for LLM processing, text for human reading
Version
Latest (dev build from source)