SMS API
An SMS API pricedat carrier rates
Alerts, reminders and codes on carrier routes at wholesale rates, with the segment count and exact cost in every reply. The platform fee is 2% of the carrier cost and stops at $0.001, however long the message is.
2 routes serve +447911123456, cheapest first
United Kingdom (All Operators)
1/1 billing
$0.02025/msg
United Kingdom (All Operators)
1/1 billing
$0.0396/msg
- Segments counted before sending
- Bulk up to 1,000 a request
- Retries never send twice
Lowest live SMS rates right now
The cheapest listed SMS route for an ordinary mobile number in each destination, read from the marketplace as this page was served. Per segment, before the capped platform fee.
Built for teams who read the invoice
Transactional messaging is a cost line and a promise to your users. Both are easier to keep when every message shows its working.

Segments counted the way networks count them
GSM-7 fits 160 characters, or 153 per part once split; Unicode fits 70, or 67 per part. Characters such as € count twice. The count is done before sending, so the cost is never a surprise.
The exact cost in every reply
Rate, segments and fee are booked together before the message leaves. If the route refuses it, the charge is reversed and the reply shows a cost of zero.
Your name as the sender
Send from an alphanumeric brand or a number. Every SMS route states whether it carries alphanumeric, numeric or pre-registered senders before you buy.
Retries that never double-send
Add an X-Idempotency-Key and a retried request replays the original reply for 24 hours instead of sending, and billing, the message twice.
Routing per message
Leave out the route and Smart Routing picks one for the destination, cheapest, best quality or balanced, or name an SMS route you bought.
Your first message in three steps
Create a key
Open a free account and create a live key and a test key. Limit either to the Send SMS permission so it can message and do nothing else.
Fund it and pick routing
Top up from $5 by card or crypto. Pass a strategy on each request, or name an SMS route you bought on the marketplace.
Send and reconcile
POST /comms/sms. The reply carries the message ID, segments and cost; sms.sent arrives as a signed webhook, and history pages by date.
curl -X POST https://packetexchange.io/api/v1/comms/sms \
-H "Authorization: Bearer $PACKETEXCHANGE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d '{
"to": "+447700900123",
"from": "Riverside",
"message": "Your order 1042 is out for delivery and arrives between 14:00 and 16:00."
}'import { randomUUID } from 'node:crypto';
const res = await fetch('https://packetexchange.io/api/v1/comms/sms', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.PACKETEXCHANGE_API_KEY}`,
'Content-Type': 'application/json',
'X-Idempotency-Key': randomUUID(),
},
body: JSON.stringify({
to: '+447700900123',
from: 'Riverside',
message: 'Your order 1042 is out for delivery and arrives between 14:00 and 16:00.',
}),
});
const { data } = await res.json();
console.log(data.messageId, data.segments, data.cost);import os, uuid
import httpx
res = httpx.post(
"https://packetexchange.io/api/v1/comms/sms",
headers={
"Authorization": f"Bearer {os.environ['PACKETEXCHANGE_API_KEY']}",
"X-Idempotency-Key": str(uuid.uuid4()),
},
json={
"to": "+447700900123",
"from": "Riverside",
"message": "Your order 1042 is out for delivery and arrives between 14:00 and 16:00.",
},
)
data = res.json()["data"]
print(data["messageId"], data["segments"], data["cost"])The reply status is the send-time outcome (accepted, sent or failed). GET /comms/sms/{id} then shows delivered or failed when the route returns a carrier delivery receipt.
A real market, in the open
A sandbox on the real path
A test send is validated, routed, counted and priced on a real route, then simulated and marked simulated: true.
Guardrails on every request
Embargoed destinations are refused before routing or billing, and each key is held to 10 send requests a second.
One balance for everything
The balance that pays for messages also pays for calls and numbers, with one ledger and one suppression list.
Webhooks you can prove
Every delivery is signed with an HMAC SHA-256 of its body and a timestamp, logged, and can be resent.
Live interconnects through Minutes Network
SMS API, answered
Anything else is in the help centre, or ask the team directly.
How is an SMS billed?
Per segment, at the route's rate for the destination's longest matching prefix, plus a platform fee of 2% of that cost, never more than $0.001 for the whole message. The reply states the segments and the cost.
Do you return delivery receipts?
When the route returns one. The send replies with the send-time outcome (accepted, sent or failed); GET /comms/sms/{id} then shows the timeline, moving to delivered or failed when the carrier receipt arrives, and the sms.delivered and sms.failed webhooks tell you as it happens. A failed message is refunded. On a route that returns no receipt the message stays sent, and routeReturnsReceipts says whether the route has returned any in the last 30 days.
Which sender IDs can I use?
Alphanumeric or numeric senders of up to 30 characters, checked for a safe character set. Each SMS route states whether it carries alphanumeric, numeric or pre-registered senders, so check the route for your destination.
Can I send to many numbers at once?
Yes. POST /comms/sms/bulk takes up to 1,000 messages on an SMS route you bought, sends them in order and returns a status for each.
What stops a retry from sending twice?
The X-Idempotency-Key header. The same key with the same body replays the original reply for 24 hours, and a different body under the same key is rejected.
Can I test without sending real messages?
Yes. Test keys run the full path and simulate the send against sandbox credit, which is added with an invite code, so nothing is delivered and your balance is never touched.
Send your first message today
Free account, API key on signup, wholesale rates from the first message. No contract, no monthly fee and no sales call.