API SMS Buluthat

SMS انبوه، SMS شخصی‌سازی‌شده، SMS OTP (کد تأیید)، SMS ورودی، گزارش تحویل و لیست سیاه.

  • آدرس: https://api.buluthat.com/api/sms.php?action=<eylem>
  • هویت: Authorization: Bearer <anahtar> (یا X-Api-Key: <anahtar>). کلید: پنل > SMS انبوه > API و تنظیمات.
  • بدنه: JSON (Content-Type: application/json) یا فرم. پاسخ‌ها JSON و UTF-8 هستند.
  • خطا: {"ok":false,"error":"<kod>","message":"<açıklama>"} + HTTP 4xx/5xx.
  • شماره‌ها 05321234567, 5321234567, +905321234567, 905321234567 در قالب‌های پذیرفته می‌شود.

طول پیام

کدگذاری1 SMS2 SMS3 SMS… 7 SMS
استاندارد1603064591071
ترکی (اگر شامل Ş ş Ğ ğ ç ı İ باشد)1552984471043
یونیکد (ایموجی و غیره)70134201469

^ { } \ [ ] ~ | € دو نویسه حساب می‌شود. Ö ö Ü ü Ç در کدگذاری استاندارد است.

ارسال — send (POST)

{
  "header": "FIRMAADI",
  "message": "Merhaba {ad}, {tutar} TL ödemeniz alınmıştır.",
  "recipients": [
    {"phone": "05321234567", "name": "Ayşe Yılmaz", "tutar": "1.250", "ref": "CARI-17"},
    {"phone": "05331234567", "name": "Mehmet Kaya", "tutar": "300"}
  ],
  "send_at": "2026-10-01 10:00",
  "is_commercial": false,
  "valid_for": "24:00",
  "rate_per_minute": 500,
  "custom_ref": "EYLUL-KAMPANYA"
}
حوزهتوضیح
headerسرشناسه تأییدشده. اگر خالی باشد سرشناسه پیش‌فرض.
messageمتن. جایگزین‌ها: {ad} {soyad} {adsoyad} {telefon} {firma} {ret_link} + سایر فیلدهای گیرنده.
recipients[{phone, name?, ref?, <alan>…}]. همان شماره یک‌بار ارسال می‌شود.
phonesمیان‌بر: ["0532…","0533…"] یا متن جداشده با ویرگول (همان پیام برای همه).
messagesمتن کاملاً متفاوت برای هر شخص: [{phone, message, ref?}] (در این حالت message لازم نیست).
send_atتاریخ آینده (حداکثر 90 روز). اگر خالی باشد فوراً.
is_commercialپیام تجاری. true اگر iys_recipient_type: BIREYSEL / TACIR؛ به گیرنده‌ای که تأیید İYS ندارد ارسال نمی‌شود.
valid_forاگر تلفن خاموش باشد مدت آزمایش، SS:DD (00:01 – 48:00).
rate_per_minuteارسال در دقیقه (0 = سریع‌ترین).
custom_refمرجع خودتان؛ status پرس‌وجو می‌شود.

پاسخ:

{"ok":true,"data":{"campaign_id":152,"status":"queued","recipients":2,"credits":2,
 "skipped":{"invalid":0,"blacklist":0,"duplicate":0}, ...}}

شماره‌های لیست سیاه، نادرست و (اگر حفاظت از تکرار فعال باشد) کسانی که امروز همان متن را گرفته‌اند رد می‌شوند؛ اعتباری کسر نمی‌شود. اعتبار پیام تحویل‌نشده خودکار بازگردانده می‌شود.

کدهای خطا: missing_recipients, missing_message, request_failed (اعتبار ناکافی، سرشناسه تأییدنشده، پیام بسیار طولانی … — message توضیح می‌دهد)، account_inactive.

گزارش — status (GET)

?action=status&campaign_id=152 یا &custom_ref=EYLUL-KAMPANYA؛ اختیاری status, phone, limit (≤1000), offset.

وضعیت‌های پیام: queued (در صف)، sending, waiting (در انتظار گزارش اپراتور)، delivered, failed, expired, rejected, cancelled.

سایر اقدامات

اقدامروشتوضیح
balanceGET{"sms":1200,"otp":500,"lots":[…]} اعتبار باقی‌مانده و تاریخ انقضا
headersGETسرشناسه‌های تأییدشده
campaignsGETفهرست ارسال (from, to, limit, offset)
cancelPOSTcampaign_id — پیام‌های ارسال‌نشده لغو، اعتبار بازگردانده می‌شود
inboundGETSMSهای ورودی: since_id, limit → [{id, from, to, keyword, text, optout, received_at}]
blacklistGETلیست سیاه
blacklist_add / blacklist_removePOSTphones: ["0532…"]

SMS OTP

POST ?action=otp_send   {"phone":"05321234567","reference":"UYE-1452"}
→ {"ok":true,"data":{"id":88,"status":"sent","expires_at":"…"},"code":"482913"}

POST ?action=otp_verify {"id":88,"code":"482913"}
→ {"ok":true,"verified":true}
   hata: wrong_code | expired | too_many_attempts | already_verified | not_found

GET  ?action=otp_status&id=88
  • کد را خودتان هم می‌توانید بدهید (code، 4-10 رقم)؛ اگر ما تولید کنیم فقط یک‌بار در همین پاسخ برمی‌گردد، آنچه ذخیره می‌شود فقط هش است.
  • template می‌توانید متن را تغییر دهید ({kod} الزامی، {firma}, {sure}).
  • OTP ابتدا از اعتبار OTP و پس از اتمام از اعتبار SMS کسر می‌شود؛ بدون انتظار ارسال می‌شود.
  • ارسال به یک شماره در 10 دقیقه محدود است.

Webhook

اگر در پنل > SMS انبوه > API و تنظیمات نشانی وارد کنید رویدادها POST می‌شود:

X-Buluthat-Event: sms.delivery | sms.inbound | sms.optout
X-Buluthat-Signature: sha256=<HMAC-SHA256(gövde, sır)>

{"event":"delivery","data":{"message_id":9012,"campaign_id":152,"ref":"CARI-17",
 "phone":"905321234567","status":"delivered","detail":"İletildi","done_at":"…"}}
{"event":"inbound","data":{"id":44,"from":"905321234567","to":"…","keyword":"","text":"…","optout":false}}

اگر 2xx برنگردانید پس از 1 دقیقه، 5 دقیقه، 15 دقیقه، 1 ساعت، 3 ساعت و 6 ساعت دوباره تلاش می‌شود.

نمونه (PHP)

$ch = curl_init('https://api.buluthat.com/api/sms.php?action=send');
curl_setopt_array($ch, [
  CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key, 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(['message' => 'Siparişiniz kargoda.', 'phones' => ['05321234567']]),
]);
$res = json_decode(curl_exec($ch), true);