API key পেতে অ্যাপের প্রোফাইল → API Key থেকে Key তৈরি করুন। নিরাপত্তার জন্য Key সার্ভারে শুধু hash হিসেবে থাকে এবং তৈরির সময় একবারই দেখানো হয়; হারালে নতুন Key তৈরি করুন (পুরোনোটি বন্ধ হবে)। Key গোপন রাখুন; URL-এ পাঠাবেন না।
https://www.sms.bztechlabs.com/sms_api.php
Method: POST (GET-ও চলে) · Auth: Authorization: Bearer YOUR_API_KEY
| Parameter | বিবরণ |
|---|---|
number | বাংলাদেশি মোবাইল নম্বর, 01 দিয়ে শুরু ১১ ডিজিট (যেমন 01712345678)। 8801… বা +8801… দিলে স্বয়ংক্রিয়ভাবে 01 ফরম্যাটে নেওয়া হয়। একাধিক হলে comma দিয়ে (সর্বোচ্চ ১০০)। |
message | সর্বোচ্চ ১০০০ অক্ষর এবং সর্বোচ্চ 10 SMS অংশ (নিচে “SMS length & charge” দেখুন)। |
Idempotency-Key (header, ঐচ্ছিক) | একই key দিয়ে retry করলে SMS দ্বিতীয়বার যায় না এবং charge হয় না (২৪ ঘণ্টা)। |
প্রতি SMS: আপনার account-এর price (default 0.50 BDT)। Price ও balance দেখতে নিচের Balance endpoint ব্যবহার করুন।
curl -X POST "https://www.sms.bztechlabs.com/sms_api.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: order-1001-sms" \
--data-urlencode "number=01XXXXXXXXX" \
--data-urlencode "message=Your OTP is 123456"<?php
$ch = curl_init('https://www.sms.bztechlabs.com/sms_api.php');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Idempotency-Key: ' . uniqid('sms-', true),
],
CURLOPT_POSTFIELDS => http_build_query([
'number' => '01XXXXXXXXX',
'message' => 'Your OTP is 123456',
]),
CURLOPT_TIMEOUT => 40,
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($res);import requests, uuid
r = requests.post(
"https://www.sms.bztechlabs.com/sms_api.php",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Idempotency-Key": str(uuid.uuid4()),
},
data={"number": "01XXXXXXXXX", "message": "Your OTP is 123456"},
timeout=40,
)
print(r.status_code, r.json())const res = await fetch("https://www.sms.bztechlabs.com/sms_api.php", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/x-www-form-urlencoded",
},
body: new URLSearchParams({ number: "01XXXXXXXXX", message: "Your OTP is 123456" }),
});
console.log(res.status, await res.json());{
"success": true,
"status": "SUBMITTED",
"message": "SMS submitted successfully; delivery confirmation depends on provider DLR support",
"log_id": "SMS-XXXXXXXXXX",
"message_id": "...",
"recipients": 1,
"segments": 1,
"encoding": "GSM7",
"sms_count": 1,
"price_per_sms": 0.5,
"charged": 0.5,
"balance": 99.5
}
SUBMITTED মানে provider SMS গ্রহণ করেছে; handset-এ Delivered নিশ্চিত নয়।
প্রতিটি মেসেজ অক্ষর-সংখ্যা অনুযায়ী এক বা একাধিক SMS অংশে ভাগ হয়। চার্জ = price_per_sms × SMS অংশ × প্রাপক।
| ধরন | ১ SMS-এ সর্বোচ্চ | লম্বা হলে প্রতি অংশে |
|---|---|---|
| ইংরেজি (GSM-7) | ১৬০ অক্ষর | ১৫৩ অক্ষর |
| বাংলা / Unicode / ইমোজি | ৭০ অক্ষর | ৬৭ অক্ষর |
^ { } \ [ ~ ] | € ইংরেজিতে ২ অক্ষর গোনা হয়; ইমোজি ২ অক্ষর।400 MESSAGE_TOO_LONG।পাঠানোর আগে খরচ জানতে action=estimate (কিছু পাঠানো বা charge হয় না):
curl -X POST "https://www.sms.bztechlabs.com/sms_api.php?action=estimate" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "message=আপনার OTP: 123456" \
-d "number=01XXXXXXXXX,01YYYYYYYYY"
উত্তরে encoding, segments, sms_count (= অংশ × প্রাপক), estimated_charge ও fits থাকে।
curl "https://www.sms.bztechlabs.com/sms_api.php?action=balance" \
-H "Authorization: Bearer YOUR_API_KEY"| HTTP | error_code / status | অর্থ |
|---|---|---|
| 200 | SUBMITTED | SMS provider-এ গৃহীত হয়েছে (Delivered নয়) |
| 202 | PROVIDER_RESULT_UNCERTAIN | ফলাফল অনিশ্চিত; charge hold আছে। আবার পাঠাবেন না, admin যাচাই করবেন |
| 400 | MISSING_PARAMETERS / INVALID_NUMBER / MESSAGE_TOO_LONG / TOO_MANY_NUMBERS | Request ভুল |
| 400 | MESSAGE_TOO_LONG | মেসেজ অনুমোদিত সীমার চেয়ে লম্বা (উত্তরে segments ও max_sms_parts থাকে) |
| 400 | INVALID_MESSAGE | মেসেজ বৈধ UTF-8 টেক্সট নয় |
| 401 | MISSING_API_KEY / INVALID_API_KEY | API key নেই বা ভুল |
| 402 | INSUFFICIENT_BALANCE | Balance কম |
| 403 | MESSAGE_BLOCKED | মেসেজে আপত্তিকর/অশ্লীল শব্দ আছে; পাঠানো হয়নি, চার্জ কাটা হয়নি |
| 403 | API_DISABLED / QUOTA_EXCEEDED | অ্যাকাউন্টের API বন্ধ, অথবা মাসিক SMS quota শেষ |
| 409 | REQUEST_IN_PROGRESS | একই Idempotency-Key এখনো প্রসেস হচ্ছে |
| 422 | IDEMPOTENCY_KEY_REUSED | একই key ভিন্ন request-এ ব্যবহার করা হয়েছে |
| 429 | RATE_LIMITED | ৬০ সেকেন্ডে সর্বোচ্চ ৬০ request |
| 502 | PROVIDER_REQUEST_FAILED | Provider গ্রহণ করেনি; balance ফেরত দেওয়া হয়েছে |
| 503 | NOT_CONFIGURED / PROVIDER_NOT_CONFIGURED | সার্ভিস সেট করা নেই |
Idempotency-Key দিন; network error-এ একই key দিয়ে retry করুন।202 PROVIDER_RESULT_UNCERTAIN পেলে সাথে সাথে আবার পাঠাবেন না।© 2026 BZ TOPUP