দ্রুত শুরু
- কনসোলে একটি অ্যাকাউন্ট তৈরি করুন এবং আপনার ব্যালেন্স টপ আপ করুন।
- API কী খুলুন এবং একটি কী তৈরি করুন। প্রথম টপ-আপ ক্রেডিট হওয়ার পর কী তৈরি করা যাবে। কীটি একবার দেখানো হয়; এটি একটি সিক্রেট হিসেবে সংরক্ষণ করুন।
- সংখ্যা এবং টেক্সট সহ
/sms-এ একটি POST রিকোয়েস্ট পাঠান। ফেরত দেওয়া ক্যাম্পেইন আইডি পড়ুন, তারপর কনসোলে বা ওয়েবহুকের মাধ্যমে ডেলিভারি অনুসরণ করুন।
প্রমাণীকরণ
পাবলিক রেট লিস্ট ছাড়া প্রতিটি রিকোয়েস্ট আপনার কীকে অথরাইজেশন হেডারে বহন করে। কীগুলি sbk_live_ দিয়ে শুরু হয়। একটি নতুন কী অবিলম্বে পুরানো কী প্রতিস্থাপন করে।
Authorization: Bearer sbk_live_YOUR_KEYএসএমএস পাঠান
POST/sms
একটি ক্যাম্পেইন তৈরি করে, এটি ব্যালেন্স থেকে চার্জ করে এবং প্রতিটি বার্তা কুয়েতে রাখে। সংখ্যাগুলি পরিষ্কার এবং ডুপ্লিকেট মুক্ত করা হয়; যেগুলি ব্যবহার করা যাবে না সেগুলি dropped-এ একটি কারণ সহ ফেরত দেওয়া হয় এবং চার্জ করা হয় না।
| ফিল্ড | টাইপ | বিবরণ |
|---|---|---|
toপ্রয়োজনীয় | স্ট্রিং বা অ্যারে | একটি সংখ্যা বা 10,000 সংখ্যা পর্যন্ত একটি অ্যারে আন্তর্জাতিক ফরম্যাটে, উদাহরণস্বরূপ "+447700900461" |
textপ্রয়োজনীয় | স্ট্রিং | বার্তা টেক্সট, 10 সেগমেন্ট পর্যন্ত। GSM-7 টেক্সট প্রতি সেগমেন্টে 160 ক্যারেক্টার ফিট করে, UCS-2 70 ফিট করে |
schedule_atঐচ্ছিক | স্ট্রিং | ISO 8601 সময় 5 মিনিট থেকে 60 দিন আগে। এখন পাঠাতে বাদ দিন |
client_refঐচ্ছিক | স্ট্রিং | আপনার নিজের রেফারেন্স, a-z A-Z 0-9 _ . :, পর্যন্ত 64, রিপোর্ট এবং ওয়েবহুকগুলিতে ফেরত দেওয়া হয় |
opt_outঐচ্ছিক | বুলিয়ান | true আপনার অ্যাকাউন্ট সেটিংসে সেট করা অপ্ট-আউট লাইন সংযুক্ত করে |
curl -X POST https://sendbulksms.cc/api/v1/sms \
-H "Authorization: Bearer sbk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": ["+447700900461", "+5511955550123"],
"text": "Hi, your order 4821 ships today.",
"client_ref": "orders-4821"
}'const res = await fetch("https://sendbulksms.cc/api/v1/sms", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.SENDBULKSMS_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ to: ["+447700900461", "+5511955550123"], text: "Hi, your order 4821 ships today.", client_ref: "orders-4821" }),
});
const campaign = await res.json();
console.log(res.status, campaign.id, campaign.cost);import os, requests
r = requests.post(
"https://sendbulksms.cc/api/v1/sms",
headers={"Authorization": "Bearer " + os.environ["SENDBULKSMS_KEY"]},
json={"to": ["+447700900461", "+5511955550123"], "text": "Hi, your order 4821 ships today.", "client_ref": "orders-4821"},
timeout=30,
)
print(r.status_code, r.json()["id"])<?php
$ch = curl_init("https://sendbulksms.cc/api/v1/sms");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("SENDBULKSMS_KEY"), "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["to" => ["+447700900461", "+5511955550123"], "text" => "Hi, your order 4821 ships today.", "client_ref" => "orders-4821"]),
]);
$campaign = json_decode(curl_exec($ch), true);
echo $campaign["id"];প্রতিক্রিয়া: ক্যাম্পেইন তার খরচ এবং প্রথম 1,000 বার্তা সহ। ক্যাম্পেইন বার্তা দিয়ে আরও আনুন।
HTTP/1.1 201 Created
{
"id": "CP-7KQ2-M9XA-4HTD",
"status": "sending",
"source": "api",
"recipients": 2,
"segments": 1,
"encoding": "GSM-7",
"cost": "0.01078",
"refunded": "0.00000",
"client_ref": "orders-4821",
"scheduled_at": null,
"created_at": "2026-11-07T10:32:04.118Z",
"done_at": null,
"counts": { "queued": 2, "sent": 0, "delivered": 0, "failed": 0, "canceled": 0 },
"dropped": [],
"balance": "248.30422",
"messages": [
{ "id": "SM-2RBW-8MZN-QF6K", "campaign_id": "CP-7KQ2-M9XA-4HTD", "to": "+447700900461", "country": "GB", "parts": 1, "price": "0.00819", "status": "queued", "error": null, "created_at": "2026-11-07T10:32:04.118Z", "sent_at": null, "done_at": null }
]
}একটি পাঠান অনুমান করুন
POST/estimate
/sms-এর মতো একই বডি নেয় এবং প্রাপক, সেগমেন্ট, এনকোডিং, মোট খরচ এবং দেশ প্রতি খরচ ফেরত দেয় কোন চার্জ বা পাঠানো ছাড়াই।
{ "recipients": 2, "dropped": [], "segments": 1, "encoding": "GSM-7", "cost": "0.01078", "balance": "248.31500",
"countries": [ { "country": "GB", "recipients": 1, "cost": "0.00819" }, { "country": "BR", "recipients": 1, "cost": "0.00259" } ] }বার্তা অবস্থা
GET/sms/{message_id}
একটি বার্তা ফেরত দেয়: সংখ্যা, দেশ, সেগমেন্ট, মূল্য, অবস্থা, ব্যর্থ বার্তার জন্য ত্রুটি এবং প্রতিটি ধাপের সময়।
ক্যাম্পেইন
GET/campaigns/{campaign_id}
ক্যাম্পেইন তার খরচ, রিফান্ড এবং প্রতি অবস্থায় বার্তার সংখ্যা সহ।
GET/campaigns/{campaign_id}/messages?offset=0&limit=100
বার্তাগুলি যে ক্রমে কুয়েতে রাখা হয়েছিল, প্রতি পৃষ্ঠায় 1,000 পর্যন্ত।
POST/campaigns/{campaign_id}/cancel
একটি নির্ধারিত ক্যাম্পেইন বাতিল করে যা শুরু হয়নি এবং তার সম্পূর্ণ খরচ ব্যালেন্সে ফেরত দেয়।
ব্যালেন্স এবং রেট
GET/balance
{ "balance": "248.31500", "currency": "USD" }GET/rates
পাবলিক, কোন কী প্রয়োজন নেই। প্রতিটি দেশ তার কলিং কোড এবং প্রতি সেগমেন্ট মূল্য সহ। /rates/GB একটি দেশ ফেরত দেয়।
{ "updated": "2026-11-07", "rates": [ { "country": "GB", "name": "United Kingdom", "calling_code": "+44", "price": "0.00819", "currency": "USD", "unit": "SMS segment" } ] }ডেলিভারি ওয়েবহুক
API কী-এর অধীনে কনসোলে একটি ওয়েবহুক URL সেট করুন। যখন একটি বার্তা একটি চূড়ান্ত অবস্থায় পৌঁছায় (ডেলিভার্ড বা ব্যর্থ) আমরা একটি রিপোর্ট এটিতে POST করি। 8 সেকেন্ডের মধ্যে যেকোনো 2xx স্ট্যাটাস দিয়ে উত্তর দিন; অন্যথায় কলটি প্রায় 11 ঘন্টার মধ্যে 8 বার পর্যন্ত পুনরায় চেষ্টা করা হয়। id ব্যবহার করে একটি রিপোর্ট উপেক্ষা করুন যা আপনি ইতিমধ্যে প্রসেস করেছেন।
POST https://your-server.example/sms-status
Content-Type: application/json
X-SendBulkSMS-Signature: t=1794047524,v1=5f0c3b9e...
{
"event": "message.status",
"id": "evt_8c1d2e4f6a7b9c0d1e2f",
"created_at": "2026-11-07T10:32:09.004Z",
"data": {
"message_id": "SM-2RBW-8MZN-QF6K",
"campaign_id": "CP-7KQ2-M9XA-4HTD",
"to": "+447700900461",
"country": "GB",
"status": "delivered",
"error": null,
"parts": 1,
"price": "0.00819",
"client_ref": "orders-4821",
"done_at": "2026-11-07T10:32:08.912Z"
}
}একটি রিপোর্ট বিশ্বাস করার আগে স্বাক্ষর পরীক্ষা করুন: t + "." + raw body এর HMAC-SHA256 আপনার ওয়েবহুক সিক্রেট দিয়ে, ধ্রুব সময়ে তুলনা করুন, এবং 5 মিনিটের পুরানো সময় প্রত্যাখ্যান করুন।
import { createHmac, timingSafeEqual } from "node:crypto";
// raw = the request body exactly as received (string), header = X-SendBulkSMS-Signature
export function verify(raw, header, secret) {
const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || "");
if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
const want = Buffer.from(createHmac("sha256", secret).update(m[1] + "." + raw).digest("hex"));
const got = Buffer.from(m[2]);
return want.length === got.length && timingSafeEqual(want, got);
}import hmac, hashlib, re, time
def verify(raw: bytes, header: str, secret: str) -> bool:
m = re.fullmatch(r"t=(\d+),v1=([0-9a-f]{64})", header or "")
if not m or abs(time.time() - int(m.group(1))) > 300:
return False
want = hmac.new(secret.encode(), m.group(1).encode() + b"." + raw, hashlib.sha256).hexdigest()
return hmac.compare_digest(want, m.group(2))<?php
function verify(string $raw, string $header, string $secret): bool {
if (!preg_match('/^t=(\d+),v1=([0-9a-f]{64})$/', $header, $m) || abs(time() - (int)$m[1]) > 300) return false;
$want = hash_hmac('sha256', $m[1] . '.' . $raw, $secret);
return hash_equals($want, $m[2]);
}স্ট্যাটাস
| স্ট্যাটাস | অর্থ |
|---|---|
queued | গ্রহণ করা হয়েছে এবং চার্জ করা হয়েছে, সারিতে অপেক্ষা করছে |
sent | রুটে হস্তান্তর করা হয়েছে, ডেলিভারি রিপোর্টের অপেক্ষায় |
delivered | নেটওয়ার্ক হ্যান্ডসেটে ডেলিভারি নিশ্চিত করেছে |
failed | ডেলিভারি হয়নি; মূল্য ফেরত দেওয়া হয়েছে এবং ত্রুটিতে কারণ উল্লেখ করা হয়েছে |
canceled | শুরু হওয়ার আগে একটি নির্ধারিত প্রচারণার অংশ বাতিল করা হয়েছে; ফেরত দেওয়া হয়েছে |
ত্রুটি
ত্রুটিগুলি HTTP স্ট্যাটাস কোড এবং একটি JSON বডি ব্যবহার করে: { "error": { "code": "insufficient_balance", "message": "..." } }। একটি অনুরোধ যা ত্রুটি ফেরত দেয় তা ব্যালেন্সে চার্জ করে না।
| HTTP | কোড | কখন |
|---|---|---|
| 400 | bad_requestএকটি ফিল্ড অনুপস্থিত বা বৈধ নয়; বার্তাটি ব্যাখ্যা করে কোনটি | একটি ফিল্ড অনুপস্থিত বা বৈধ নয়; বার্তাটি ব্যাখ্যা করে কোনটি |
| 400 | no_valid_numbers"to"-তে দেওয়া কোনো নম্বর ব্যবহারযোগ্য ছিল না | "to"-তে দেওয়া কোনো নম্বর ব্যবহারযোগ্য ছিল না |
| 401 | unauthorizedAPI কী অনুপস্থিত বা বৈধ নয় | API কী অনুপস্থিত বা বৈধ নয় |
| 402 | insufficient_balanceব্যালেন্সে পাঠানোর জন্য যথেষ্ট টাকা নেই; কোনো চার্জ করা হয়নি | ব্যালেন্সে পাঠানোর জন্য যথেষ্ট টাকা নেই; কোনো চার্জ করা হয়নি |
| 404 | not_foundপ্রচারণা, বার্তা বা এন্ডপয়েন্ট আপনার অ্যাকাউন্টে নেই | প্রচারণা, বার্তা বা এন্ডপয়েন্ট আপনার অ্যাকাউন্টে নেই |
| 409 | not_scheduledশুধুমাত্র একটি নির্ধারিত প্রচারণা যা শুরু হয়নি তা বাতিল করা যাবে | শুধুমাত্র একটি নির্ধারিত প্রচারণা যা শুরু হয়নি তা বাতিল করা যাবে |
| 413 | too_many_recipientsএকটি অনুরোধে 10,000 টির বেশি নম্বর | একটি অনুরোধে 10,000 টির বেশি নম্বর |
| 429 | rate_limitedএই কী-এর জন্য এক মিনিটে 300 টির বেশি অনুরোধ | এই কী-এর জন্য এক মিনিটে 300 টির বেশি অনুরোধ |
| 500 | server_errorআবার চেষ্টা করুন; একটি ব্যর্থ অনুরোধের জন্য কোনো চার্জ করা হয় না | আবার চেষ্টা করুন; একটি ব্যর্থ অনুরোধের জন্য কোনো চার্জ করা হয় না |
সীমা
- প্রতি API কী-এর জন্য এক মিনিটে 300 টি অনুরোধ।
- প্রতি পাঠানোর অনুরোধে 10,000 টি নম্বর; প্রতি বার্তায় 10 টি সেগমেন্ট।
- বার্তাগুলি প্রতি সারিতে এক মিনিটে 200 টি পর্যন্ত পাঠানো হয়, যেই ক্রমে সেগুলি গ্রহণ করা হয়েছিল।
- 5 মিনিট থেকে 60 দিন আগে পর্যন্ত শিডিউলিং করা যায়।
- আপনার না-পাঠানোর তালিকায় থাকা নম্বরগুলি বাদ দেওয়া হয় এবং dropped-এ suppressed কোড সহ ফেরত দেওয়া হয়; সেগুলির জন্য চার্জ করা হয় না।