executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
dialpadSend SMS and make voice calls via Dialpad API. Supports single/batch SMS, voice calls with TTS, and caller ID selection.
Independent GitHub snapshot · Automated classification · Original documentation governs
Send SMS and make voice calls via the Dialpad API.
| Number | Purpose | Format |
|---|---|---|
| (415) 520-1316 | Sales Team | Default for sales context |
| (415) 360-2954 | Work/Personal | Default for work context |
| (415) 991-7155 | Support SMS Only | SMS only (no voice) |
Use --from <number> to specify which number appears as caller ID.
Required environment variable:
DIALPAD_API_KEY=your_api_key_here
Optional (for ElevenLabs TTS in calls):
ELEVENLABS_API_KEY=your_elevenlabs_api_key
Get your Dialpad API key from Dialpad API Settings.
# Basic SMS
python3 send_sms.py --to "+14155551234" --message "Hello from Clawdbot!"
# From specific number (e.g., work phone)
python3 send_sms.py --to "+14155551234" --message "Hello!" --from "+14153602954"
# Batch SMS (up to 10 recipients)
python3 send_sms.py --to "+14155551234" "+14155555678" --message "Group update"
# Basic call (ring recipient - they'll answer to speak with you)
python3 make_call.py --to "+14155551234"
# Call with Text-to-Speech greeting (Dialpad's robotic TTS)
python3 make_call.py --to "+14155551234" --text "Hello! This is a call from ShapeScale."
# Call from specific number with TTS
python3 make_call.py --to "+14155551234" --from "+14153602954" --text "Meeting reminder"
# With custom voice (requires ELEVENLABS_API_KEY)
python3 make_call.py --to "+14155551234" --voice "Adam" --text "Premium voice test"
SMS:
python3 send_sms.py --to "+14155551234" --message "Your message here"
Voice Call:
python3 make_call.py --to "+14155551234" --text "Optional TTS message"
| Voice | Style | Notes |
|---|---|---|
| Eric ⭐ | Male, smooth, trustworthy | Low-cost, available! |
| Daniel | Male, British, steady | Budget |
| Sarah | Female, mature | Budget |
| River | Male, neutral | Budget |
| Alice | Female, clear | Budget |
| Brian | Male, deep | Budget |
| Bill | Male, wise | Budget |
| Voice | Style | Notes |
|---|---|---|
| Adam | Male, deep, clear | Best for professional |
| Antoni | Male, warm | Friendly tone |
| Bella | Female, soft | Warm, engaging |
To use a specific voice, add --voice "VoiceName".
POST https://dialpad.com/api/v2/smsPOST https://dialpad.com/api/v2/callphone_number + user_id| Name | Phone | User ID |
|---|---|---|
| Martin | (415) 360-2954 | 5765607478525952 |
| Lilla | (415) 870-1945 | 5625110025338880 |
| Scott | (415) 223-0323 | 5964143916400640 |
{
"id": "4612924117884928",
"status": "pending",
"message_delivery_result": "pending",
"to_numbers": ["+14158235304"],
"from_number": "+14155201316",
"direction": "outbound"
}
{
"call_id": "6342343299702784",
"status": "ringing"
}
| Error | Meaning | Action |
|---|---|---|
invalid_destination | Invalid phone number | Verify E.164 format |
invalid_source | Caller ID not available | Check --from number assignment |
no_route | Cannot deliver | Check carrier/recipient |
user_id required | Missing user ID | Use --from with known number |
Messages are stored in a single SQLite database with full-text search.
~/.dialpad/sms.db # Single file with messages + FTS5 index
# List all SMS conversations
python3 sms_sqlite.py list
# View specific conversation thread
python3 sms_sqlite.py thread "+14155551234"
# Full-text search across all messages
python3 sms_sqlite.py search "demo"
# Show unread message summary
python3 sms_sqlite.py unread
# Statistics
python3 sms_sqlite.py stats
# Mark messages as read
python3 sms_sqlite.py read "+14155551234"
# Migrate from legacy storage
python3 sms_sqlite.py migrate
search "keyword")from webhook_sqlite import handle_sms_webhook, format_notification, get_inbox_summary
# Store incoming message
result = handle_sms_webhook(dialpad_payload)
notification = format_notification(result)
# Get inbox summary
summary = get_inbox_summary()
The original JSON-based storage is still available but not recommended:
python3 sms_storage.py [list|thread|search|unread]
DIALPAD_API_KEY environment variableELEVENLABS_API_KEY + webhook setup for audio playbackDialpad doesn't provide a direct "GET /sms" endpoint. Instead, use:
Receive SMS events in real-time when messages are sent/received.
# Create a webhook subscription
python3 create_sms_webhook.py create --url "https://your-server.com/webhook/dialpad" --direction "all"
# List existing subscriptions
python3 create_sms_webhook.py list
Webhook Events:
sms_sent — Outgoing SMSsms_received — Incoming SMSNote: Add message_content_export scope to receive message text in events.
Export past SMS messages as CSV.
# Export all SMS
python3 export_sms.py --output all_sms.csv
# Export by date range
python3 export_sms.py --start-date 2026-01-01 --end-date 2026-01-31 --output jan_sms.csv
# Export for specific office
python3 export_sms.py --office-id 6194013244489728 --output office_sms.csv
Output: CSV file with columns:
date — Timestampfrom_number — Senderto_number — Recipienttext — Message contentstatus — Delivery statusDialpad SMS Skill
├── send_sms.py # Send SMS (working)
├── make_call.py # Make voice calls (working)
├── create_sms_webhook.py # Create webhook subscriptions (new)
├── export_sms.py # Export historical SMS (new)
├── sms_sqlite.py # SQLite storage with FTS5 (RECOMMENDED)
├── webhook_sqlite.py # Webhook handler for SQLite
├── sms_storage.py # Legacy JSON storage (deprecated)
└── webhook_receiver.py # Legacy webhook handler