İçeriğe geç
OmniChannels.ai

API ile SMS Gönderme: Python, Node.js, PHP ve cURL Örnekleri

Python, Node.js, PHP ve cURL ile SMS API: tekli ve toplu gönderim, Unicode ve Arapça, segment sayımı, iletim durumu webhook'ları ve hata yönetimi.

Güncelleme 10 dk okuma

Yazar: OmniChannels.ai Editorial Team · İnceleyen: BroadNet Messaging Solutions Team

Entegrasyon

Kısa yanıt

OmniChannels.ai API'siyle SMS göndermek için https://api.broadnet.me/sms/sendSms adresine senderId, destinationNumber, message ve messageType içeren bir JSON gövdesiyle kimliği doğrulanmış bir POST yapın. GSM-7 metin için TEXT, Arapça veya emoji için UNICODE kullanın. 200 yanıtı mesaj kimliğini düz metin olarak döndürür; nihai iletim durumu daha sonra webhook'unuza gelir.

Bu sayfada
  1. API ile SMS nasıl gönderirim?
  2. Telefon numaralarını nasıl biçimlendirmeliyim?
  3. Arapça, emoji veya diğer Unicode metni nasıl gönderirim?
  4. Göndermeden önce segmentleri nasıl sayarım?
  5. Çok sayıda numaraya nasıl gönderirim?
  6. İletim durumunu nasıl alırım?
  7. Hataları nasıl yönetir ve mükerrer gönderimden nasıl kaçınırım?
  8. Örnek senaryo: Bölgesel bir uygulama için giriş kodları
  9. Yaygın hatalar nelerdir?
  10. OmniChannels.ai nasıl yardımcı olur?

Öne çıkan noktalar

  • POST /sms/sendSms dört alan ister: senderId, destinationNumber, message ve messageType; yanıt gövdesi JSON değil, düz metin olarak mesaj kimliğidir.
  • Arapça, emoji veya GSM-7 dışındaki herhangi bir karakter için messageType değerini UNICODE yapın; böyle tek bir karakter tüm mesajı Unicode yapar ve her segmenti kısaltır.
  • POST /sms/identify göndermeden önce karakterleri ve segmentleri sayar; böylece bir mesajın kaç segment kullanacağını öngörebilirsiniz.
  • İletim asenkrondur: 200 kabul edildi demektir; DELIVERED, FAILED veya REJECTED durumu daha sonra webhook'unuza gelir.
  • API'de idempotency anahtarı yoktur; bu yüzden her gönderimi çağrıdan önce kaydedin ve zaman aşımından sonra yeniden göndermek yerine durumu kontrol edin.

Bu rehber, bir uygulamadan SMS göndermesi gereken ve Python, Node.js, PHP veya cURL ile çalışan kod isteyen geliştiriciler için hazırlandı. Yalnızca SMS API referansımızdaki ve OpenAPI belirtimimizdeki uç noktaları ve alanları kullanarak tekli gönderimi, Unicode ve Arapçayı, segment saymayı, toplu yüklemeyi, iletim durumu webhook'larını ve hata yönetimini kapsar.

API ile SMS nasıl gönderirim?

JSON gövdesiyle /sms/sendSms adresine kimliği doğrulanmış bir POST yapın. Yanıt, mesaj kimliğini düz metin olarak içeren 200 OK'tir.

Öğe Değer
Temel URL https://api.broadnet.me (/v1 öneki yok)
Uç nokta POST /sms/sendSms
Kimlik doğrulama Authorization: Bearer $BROADNET_TOKEN
İçerik türü application/json
Zorunlu alanlar senderId, destinationNumber, message, messageType

Test kimlik bilgileri kısa bir erişim talebinden sonra verilir ve test gönderimleri doğrulanmış kendi numaralarınıza gider. Anında self-servis kayıt yoktur. Hızlı başlangıca bakın.

curl -X POST https://api.broadnet.me/sms/sendSms \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "senderId": "OmniDemo",
    "destinationNumber": "447700900123",
    "message": "Your OmniDemo code is 482913",
    "messageType": "TEXT"
  }'
// Node.js 18+ (yerleşik fetch)
const res = await fetch("https://api.broadnet.me/sms/sendSms", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BROADNET_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    senderId: "OmniDemo",
    destinationNumber: "447700900123",
    message: "Your OmniDemo code is 482913",
    messageType: "TEXT",
  }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const messageId = await res.text(); // düz metin mesaj kimliği
import os
import requests

r = requests.post(
    "https://api.broadnet.me/sms/sendSms",
    headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
    json={
        "senderId": "OmniDemo",
        "destinationNumber": "447700900123",
        "message": "Your OmniDemo code is 482913",
        "messageType": "TEXT",
    },
    timeout=15,
)
r.raise_for_status()
message_id = r.text  # düz metin mesaj kimliği, JSON değil
<?php
$payload = json_encode([
    "senderId" => "OmniDemo",
    "destinationNumber" => "447700900123",
    "message" => "Your OmniDemo code is 482913",
    "messageType" => "TEXT",
]);

$ch = curl_init("https://api.broadnet.me/sms/sendSms");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 15,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("BROADNET_TOKEN"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => $payload,
]);
$messageId = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
echo $status . " " . $messageId . PHP_EOL;

Başarılı bir yanıt gövdesi şöyle görünür:

2603121407537573731

Bu kimliği kendi kaydınızla, örneğin bir sipariş veya giriş denemesiyle birlikte saklayın. İletim durumlarını daha sonra eşleştirmenin yolu budur.

Telefon numaralarını nasıl biçimlendirmeliyim?

Ülke kodu artı ulusal numara kullanın, yalnızca rakamlarla. Biçim, artı işareti hariç ITU-T E.164 uluslararası numaralandırma planını izler.

Girdi Geçerli mi? Neden
447700900123 Evet 44 ülke kodu artı ulusal numara
+44 7700 900123 Hayır Artı işaretini ve boşlukları kaldırın
07700900123 Hayır Baştaki 0'ı ülke koduyla değiştirin

Numaraları veritabanınızda E.164 olarak (+447700900123) saklayın ve isteği oluştururken + işaretini çıkarın. Ücretsiz telefon numarası biçimlendiricimiz hızlı bir kontrol sağlar.

Arapça, emoji veya diğer Unicode metni nasıl gönderirim?

messageType değerini UNICODE yapın. GSM-7 alfabesinin dışındaki her karakter; Arapça harf, emoji, kıvrık tırnak veya uzun çizgi gibi; tüm mesajı Unicode'a geçirir.

r = requests.post(
    "https://api.broadnet.me/sms/sendSms",
    headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
    json={
        "senderId": "OmniDemo",
        "destinationNumber": "971500000000",
        "message": "رمز التحقق الخاص بك هو 482913",
        "messageType": "UNICODE",
        "campaignName": "login-otp",
    },
    timeout=15,
)

PHP'de json_encode çağırırken JSON_UNESCAPED_UNICODE kullanın. Kodlama, 3GPP TS 23.040'ta SMS için tanımlandığı gibi segment boyutunu belirler:

messageType Tek SMS Bölündüğünde segment başına Kullanım
TEXT 160 karakter 153 karakter Yalnızca GSM-7 alfabesini kullanan metin
UNICODE 70 karakter 67 karakter Arapça, Kiril, Çince, emoji

Çoğu operatör segment başına faturalar; bu yüzden uzun bir Arapça mesaj, aynı uzunluktaki Latin yazılı mesajdan daha pahalıya gelir. Unicode ve Arapça SMS rehberimizi okuyun ve SMS karakter sayacını deneyin.

Göndermeden önce segmentleri nasıl sayarım?

Mesajla POST /sms/identify çağırın. Tespit edilen kodlamayı, karakter sayısını, segment sayısını ve segment başına sınırı döndürür.

curl -X POST https://api.broadnet.me/sms/identify \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "message": "Your OmniDemo code is 482913" }'
{
  "message": "Your OmniDemo code is 482913",
  "messageType": "TEXT",
  "smscount": 1,
  "charCount": 28,
  "charLimit": 160
}

smsParts (smscount'tan), charCount ve charLimit değerlerini bir gönderim isteğine aktarabilirsiniz. GSM-7 metin yanıtta GSM-7 olarak etiketlenebilir; bunu TEXT olarak gönderin.

Çok sayıda numaraya nasıl gönderirim?

Bir alıcı dosyası ve ayarların JSON dizesiyle multipart/form-data bir istek olan POST /sms/sendbulk kullanın.

curl -X POST https://api.broadnet.me/sms/sendbulk \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -F destinationNumberFile=@recipients.csv \
  -F 'bulkRequest={"senderId":"OmniDemo","message":"Your statement is ready in the app.","messageType":"TEXT","campaignName":"oct-statements","allowDuplicate":false}'
import json
import os
import requests

bulk_request = {
    "senderId": "OmniDemo",
    "message": "Your statement is ready in the app.",
    "messageType": "TEXT",
    "campaignName": "oct-statements",
    "allowDuplicate": False,
}

with open("recipients.csv", "rb") as f:
    r = requests.post(
        "https://api.broadnet.me/sms/sendbulk",
        headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
        files={"destinationNumberFile": ("recipients.csv", f, "text/csv")},
        data={"bulkRequest": json.dumps(bulk_request)},
        timeout=60,
    )
print(r.json())

Yanıt, bulkSessionId ile total, validCount, invalidCount ve duplicate içeren bir bulkListInfo nesnesi içerir. bulkSessionId değerini kampanyayla birlikte saklayın. İşler referanstaki uç noktalarla listelenebilir, duraklatılabilir, sürdürülebilir ve iptal edilebilir. Büyük bir gönderimden önce numaraları POST /sms/lookup ile de kontrol edebilirsiniz; HLR sorgusu rehberimize bakın.

İletim durumunu nasıl alırım?

İletim durumları hesabınızda yapılandırılan webhook URL'sine itilir. Bir mesaj SUBMITTED ve SENT aşamalarından DELIVERED durumuna ilerler ya da FAILED veya REJECTED olarak sonlanır. Ekibimize herkese açık HTTPS URL'sini verirsiniz; bayiler alt hesap başına bir webhook alabilir.

Yük alanları kanala göre değişir ve API belirtimi tek bir webhook şeması tanımlamaz; bu yüzden önce ham gövdeyi günlüğe alın ve alanları hesabınızdaki gerçek bir olaydan eşleyin. Asgari bir alıcı olayı saklar ve hızla onaylar:

import express from "express";

const app = express();

app.post("/webhooks/omnichannels", express.json(), async (req, res) => {
  await saveStatusEvent(req.body); // kendi depolamanız; asenkron işleyin
  res.sendStatus(200);             // hızla onaylayın
});

app.listen(3000);

İşlemeyi idempotent yapın; çünkü aynı durum iki kez gelebilir ve geç gelen bir SENT saklanmış bir DELIVERED'ın üzerine asla yazmamalıdır. Uç noktanız çalışmıyorsa POST /sms/resendDlr bir tarih aralığı için raporları yeniden iter:

curl -X POST https://api.broadnet.me/sms/resendDlr \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2026-10-09",
    "endDate": "2026-10-10",
    "senderId": "OmniDemo",
    "messageStatus": "DELIVERED"
  }'

Webhook rehberinde ve mesaj iletim durumları açıklaması yazısında daha fazlasını okuyun.

Hataları nasıl yönetir ve mükerrer gönderimden nasıl kaçınırım?

Önce HTTP durumunu, sonra hata gövdesini ele alın. Yalnızca ağ hatalarını, 429 ve 5xx durumlarını yeniden deneyin.

Kod Anlamı Eylem
200 Kabul edildi Kimliği saklayın
400 Doğrulama hatası veya eksik alan İsteği düzeltin
401 / 403 Hatalı token veya izin verilmeyen işlem Düzeltin; yeniden denemeyin
429 Hız sınırı aşıldı Retry-After süresini bekleyin
500, 503, 504 Sunucu veya yukarı akış sorunu Backoff ve jitter ile yeniden deneyin

API'nin döndürdüğü hatalar status, error, message, errorCode ve requestUri alanlı beş alanlı bir JSON gövdesi kullanır. Belgelenmiş varsayılan REST limiti sürekli saniyede 200 istektir; hesabınızın limitleri kimlik bilgilerinizle birlikte teyit edilir.

API idempotency anahtarı kabul etmez. Bir istek başarılı olurken yanıtı kaybolabilir ve kör bir yeniden deneme iki kez gönderir. Çağırmadan önce kendi işlem kimliğinizle anahtarlanmış bir bekleyen satır yazın, dönen mesaj kimliğini saklayın ve zaman aşımından sonra yeniden göndermeden önce bir webhook durumu olup olmadığına bakın. Toplu gönderimlerde allowDuplicate değerini false yapın. Ayrıntılar Hatalar ve limitler sayfasında.

Örnek senaryo: Bölgesel bir uygulama için giriş kodları

BAE'li bir perakendeci olan "Souq Rafiq" (kurgusal) giriş kodlarını SMS ile gönderir.

  1. Kimlik doğrulama servisi altı haneli bir kod üretir, beş dakikalık geçerlilikle bir hash saklar ve pending bir gönderim satırı yazar.
  2. Arapça kullanıcılar için messageType=UNICODE, İngilizce kullanıcılar için TEXT ile /sms/sendSms çağırır.
  3. 200 alınca mesaj kimliğini saklar.
  4. Webhook işleyicisi satırı DELIVERED, FAILED veya REJECTED olarak işaretler.
  5. Kısa bir beklemeden sonra durum DELIVERED değilse uygulama yeniden gönderme ve yapılandırılmışsa başka bir kanal sunar. Kanal fallback'ine bakın.
  6. Numara ve IP başına kod isteği sınırları kötüye kullanıma karşı korur; bkz. SMS pumping önleme.

Yaygın hatalar nelerdir?

  • Gönderim yanıtında r.json() çağırmak. Yanıt düz metindir.
  • Yanlış alan adları. senderId, destinationNumber ve message kullanın; to, from veya text gibi alanlar bu uç noktanın parçası değildir.
  • Numaralarda artı işareti ve baştaki sıfır.
  • Arapça için UNICODE'u unutmak; bu, metni bozar.
  • Kayıtsız gönderici kimlikleri. Bazı ülkeler bunları engeller veya değiştirir; hedef ülkeniz için gönderici kimliği kurallarını kontrol edin ve kaydı bizden isteyin.
  • 200'ü iletildi saymak.
  • Token'ın bir mobil uygulamada veya tarayıcıda olması; orada herkes onu çıkarabilir.
  • Limitler: bu rehber yaygın isteği gösterir. Zamanlama biçimleri gibi isteğe bağlı alanlar ekibimizle teyit edilmelidir.

OmniChannels.ai nasıl yardımcı olur?

OmniChannels.ai, A2P SMS'i BroadNet'in doğrudan operatör bağlantısı üzerinden; iki yönlü SMS, gönderici kimlikleri, Unicode ve Arapça, HLR sorgusu ve yüksek hacim için SMPP 3.4 ile gönderir. https://api.broadnet.me adresindeki REST API Bearer token kullanır, ayrıca WhatsApp, RCS ve diğer kanalları kapsar; iletim durumları tek bir webhook biçiminde normalleştirilir. Ekibimiz gönderici kimliği kayıtlarını sizinle birlikte hazırlar. SMS API referansına veya SMS kanalına bakın.

Sık sorulan sorular

Python ile SMS nasıl gönderirim?

requests kütüphanesiyle https://api.broadnet.me/sms/sendSms adresine Authorization: Bearer başlığıyla ve senderId, destinationNumber, message ve messageType alanlarıyla JSON POST yapın. Token'ı bir ortam değişkeninden okuyun. 200 yanıt gövdesi mesaj kimliğini düz metin olarak verir; bu yüzden r.json() yerine r.text kullanın.

SMS API hangi telefon numarası biçimini bekler?

Ülke kodu artı ulusal numara, yalnızca rakamlar; artı işareti, 00 öneki, boşluk veya baştaki sıfır olmadan. Örneğin 447700900123 geçerlidir; +44 7700 900123 ve 07700900123 geçerli değildir. Numaraları kendi veritabanınızda E.164 olarak saklayın ve isteği oluştururken artı işaretini çıkarın.

API üzerinden Arapça SMS nasıl gönderirim?

messageType değerini UNICODE yapın ve Arapça metni message alanında UTF-8 olarak gönderin. Unicode mesajlar tek segmentte 70, bölündüğünde segment başına 67 karakter alır; GSM-7'de bu rakamlar 160 ve 153'tür. Gerçek cihazlarda test edin ve önce segment sayısını görmek için /sms/identify'ı çağırın.

İletim raporlarını nasıl alırım?

Durumlar hesabınızda yapılandırılan webhook URL'sine itilir. Mesajlar SUBMITTED ve SENT aşamalarından DELIVERED, FAILED veya REJECTED durumuna ilerler. Uç noktanız ham olayı saklamalı, hızla 2xx yanıtlamalı ve asenkron işlemelidir. Olaylar kaçırıldıysa POST /sms/resendDlr bir tarih aralığı için iletim raporlarını yeniden itebilir.

Aynı anda çok sayıda numaraya nasıl SMS gönderirim?

POST /sms/sendbulk kullanın; bu, bir destinationNumberFile (CSV veya TXT) ile senderId, message ve messageType içeren bir bulkRequest JSON dizesi taşıyan multipart bir istektir. Yanıt kaç numaranın geçerli, geçersiz veya mükerrer olduğunu bildirir ve kampanyanızla saklayabileceğiniz bir bulkSessionId döndürür.

Gönderici kimliği kaydettirmem gerekir mi?

Birçok ülkede evet. Bazıları onaylı bir alfanümerik gönderici kimliği, diğerleri API'nin peId ve templateId gibi isteğe bağlı alanlarda kabul ettiği düzenleyici veya şablon tanımlayıcıları ister. Koşullar ülkeye özgüdür; bu yüzden hedef ülkeniz için gönderici kimliği sayfasına bakın; kaydı sizinle birlikte ekibimiz yürütebilir.

Kaynaklar

  1. 3GPP TS 23.040: Kısa Mesaj Servisi'nin (SMS) teknik gerçekleştirimi
  2. ITU-T E.164: Uluslararası kamu telekomünikasyon numaralandırma planı
  3. RFC 9110: HTTP Semantiği