Geliştiriciler
API referansı
Göndermek için bir uç nokta, durumu okumak için bir uç nokta, makbuzlar için HMAC imzalı web kancaları. Anahtarlar, hesap var olduğu anda verilir — onaylanacak hiçbir şey ve e-posta gönderilecek hiç kimse yoktur.
Başlarken
Yeni bir hesap ile iletilen bir mesaj arasında üç şey vardır: bir belirteç, biraz bakiye ve bir anahtar. Hiçbiri bir insan içermez.
- Hesap oluşturun — belirteci tarayıcınız üretir ve hesap bu belirtecin kendisidir.
- Fonlayın. $40 minimum, ödemeler sayfası üzerindeki kripto paralardan herhangi biriyle.
- Panelde bir API anahtarı oluşturun. Yalnızca bir kez gösterilir; tıpkı belirteçte olduğu gibi yalnızca karmasını (hash) saklarız.
Bakiyesi boş bir anahtar gönderim yapamaz
Anahtar oluşturma, kasıtlı olarak yüklü bir hesabın arkasına kilitlenmiştir. Kullanılmayan bir kimlik bilgisi ortada durmak, hiçbir yararı olmayan bir yükümlülüktür, bu yüzden panel harcanacak bir şey olana kadar bir tane oluşturmaz.
Kimlik doğrulama
Her istekte taşıyıcı (bearer) belirteç. Anahtar hesabı tanımlar; ikinci bir doğrulama faktörü yoktur, istek üzerinde imza yoktur ve IP izin listesi yoktur — anahtar kimlik bilgisinin tamamıdır, bu yüzden ona öyle davranın.
Authorization: Bearer ws_live_9f2c…
| Aktarım | Yalnızca HTTPS. Düz HTTP üzerinden yapılan bir istek yönlendirilmez, reddedilir — bir yönlendirme anahtarı zaten sızdırmış olurdu. |
|---|---|
| Kapsam | Bir anahtar, bir hesabın bakiyesini harcar. Gönderim yapan her sistem için ayrı bir anahtar oluşturun, böylece bir sızıntı dar kapsamda iptal edilir. |
| İptal | Anında. İptal edilen bir anahtar bir sonraki istekte 401 döndürür; halihazırda kabul edilmiş, işlem sürecindeki toplu gönderimler tamamlanmaya devam eder. |
| Kurtarma | Hiçbiri. Biz bir hash saklarız. Kaybedilen bir anahtar değiştirilir, asla kurtarılmaz. |
Mesaj gönderin
POST/v1/messages
Tek çağrı, bir veya birçok alıcı, karışık hedefler. Her alıcı kendi hedefinin oranına göre fiyatlandırılır ve segment başına faturalandırılır. Çağrı bir bütün olarak kabul edilir veya reddedilir; sizi hiçbir zaman kısmen ücretlendirmez.
İstek gövdesi
| Alan | Tür | Notlar |
|---|---|---|
to | string[] | Zorunlu. E.164, çağrı başına 5.000'e kadar. Fiyatlandırılmış bir hedefe karşılık gelmeyen numaralar, faturalandırmadan önce reddedilir. |
text | string | Zorunlu. UTF-8. Segment sayısı GSM 03.38'i izler — bkz. segmentler. |
from | string | En fazla 11 karakterlik alfanümerik gönderici adı. Rotanın izin verdiği yerlerde taşınır; bkz. gönderici adları. |
vars | object[] | İsteğe bağlı birleştirme değerleri, alıcı başına bir nesne, segmentler sayılmadan önce {{name}} yer tutucularına yerleştirilir. |
callback_url | string | Hesap webhook'unun toplu iş başına isteğe bağlı geçersiz kılınması. |
reference | string | İsteğe bağlı. Kendi kayıtlarınızla eşleştirebilmeniz için her bildirimde geri yansıtılır. |
Örnek
# one call, many recipients, mixed destinations
curl -X POST https://api.worldsms.io/v1/messages \
-H "Authorization: Bearer $WORLDSMS_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "ACME",
"to": ["+447700900123", "+33612345678"],
"text": "Your code is 480913"
}'
{
"batch_id": "b_7Kq2xR9wLm",
"accepted": 2,
"rejected": 0,
"segments": 1,
"cost_usd": 0.0353
}
Birleşik Krallık hedefine 0,0137 $, Fransa hedefine 0,0216 $ — fiyat listesi hedef başına uygulanır, ortalama bir birleşik oran değil.
Toplu işleme
Bir toplu gönderim hemen kabul edilir ve hesap başına dakikada 200 mesaj hızında akar, yani 50.000 alıcı yaklaşık 4 sa 10 dk sürer. Zamana duyarlı trafik bir pazarlama gönderiminin arkasında kuyruğa girmemelidir: bunun için ayrı bir anahtar kullanın.
Mesaj durumu
GET/v1/messages/{batch_id}
Sorgulama desteklenir ve hız sınırlıdır; web kancaları amaçlanan yoldur. Yanıt, toplu işi özetler ve alıcı başına durumu listeler.
{
"batch_id": "b_7Kq2xR9wLm",
"status": "done",
"sending": 0,
"delivered": 1,
"undelivered": 1,
"refund_usd": 0.0216
}
refund_usd, toplu gönderim tamamlandığında bir kez kesinleşir. Siz onu okuyabildiğinizde zaten bakiyenize geri dönmüştür.
Bakiye
GET/v1/balance
Büyük bir gönderimden önce kontrol edin. Bakiyeler dahili olarak tam sayı mikro-dolar cinsinden tutulur — fiyatlar dört ondalık basamağa kadar gider ve bir ondalıklı sayının (float) hesap hareketlerinde işi yoktur — ve burada altı basamağa yuvarlanarak döndürülür.
{ "balance_usd": 412.905400, "currency": "USD" }
Teslim raporları
Operatör bildirdikçe alıcı başına bir makbuz yayımlanır. Bunlar sadece dört durumdur; sessizce "onu kaybettik" anlamına gelen bir "bilinmiyor" kutusu yoktur.
| Durum | Anlam | Faturalandırıldı |
|---|---|---|
queued | Kabul edildi, toplu işte sırasını bekliyor. | Evet |
sent | Operatöre teslim edildi, henüz onay yok. | Evet |
delivered | Cihaz bunu onayladı. | Evet |
undelivered | Ölü, engellenmiş ya da gönderici reddedilmiş. | İade edildi |
Fiyatlandırılmış bir hedefe hiç karşılık gelmeyen numaralar gönderim sırasında reddedilir ve bu yaşam döngüsüne hiç girmez — önce faturalandırılıp sonra iade edilmezler, basitçe faturalandırılmazlar.
Webhook'lar
Panelde veya toplu iş başına callback_url ile bir uç nokta ayarlayın. JSON POST ediyoruz ve 5 saniye içinde bir 2xx bekliyoruz. 2xx olmayan yanıtlar, yaklaşık bir saat boyunca üstel geri çekilmeyle altı kez yeniden denenir, ardından bırakılır.
Veri yükü
{
"event": "message.delivered",
"batch_id": "b_7Kq2xR9wLm",
"to": "+447700900123",
"destination": "gb",
"segments": 1,
"cost_usd": 0.0137,
"reference": "order-4471",
"ts": 1785312041
}
İmza doğrulanıyor
Her teslimat X-WorldSMS-Signature ve X-WorldSMS-Timestamp taşır. İmza, webhook gizli anahtarınızı kullanan HMAC-SHA256(timestamp + "." + body)'dur. Sabit zamanda karşılaştırın ve beş dakikadan eski bir zaman damgasını reddedin, böylece yakalanmış bir teslimat size karşı tekrar oynatılamaz.
// $secret is the webhook secret from the dashboard
$raw = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_WORLDSMS_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_WORLDSMS_SIGNATURE'] ?? '';
// A stale timestamp is a replay, however well it is signed.
if (abs(time() - (int) $ts) > 300) { http_response_code(408); exit; }
$mine = hash_hmac('sha256', $ts . '.' . $raw, $secret);
if (!hash_equals($mine, $sig)) { http_response_code(401); exit; }
http_response_code(204);
İdempotent olun
Uç noktanız zaman aşımına uğradıktan sonraki bir yeniden deneme, ilk teslimatla aynı görünür. batch_id + to + event üzerinden anahtarlayın ve bir tekrarı hiçbir işlem yapılmayan bir olay olarak ele alın.
Hatalar
Her başarısızlık, sabit bir error slug'ı içeren bir JSON gövdesi döndürür. Slug üzerinden eşleştirin, metin üzerinden asla — metnin iyileşmesine izin verilir.
| HTTP | Slug | Ne yapmalı |
|---|---|---|
| 400 | invalid_body | Hatalı biçimlendirilmiş JSON veya eksik zorunlu alan. |
| 401 | key_rejected | Eksik, iptal edilmiş ya da yanlış yazılmış anahtar. Yeniden denenemez. |
| 402 | insufficient_credit | Toplu gönderim bakiyeden daha maliyetlidir. Hiçbir şey gönderilmedi; bakiye yükleyip yeniden gönderin. |
| 422 | no_valid_recipients | Hiçbir numara fiyatlandırılmış bir hedefe çözümlenemedi. |
| 422 | sender_id_invalid | from 11 karakterden uzun veya sayı olarak okunacak yalnızca rakamlardan oluşan bir dize içeriyor. |
| 429 | rate_limited | Yavaşlayın. Retry-After saniye sayısını taşır. |
| 503 | route_unavailable | Bir hedef geçici olarak yönlendirilemiyor. Yeniden denenebilir. |
{
"error": "insufficient_credit",
"message": "Batch costs $84.20, balance is $12.05.",
"required_usd": 84.20,
"balance_usd": 12.05
}
Limitler
| İstekler | Anahtar başına dakikada 60, pik 20. Bunun ötesinde Retry-After ile 429. |
|---|---|
| Çağrı başına alıcı | 5,000. Daha büyük listeleri çağrılara bölün veya dosyayı panelden yükleyin. |
| Gövde boyutu | 2 MB. |
| Aktarım hızı | Kaç anahtarın gönderim yaptığından bağımsız olarak, hesap başına dakikada 200 mesaj. |
| Anahtarlar | Sınır yok. Gönderim sistemi başına bir tane, öngörülen kullanım budur. |
Hız sınırları API çağrılarına uygulanır, mesajlara değil: 5.000 alıcı taşıyan tek bir çağrı, sınıra karşı yalnızca bir istek olarak sayılır.
Anahtarlar anında verilir. Onay adımı yoktur.
Bir hesaba bakiye yükleyin, panel anında bir tane oluşturur.