
Messaging API
Send codes and alerts with one request. The parts and the price come back in the answer, the receipt by webhook.
About the APIProducts
Messaging API Campaigns SMPP and wholesale Verify SoonPlatform
Analytics Routing Delivery quality PartnersCompany
Pricing Developers Contact Sign in Send your first SMS freeRoute trust Every route tested on real phones
An SMS API for verification codes, alerts and campaigns. We check every route against real phones, so a receipt that says delivered is one you can trust.
Free test credits. No card, no monthly fee, no contract.


Send codes and alerts with one request. The parts and the price come back in the answer, the receipt by webhook.
About the API
Send to a whole list from one CSV, schedule it, and see who clicked. Duplicates and opted out numbers are skipped.
About campaigns
Bind your platform over SMPP 3.4 with TLS. The same routes, prices and reports as the API.
About SMPP
Verification codes by Telegram first and SMS second, from one call. Coming soon to the console.
Ask for early accessAnalytics
Delivery rate, time to the handset and spend on one screen, and every message traced from the request to the receipt.

Delivery quality
Some routes report a message delivered whether or not a phone ever buzzed. We test our routes with real phones and watch every receipt on live traffic, so the delivery rate you see is one you can trust.
| Target | Buy | Margin | Recent delivery | Result |
|---|---|---|---|---|
| Northline · SMPP | 0.0180 | 0.0110 | 98.2% | Picked |
| Upstream · Standard | 0.0210 | 0.0080 | 97.9% | Next on retry |
| Tern Messaging · HTTP | 0.0165 | 0.0125 | 91.4% | Lower quality |
| Harbour SMS · SMPP | 0.0310 | −0.0020 | 96.8% | Skipped, at a loss |
Routing, for partners
Partners run their own routing in their console: rules by client, product, country, network or number, with a route tester that shows what will happen before a message goes out.
Try it here
Type, or change the number, and watch the parts and the price follow. Press send and the receipt comes back the way it does in the console.
Type, or change the number, and watch the parts and the price follow.
Your Acme code is 482913. It expires in 10 minutes.
Press send to watch the receipt come back.
Delivered should mean
a phone buzzed.
So we test our routes
on real phones, and stop
trusting the ones that lie.
How it works
Verify your own phone number and send to it on free test credits. No card needed.
Make an API key and post a message. The answer carries the parts and the price.
Register your sender and add credits by card, PayPal or bank transfer. Then send to anyone.
For developers
curl https://app.siellabs.com/v1/messages \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"to": "+447700900123", "from": "Acme",
"body": "Your Acme code is 482913."}'
{
"id": "6f1c3d2a-7c1e-4e0b-9d2f-2b1f4b9a2e10",
"status": "queued",
"to": "+447700900123",
"from": "Acme",
"encoding": "gsm7",
"segments": 1,
"price_micros": 29000,
"country": "GB"
}
const res = await fetch("https://app.siellabs.com/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+447700900123",
from: "Acme",
body: "Your Acme code is 482913.",
}),
});
const message = await res.json(); // { id, status: "queued", segments, price_micros, … }
import os, requests
r = requests.post(
"https://app.siellabs.com/v1/messages",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={"to": "+447700900123", "from": "Acme",
"body": "Your Acme code is 482913."},
)
message = r.json() # {"id": ..., "status": "queued", "segments": 1, ...}
$ch = curl_init("https://app.siellabs.com/v1/messages");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"to" => "+447700900123", "from" => "Acme",
"body" => "Your Acme code is 482913.",
]),
]);
$message = json_decode(curl_exec($ch), true);
body, _ := json.Marshal(map[string]string{
"to": "+447700900123", "from": "Acme",
"body": "Your Acme code is 482913.",
})
req, _ := http.NewRequest("POST", "https://app.siellabs.com/v1/messages", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
The console
Each message opens to its text, its parts with the operator's own IDs and receipts, the time to the handset, and the webhooks that told your system about it.
Hi Dana, your Acme order 30638 is packed and leaves our warehouse today. It should reach you on Thursday between 9:00 and 13:00. Track it any time at acme.example/t/30638, where you can also change the time.
| # | Operator ID | Receipt | Error | Time to receipt | Price |
|---|---|---|---|---|---|
| 1 | 4f0e9c21b7 | DELIVRD | None | 3.4 s | 0.0290 |
| 2 | 4f0e9c21b8 | DELIVRD | None | 3.6 s | 0.0290 |
Security
Message text and secrets are encrypted in transit and at rest, and the API and SMPP connections use TLS.
Only staff whose role requires it can open message text, every access is recorded, and old text is erased after the retention period.
Protect your console with an authenticator app and recovery codes, see where you are signed in, and sign out other sessions.
Pricing
No monthly fee, no minimum, no contract. Every destination has a public price, and changes carry a date you see ahead of time.
Per part from the price list
Prepaid credits, spent as you send.
Custom rate sheet
For a few hundred thousand messages a month and up.
Your prices your brand
Run an SMS business on our platform.

| Country | Local, USD | International | Networks |
|---|---|---|---|
Questions
Something else? A person who runs the routes answers by email within one business day.

An account, a sender ID and credits. Sign up, verify one of your own phone numbers as a test number, and send to it right away on the free test credits. Register a sender ID for your brand; once it is approved and you have added credits, you can send to anyone.
Per message part, from a prepaid balance. No monthly fee, no minimum, no contract. Every country has a price on the public price list, and the API tells you the price of each message when it accepts it.
Every destination on the price list. Traffic goes over direct operator connections where we have them and over vetted wholesale partners elsewhere. The price list in the console shows each destination's recent delivery rate and time to handset.
Operators send a receipt for each part, and we test our routes with real phones and watch receipts on live traffic. Routes whose receipts do not match what phones receive stop counting in quality routing, and our team is alerted.
Yes. Create an SMPP login in the console and bind with SMPP 3.4 over TLS. Submits go through the same validation, pricing and routing as the API, and receipts come back as deliver_sm.
A dashboard with your delivery rate, time to handset, spend and daily volume, a log of every message with its timeline and receipts, campaign reports with clicks, and a price list with each destination's delivery rate and speed. Lists export to CSV.
Yes. A composer that shows the part count and the price before you send, campaigns from a pasted list or a CSV with templates and contacts, sender ID registration, API keys, webhooks and billing.
Yes, as ordinary messages through the API today. Verify, which sends a code by Telegram first and SMS second and checks it for you, is coming soon to the console. Write to us for early access.
Message text is encrypted in transit and at rest. Only staff whose role requires it can open it, every access is recorded, and old text is erased after the retention period.
Sign up, verify your number and send to it on free test credits. Add a sender and credits when you are ready for real traffic.
Free test credits. No card, no monthly fee, no contract.
