Sendly Rust SDK
Official Rust SDK for the Sendly SMS API.
Installation
# cargo
Or add to your Cargo.toml:
[]
= "0.9.5"
= { = "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?;
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!;
Iterate All Messages
use StreamExt;
// Auto-pagination with async stream
let mut stream = client.messages.iter;
while let Some = stream.next.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