Authentication
Bearer keys, scoped to send, read or both, optionally IP-restricted. Test keys validate and price without sending.
Authorization: Bearer sk_live_…DetailsDocumentation
One base URL, bearer keys, predictable JSON, idempotent writes, signed webhooks. Search below or pick a task; every page has copy-paste samples.
01Start
message.delivered within seconds.import os, requests
r = requests.post(
"https://api.smsmeteor.com/v1/messages",
headers={"Authorization": f"Bearer {os.environ['SMSMETEOR_KEY']}",
"Idempotency-Key": "order-4821"},
json={"to": "+14155550142", "from": "METEOR",
"text": "Your order #4821 has shipped."},
)
print(r.json()["id"], r.json()["price"])const r = await fetch("https://api.smsmeteor.com/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SMSMETEOR_KEY}`,
"Idempotency-Key": "order-4821",
"Content-Type": "application/json",
},
body: JSON.stringify({ to: "+14155550142", from: "METEOR",
text: "Your order #4821 has shipped." }),
});
const { id, price } = await r.json();$ch = curl_init('https://api.smsmeteor.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('SMSMETEOR_KEY'),
'Idempotency-Key: order-4821', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['to' => '+14155550142',
'from' => 'METEOR', 'text' => 'Your order #4821 has shipped.']),
]);
$msg = json_decode(curl_exec($ch), true);curl https://api.smsmeteor.com/v1/messages \
-H "Authorization: Bearer $SMSMETEOR_KEY" \
-H "Idempotency-Key: order-4821" \
-d to="+14155550142" \
-d from="METEOR" \
-d text="Your order #4821 has shipped."02By task
window, pace and quiet hours per destination.
Track deliverySigned events for every status change, with retries.
Read the rate cardAll destinations or one country, no key required.
Watch the balanceBalance endpoint and the balance.low event.
Handle errorsThirteen stable codes, which to retry, which to fix.
Generate a clientOpenAPI 3.1 file, typed clients, samples in six languages.
03Surface
| Method | Path | Purpose | |
|---|---|---|---|
| POST | /v1/messages | Send one message | Reference |
| POST | /v1/messages/batch | Send up to 1,000 messages | Reference |
| GET | /v1/messages/{id} | Status, timestamps, price, carrier code | Reference |
| GET | /v1/messages | List and filter, cursor pagination | Reference |
| GET | /v1/rates | Public rate card, all or one country | Reference |
| GET | /v1/balance | Balance, pending deposits, low threshold | Reference |
04Concepts
Bearer keys, scoped to send, read or both, optionally IP-restricted. Test keys validate and price without sending.
Authorization: Bearer sk_live_…DetailsSame key and payload within 24 hours returns the original response. A retry never sends twice.
Idempotency-Key: order-4821DetailsForward only. Billing happens at sent; rejected is never charged; validity is 48 hours.
queuedsentdeliveredfailed
Details50 requests per second per key. Over it: 429 with Retry-After. For volume, use batch rather than more keys.
X-RateLimit-Remaining: 47DetailsOne JSON shape, a stable code, a human message, the offending field. Retry 429 and 5xx; fix 4xx.
{ "error": { "code": "invalid_number" } }DetailsEvery response carries the message price from the public rate card. No plan, no tier, same as the panel.
"price": "0.0084", "currency": "USD"Rate card05Resources