📨 BZ TOPUP SMS API

API key পেতে অ্যাপের প্রোফাইল → API Key থেকে Key তৈরি করুন। নিরাপত্তার জন্য Key সার্ভারে শুধু hash হিসেবে থাকে এবং তৈরির সময় একবারই দেখানো হয়; হারালে নতুন Key তৈরি করুন (পুরোনোটি বন্ধ হবে)। Key গোপন রাখুন; URL-এ পাঠাবেন না।

Endpoint

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

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

<?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);

Python

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())

JavaScript

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 response

{
  "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 length & charge

প্রতিটি মেসেজ অক্ষর-সংখ্যা অনুযায়ী এক বা একাধিক SMS অংশে ভাগ হয়। চার্জ = price_per_sms × SMS অংশ × প্রাপক।

ধরন১ SMS-এ সর্বোচ্চলম্বা হলে প্রতি অংশে
ইংরেজি (GSM-7)১৬০ অক্ষর১৫৩ অক্ষর
বাংলা / Unicode / ইমোজি৭০ অক্ষর৬৭ অক্ষর

পাঠানোর আগে খরচ জানতে 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 থাকে।

Balance check

curl "https://www.sms.bztechlabs.com/sms_api.php?action=balance" \
  -H "Authorization: Bearer YOUR_API_KEY"

Status & error codes

HTTPerror_code / statusঅর্থ
200SUBMITTEDSMS provider-এ গৃহীত হয়েছে (Delivered নয়)
202PROVIDER_RESULT_UNCERTAINফলাফল অনিশ্চিত; charge hold আছে। আবার পাঠাবেন না, admin যাচাই করবেন
400MISSING_PARAMETERS / INVALID_NUMBER / MESSAGE_TOO_LONG / TOO_MANY_NUMBERSRequest ভুল
400MESSAGE_TOO_LONGমেসেজ অনুমোদিত সীমার চেয়ে লম্বা (উত্তরে segments ও max_sms_parts থাকে)
400INVALID_MESSAGEমেসেজ বৈধ UTF-8 টেক্সট নয়
401MISSING_API_KEY / INVALID_API_KEYAPI key নেই বা ভুল
402INSUFFICIENT_BALANCEBalance কম
403MESSAGE_BLOCKEDমেসেজে আপত্তিকর/অশ্লীল শব্দ আছে; পাঠানো হয়নি, চার্জ কাটা হয়নি
403API_DISABLED / QUOTA_EXCEEDEDঅ্যাকাউন্টের API বন্ধ, অথবা মাসিক SMS quota শেষ
409REQUEST_IN_PROGRESSএকই Idempotency-Key এখনো প্রসেস হচ্ছে
422IDEMPOTENCY_KEY_REUSEDএকই key ভিন্ন request-এ ব্যবহার করা হয়েছে
429RATE_LIMITED৬০ সেকেন্ডে সর্বোচ্চ ৬০ request
502PROVIDER_REQUEST_FAILEDProvider গ্রহণ করেনি; balance ফেরত দেওয়া হয়েছে
503NOT_CONFIGURED / PROVIDER_NOT_CONFIGUREDসার্ভিস সেট করা নেই

Best practices

© 2026 BZ TOPUP