8.3k★by kesslerio
dialpad – OpenClaw Skill
dialpad is an OpenClaw Skills integration for coding workflows. Send SMS and make voice calls via Dialpad API. Supports single/batch SMS, voice calls with TTS, and caller ID selection.
Skill Snapshot
| name | dialpad |
| description | Send SMS and make voice calls via Dialpad API. Supports single/batch SMS, voice calls with TTS, and caller ID selection. OpenClaw Skills integration. |
| owner | kesslerio |
| repository | kesslerio/dialpad |
| language | Markdown |
| license | MIT |
| topics | |
| security | L1 |
| install | openclaw add @kesslerio/dialpad |
| last updated | Feb 7, 2026 |
Maintainer

name: dialpad description: Send SMS and make voice calls via Dialpad API. Supports single/batch SMS, voice calls with TTS, and caller ID selection. homepage: https://developers.dialpad.com/
Dialpad Skill
Send SMS and make voice calls via the Dialpad API.
Available Phone Numbers
| 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.
Setup
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.
Usage
Send SMS
# 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"
Make Voice Calls
# 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"
From Agent Instructions
SMS:
python3 send_sms.py --to "+14155551234" --message "Your message here"
Voice Call:
python3 make_call.py --to "+14155551234" --text "Optional TTS message"
Voice Options
Low-Cost Voices (Recommended for Budget)
| 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 |
Premium Voices (Higher Quality)
| 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".
API Capabilities
SMS
- Endpoint:
POST https://dialpad.com/api/v2/sms - Max recipients: 10 per request
- Max message length: 1600 characters
- Rate limits: 100-800 requests/minute (tier-dependent)
Voice Calls
- Endpoint:
POST https://dialpad.com/api/v2/call - Requires:
phone_number+user_id - Features: Outbound calling, Text-to-Speech
- Caller ID: Must be assigned to your Dialpad account
Known Users (Auto-Detected)
| Name | Phone | User ID |
|---|---|---|
| Martin | (415) 360-2954 | 5765607478525952 |
| Lilla | (415) 870-1945 | 5625110025338880 |
| Scott | (415) 223-0323 | 5964143916400640 |
Response
SMS Response
{
"id": "4612924117884928",
"status": "pending",
"message_delivery_result": "pending",
"to_numbers": ["+14158235304"],
"from_number": "+14155201316",
"direction": "outbound"
}
Call Response
{
"call_id": "6342343299702784",
"status": "ringing"
}
Error Handling
| 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 |
SMS Storage (SQLite with FTS5)
Messages are stored in a single SQLite database with full-text search.
Storage
~/.dialpad/sms.db # Single file with messages + FTS5 index
Commands
# 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
Features
- Full-text search via FTS5 (
search "keyword") - Fast queries with indexes on contact, timestamp, direction
- ACID transactions — no corruption on concurrent writes
- Unread tracking with per-contact counts
- Denormalized contact stats for instant list views
Webhook Integration
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()
Legacy JSON Storage (Deprecated)
The original JSON-based storage is still available but not recommended:
python3 sms_storage.py [list|thread|search|unread]
Requirements
- Python 3.7+
- No external dependencies (uses stdlib only)
- Valid
DIALPAD_API_KEYenvironment variable - For ElevenLabs TTS:
ELEVENLABS_API_KEY+ webhook setup for audio playback
Reading SMS Messages
Dialpad doesn't provide a direct "GET /sms" endpoint. Instead, use:
1. Real-Time: SMS Webhooks
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 SMS
Note: Add message_content_export scope to receive message text in events.
2. Historical: Stats Export API
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 status
Architecture
Dialpad 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
Dialpad Moltbot Skill
Send SMS text messages and make voice calls via the Dialpad API with support for TTS, caller ID selection, and message storage.
Features
- Send SMS - Single or batch SMS messages (up to 10 recipients)
- Voice Calls - Outbound voice calls with optional Text-to-Speech
- Caller ID Selection - Choose which Dialpad phone number appears as caller ID
- Message Storage - SQLite database with full-text search for SMS history
- Webhooks - Real-time SMS event notifications
- Multiple Voices - Use Dialpad's TTS or premium ElevenLabs voices
Installation
# Clone the repository
git clone https://github.com/kesslerio/dialpad-moltbot-skill.git
cd dialpad-moltbot-skill
Configuration
Required
Set your Dialpad API key:
export DIALPAD_API_KEY="your-api-key-here"
Or add to ~/.moltbot/.env or ~/.clawdbot/.env:
DIALPAD_API_KEY=your-api-key-here
Get your API key from: https://dialpad.com/api/settings
Optional
For premium voice quality using ElevenLabs TTS:
export ELEVENLABS_API_KEY="your-elevenlabs-key"
Usage
Send SMS
# Basic SMS
python3 send_sms.py --to "+14155551234" --message "Hello from Dialpad!"
# Batch SMS (multiple recipients)
python3 send_sms.py --to "+14155551234" "+14155555678" --message "Group message"
# From specific caller ID
python3 send_sms.py --to "+14155551234" --message "Hello!" --from "+14159901234"
Make Voice Calls
# Basic outbound call
python3 make_call.py --to "+14155551234"
# Call with TTS greeting
python3 make_call.py --to "+14155551234" --text "Hello! This is a message."
# Call from specific number with TTS
python3 make_call.py --to "+14155551234" --from "+14159901234" --text "Meeting reminder"
# With premium voice (requires ELEVENLABS_API_KEY)
python3 make_call.py --to "+14155551234" --voice "Adam" --text "Premium voice test"
Available Voices
Dialpad Built-in (Low Cost)
| Voice | Type | Notes |
|---|---|---|
| Eric | Male, smooth | Recommended for budget |
| Daniel | Male, British | Professional |
| Sarah | Female, mature | Clear |
| River | Male, neutral | Friendly |
| Alice | Female, clear | Accessible |
| Brian | Male, deep | Authoritative |
| Bill | Male, wise | Experienced |
ElevenLabs Premium (Higher Quality)
| Voice | Type | Notes |
|---|---|---|
| Adam | Male, deep | Best for professional calls |
| Antoni | Male, warm | Friendly tone |
| Bella | Female, soft | Warm, engaging |
Use premium voices by setting ELEVENLABS_API_KEY and specifying --voice "VoiceName".
SMS Storage & History
Messages are stored in SQLite with full-text search capabilities.
List Conversations
python3 sms_sqlite.py list
View Specific Thread
python3 sms_sqlite.py thread "+14155551234"
Full-Text Search
python3 sms_sqlite.py search "urgent"
Unread Messages
python3 sms_sqlite.py unread
Statistics
python3 sms_sqlite.py stats
Mark as Read
python3 sms_sqlite.py read "+14155551234"
Webhook Integration
Receive SMS events in real-time:
# Create webhook subscription
python3 create_sms_webhook.py create --url "https://your-server.com/webhook/dialpad" --direction "all"
# List subscriptions
python3 create_sms_webhook.py list
Webhook events:
sms_sent- Outgoing SMSsms_received- Incoming SMS
Export SMS History
Export past 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
Integration with Moltbot
Add to your Moltbot configuration:
{
"skills": [
{
"name": "dialpad",
"path": "/path/to/dialpad-moltbot-skill",
"env": {
"DIALPAD_API_KEY": "${DIALPAD_API_KEY}"
}
}
]
}
Then reference in workflows:
- "Send a text to..."
- "Call..."
- "What SMS did I get?"
- "Search my messages for..."
API Reference
SMS Endpoint
- URL:
POST https://dialpad.com/api/v2/sms - Max recipients: 10 per request
- Max message length: 1600 characters
- Rate limits: 100-800 requests/minute (varies by plan)
Voice Call Endpoint
- URL:
POST https://dialpad.com/api/v2/call - Requires: Phone number + User ID
- Features: Outbound calling, TTS, Caller ID
Response Examples
SMS Response:
{
"id": "4612924117884928",
"status": "pending",
"message_delivery_result": "pending",
"to_numbers": ["+14158235304"],
"from_number": "+14155201316",
"direction": "outbound"
}
Call Response:
{
"call_id": "6342343299702784",
"status": "ringing"
}
Error Handling
| Error | Cause | Solution |
|---|---|---|
invalid_destination | Invalid phone number | Verify E.164 format (e.g., +14155551234) |
invalid_source | Caller ID not available | Ensure number is assigned to your account |
no_route | Cannot deliver | Check recipient carrier and number validity |
unauthorized | Invalid API key | Verify DIALPAD_API_KEY is set correctly |
Requirements
- Python 3.7+
- No external dependencies (uses Python stdlib)
- Valid Dialpad API key
- For premium voices: ElevenLabs API key
Project Structure
dialpad-moltbot-skill/
├── send_sms.py # Send SMS messages
├── make_call.py # Make voice calls
├── sms_sqlite.py # SQLite storage and search
├── webhook_sqlite.py # Handle incoming webhooks
├── create_sms_webhook.py # Manage webhook subscriptions
├── export_sms.py # Export SMS history
├── SKILL.md # Moltbot manifest
├── README.md # This file
└── LICENSE # MIT License
Troubleshooting
SMS Not Sending
- Verify
DIALPAD_API_KEYis set:echo $DIALPAD_API_KEY - Check phone number format (must be E.164: +1 country code + number)
- Verify caller ID (--from) is assigned to your Dialpad account
Calls Not Connecting
- Ensure phone number includes country code
- Verify the Dialpad account has outbound calling enabled
- Check API rate limits haven't been exceeded
Voice Quality Issues
- Switch to ElevenLabs voices for better quality:
--voice "Adam" - Ensure
ELEVENLABS_API_KEYis set - Try different voices to find the best fit
SMS Not Storing
- Check SQLite database permissions at
~/.dialpad/sms.db - Run migrate to convert from legacy storage:
python3 sms_sqlite.py migrate
License
MIT
Support
- Dialpad Developer Docs: https://developers.dialpad.com/
- Dialpad API Settings: https://dialpad.com/api/settings
- ElevenLabs Docs: https://elevenlabs.io/docs
- Moltbot: https://moltbot.io/
Permissions & Security
Security level L1: Low-risk skills with minimal permissions. Review inputs and outputs before running in production.
Requirements
- Python 3.7+ - No external dependencies (uses stdlib only) - Valid `DIALPAD_API_KEY` environment variable - For ElevenLabs TTS: `ELEVENLABS_API_KEY` + webhook setup for audio playback
FAQ
How do I install dialpad?
Run openclaw add @kesslerio/dialpad in your terminal. This installs dialpad into your OpenClaw Skills catalog.
Does this skill run locally or in the cloud?
OpenClaw Skills execute locally by default. Review the SKILL.md and permissions before running any skill.
Where can I verify the source code?
The source repository is available at https://github.com/openclaw/skills/tree/main/skills/kesslerio/dialpad. Review commits and README documentation before installing.
