Sendly Rust SDK
Official Rust SDK for the Sendly SMS API.
Installation
# cargo
Or add to your Cargo.toml:
[]
= "3.7.0"
= { = "1", = ["full"] }
Quick Start
use ;
async
Prerequisites for Live Messaging
Before sending live SMS messages, you need:
-
Business Verification - Complete verification in the Sendly dashboard
- International: Instant approval (just provide Sender ID)
- US/Canada: Requires carrier approval (3-7 business days)
-
Credits - Add credits to your account
- Test keys (
sk_test_*) work without credits (sandbox mode) - Live keys (
sk_live_*) require credits for each message
- Test keys (
-
Live API Key - Generate after verification + credits
- Dashboard → API Keys → Create Live Key
Test vs Live Keys
| Key Type | Prefix | Credits Required | Verification Required | Use Case |
|---|---|---|---|---|
| Test | sk_test_v1_* |
No | No | Development, testing |
| Live | sk_live_v1_* |
Yes | Yes | Production messaging |
Note: You can start development immediately with a test key. Messages to sandbox test numbers are free and don't require verification.
Configuration
use ;
use Duration;
let config = new
.base_url
.timeout
.max_retries;
let client = with_config;
Messages
Send an SMS
use ;
let client = new;
// Marketing message (default)
let message = client.messages
.send_to
.await?;
// Transactional message (bypasses quiet hours)
let message = client.messages.send.await?;
// With custom metadata (max 4KB)
use HashMap;
let mut metadata = new;
metadata.insert;
metadata.insert;
let message = client.messages.send.await?;
println!;
println!;
println!;
List Messages
use ;
let client = new;
// List all
let messages = client.messages.list.await?;
for msg in &messages
// With options
let messages = client.messages.list.await?;
// Pagination info
println!;
println!;
Get a Message
let message = client.messages.get.await?;
println!;
println!;
println!;
println!;
Scheduling Messages
use ;
// Schedule a message for future delivery
let scheduled = client.messages.schedule.await?;
println!;
println!;
// List scheduled messages
let result = client.messages.list_scheduled.await?;
for msg in &result
// Get a specific scheduled message
let msg = client.messages.get_scheduled.await?;
// Cancel a scheduled message (refunds credits)
let result = client.messages.cancel_scheduled.await?;
println!;
Batch Messages
use ;
// Send multiple messages in one API call (up to 1000)
let batch = client.messages.send_batch.await?;
println!;
println!;
println!;
println!;
// Get batch status
let status = client.messages.get_batch.await?;
// List all batches
let batches = client.messages.list_batches.await?;
// Preview batch (dry run) - validates without sending
let preview = client.messages.preview_batch.await?;
println!;
println!;
Iterate All Messages
use StreamExt;
// Auto-pagination with async stream
let mut stream = client.messages.iter;
while let Some = stream.next.await
Webhooks
use ;
// Create a webhook endpoint
let webhook = client.webhooks.create.await?;
println!;
println!; // Store securely!
// List all webhooks
let webhooks = client.webhooks.list.await?;
// Get a specific webhook
let wh = client.webhooks.get.await?;
// Update a webhook
client.webhooks.update.await?;
// Test a webhook
let result = client.webhooks.test.await?;
// Rotate webhook secret
let rotation = client.webhooks.rotate_secret.await?;
// Delete a webhook
client.webhooks.delete.await?;
// List available webhook event types
let event_types = client.webhooks.list_event_types.await?;
for event_type in &event_types
Account & Credits
// Get account information
let account = client.account.get.await?;
println!;
// Check credit balance
let credits = client.account.get_credits.await?;
println!;
println!;
println!;
// View credit transaction history
let transactions = client.account.get_credit_transactions.await?;
for tx in &transactions.data
// List API keys
let keys = client.account.list_api_keys.await?;
for key in &keys.data
// Get a specific API key
let key = client.account.get_api_key.await?;
// Get API key usage stats
let usage = client.account.get_api_key_usage.await?;
println!;
// Create a new API key
let new_key = client.account.create_api_key.await?;
println!; // Only shown once!
// Revoke an API key
client.account.revoke_api_key.await?;
Error Handling
use ;
match client.messages.send.await
Message Object
message.id // Unique identifier
message.to // Recipient phone number
message.text // Message content
message.status // MessageStatus enum
message.credits_used // Credits consumed
message.created_at // DateTime<Utc>
message.updated_at // DateTime<Utc>
message.delivered_at // Option<DateTime<Utc>>
message.error_code // Option<String>
message.error_message // Option<String>
// Helper methods
message.is_delivered // bool
message.is_failed // bool
message.is_pending // bool
Message Status
| Status | Description |
|---|---|
Queued |
Message is queued for delivery |
Sending |
Message is being sent |
Sent |
Message was sent to carrier |
Delivered |
Message was delivered |
Failed |
Message delivery failed |
Pricing Tiers
| Tier | Countries | Credits per SMS |
|---|---|---|
| Domestic | US, CA | 1 |
| Tier 1 | GB, PL, IN, etc. | 8 |
| Tier 2 | FR, JP, AU, etc. | 12 |
| Tier 3 | DE, IT, MX, etc. | 16 |
Sandbox Testing
Use test API keys (sk_test_v1_xxx) with these test numbers:
| Number | Behavior |
|---|---|
| +15005550000 | Success (instant) |
| +15005550001 | Fails: invalid_number |
| +15005550002 | Fails: unroutable_destination |
| +15005550003 | Fails: queue_full |
| +15005550004 | Fails: rate_limit_exceeded |
| +15005550006 | Fails: carrier_violation |
Features
- Async/await with Tokio
- Automatic retries with exponential backoff
- Rate limit handling
- Strong typing with enums
- Comprehensive error types
- Stream-based pagination
License
MIT