BDIT SMS এপিআই (v1)
সহজ JSON অনুরোধে নিজের ওয়েবসাইট বা সফটওয়্যার থেকে এসএমএস পাঠান। এপিআই-তে BDIT SMS প্যানেলের মতোই একই যাচাই, ওয়ালেট ও কিউ ব্যবহার হয়।
শুরু করুন
- প্যানেলের ডেভেলপার → এপিআই কী থেকে একটি কী তৈরি করুন। পূর্ণ কী শুধু একবারই দেখানো হয়।
- প্রতিটি অনুরোধে কী পাঠান:
Authorization: Bearer আপনার_এপিআই_কী। - বেস ঠিকানা:
https://sms.bdit.xyz/api/v1। JSON পাঠান ও গ্রহণ করুন (Content-Type: application/json)। - কী-তে অনুমোদিত আইপি ঠিকানা দিলে অন্য ঠিকানার অনুরোধ প্রত্যাখ্যাত হবে।
প্রতিটি এসএমএসের নিয়ম
- নম্বর
01712345678,+8801712345678বা8801712345678যেভাবেই লিখুন চলবে। শুধু বাংলাদেশি মোবাইল নম্বর (013–019) গ্রহণযোগ্য। ডুপ্লিকেট ও আপনার আনসাবস্ক্রাইব তালিকার নম্বর বাদ যায় এবং উত্তরে গণনা দেখানো হয়। - নন-মাস্কিং এসএমএসের শুরুতে আপনার অনুমোদিত ব্র্যান্ডের নাম স্বয়ংক্রিয়ভাবে বসে:
(আপনার ব্র্যান্ড) আপনার বার্তা। ব্র্যান্ডের নাম দৈর্ঘ্য ও মূল্যের হিসাবে ধরা হয়। অনুমোদিত ব্র্যান্ডের নাম না থাকলে নন-মাস্কিং এসএমএস পাঠানো যায় না। - প্রমোশনাল এসএমএস অবশ্যই বাংলায় হতে হবে (বিটিআরসি নিয়ম)। অর্ডার, পেমেন্ট ও ওটিপি বার্তার জন্য
"category": "transactional"(ডিফল্ট) ব্যবহার করুন। - দৈর্ঘ্য ও মূল্য: ইংরেজি ১৬০ অক্ষর (লম্বা হলে প্রতি পার্টে ১৫৩), বাংলা ৭০ (প্রতি পার্টে ৬৭)। পাঠানোর সময়ই পুরো খরচ ওয়ালেট থেকে কাটা হয় এবং ব্যর্থ মেসেজের টাকা (অ্যাকাউন্টে ফেরতের নিয়ম থাকলে) স্বয়ংক্রিয়ভাবে ফেরত আসে।
- মেসেজ কিউতে যায় এবং কয়েক সেকেন্ডের মধ্যে পাঠানো হয়। অবস্থা দেখতে স্ট্যাটাস এন্ডপয়েন্ট ব্যবহার করুন:
queued → submitted, অথবাrejected / failed(টাকা ফেরতসহ)।
এসএমএস পাঠান
POST/sms/send — এক বা একাধিক নম্বরে একই বার্তা।
to— একটি নম্বর অথবা নম্বরের তালিকাmessage— বার্তার লেখা (ব্র্যান্ডের নাম আপনার হয়ে যোগ হবে)category—transactional(ডিফল্ট) অথবাpromotionalsender_id— ঐচ্ছিক: আপনাকে দেওয়া সেন্ডার আইডিগুলোর একটি (মাস্কিং আইডিতে ব্র্যান্ডের নাম বসে না)schedule_at— ঐচ্ছিক: পরে পাঠান, যেমন2026-11-01T10:30:00+06:00reference— ঐচ্ছিক: আপনার নিজস্ব রেফারেন্স (সর্বোচ্চ ১০০ অক্ষর), স্ট্যাটাসের সাথে ফেরত আসে
curl -X POST https://sms.bdit.xyz/api/v1/sms/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-confirmation" \
-d '{
"to": ["01712345678", "01812345678"],
"message": "আপনার অর্ডারটি নিশ্চিত করা হয়েছে।",
"category": "transactional",
"reference": "order-1042"
}'
<?php
$ch = curl_init('https://sms.bdit.xyz/api/v1/sms/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
'Idempotency-Key: order-1042-confirmation',
],
CURLOPT_POSTFIELDS => json_encode([
'to' => '01712345678',
'message' => 'Your order has been confirmed.',
]),
]);
$answer = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 202 = accepted
print_r($answer);
{
"data": {
"batch_id": 118,
"status": "queued",
"counts": { "valid": 2, "invalid": 0, "duplicate": 0, "opted_out": 0 },
"progress": { "sent": 0, "failed": 0, "waiting": 2, "cancelled": 0 },
"total_cost": "1.20",
"reference": "order-1042",
"scheduled_at": null,
"created_at": "2026-11-01T10:30:00+06:00",
"messages_queued": 2,
"messages": [ { "id": 5521, "to": "8801712345678" }, { "id": 5522, "to": "8801812345678" } ],
"balance": "848.80"
}
}
প্রতিটি নম্বরে আলাদা বার্তা পাঠান
POST/sms/send-dynamic — একটি অনুরোধে সর্বোচ্চ ১,০০,০০০টি বার্তা।
curl -X POST https://sms.bdit.xyz/api/v1/sms/send-dynamic \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"category": "transactional",
"messages": [
{ "to": "01712345678", "message": "Rahim, your invoice INV-1 is ready", "reference": "INV-1" },
{ "to": "01812345678", "message": "Karim, your invoice INV-2 is ready", "reference": "INV-2" }
]
}'
ব্যালেন্স
GET/balance
curl https://sms.bdit.xyz/api/v1/balance -H "Authorization: Bearer YOUR_API_KEY"
{ "data": { "balance": "850.00", "currency": "BDT",
"approx_sms": { "english": 1700, "bangla": 1416 },
"brand_name": "Your Brand", "brand_status": "approved" } }
একটি মেসেজ দেখুন
GET/sms/{id}
curl https://sms.bdit.xyz/api/v1/sms/5521 -H "Authorization: Bearer YOUR_API_KEY"
{ "data": { "id": 5521, "to": "8801712345678", "status": "submitted", "parts": 1, "encoding": "unicode",
"price": "0.60", "batch_id": 118, "reference": "order-1042", "error_code": null,
"error_message": null, "refunded": false,
"created_at": "2026-11-01T10:30:00+06:00", "sent_at": "2026-11-01T10:30:04+06:00" } }
status: queued, sending, submitted, rejected, failed, cancelled.
প্রেরণ (ব্যাচ) দেখুন ও বাতিল করুন
প্রতিটি অনুরোধে একটি ব্যাচ তৈরি হয়। POST /batches/{id}/cancel যে মেসেজ এখনো যায়নি (যেমন নির্ধারিত) সেগুলো বাতিল করে টাকা ফেরত দেয়।
GET/batches/{id} POST/batches/{id}/cancel
আনসাবস্ক্রাইব (STOP) তালিকা
এই তালিকার নম্বরে কখনো পাঠানো হয় না।
GET/opt-outs POST/opt-outs DELETE/opt-outs/{number}
curl -X POST https://sms.bdit.xyz/api/v1/opt-outs \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{ "numbers": ["01712345678"], "reason": "replied STOP" }'
আরও কল (POS ও রিপোর্টের জন্য)
পাঠানোর আগে দাম দেখা, বার্তা ও ব্যাচের তালিকা, টেমপ্লেট এবং গ্রাহক প্যানেলে এক-বারের লগইন লিংক।
POST/price {"message": "…"} → length, parts, price (nothing is sent or charged)
GET/messages GET/batches — page, per_page (max 200), status, from, until, source (panel, api, pos), number, reference
GET/templates POST/templates GET/templates/{id} PUT/templates/{id} DELETE/templates/{id}
POST/login-link → {"url": "…", "expires_in": 60} — লিংকটি ৬০ সেকেন্ড বৈধ এবং একবারই কাজ করে।
নিরাপদ রিট্রাই (Idempotency-Key)
পাঠানোর অনুরোধে Idempotency-Key: যেকোনো-ইউনিক-মান হেডার দিন। একই কী আবার পাঠালে (যেমন নেটওয়ার্ক টাইমআউটের পর) প্রথম ফলাফলই ফেরত আসে, সাথে Idempotent-Replay: true হেডার থাকে এবং দ্বিতীয়বার কিছু পাঠানো বা চার্জ করা হয় না। একই কী ভিন্ন অনুরোধে ব্যবহার করলে idempotency_conflict (409) ত্রুটি আসে।
সীমা
প্রতিটি এপিআই কী মিনিটে ১২০টি অনুরোধ করতে পারে। এর বেশি হলে HTTP 429 (rate_limited) আসে; একটু অপেক্ষা করে আবার চেষ্টা করুন।
ত্রুটি
প্রতিটি ত্রুটি দেখতে এরকম, স্থির code এবং বাংলা ও ইংরেজি বার্তাসহ:
{ "error": { "code": "insufficient_balance",
"message": { "bn": "আপনার ব্যালেন্স যথেষ্ট নয়…", "en": "Your balance is not enough…" } } }
| HTTP | code | |
|---|---|---|
| 401 | unauthenticated | এপিআই কী নেই, ভুল অথবা বাতিল |
| 403 | ip_not_allowed, account_inactive | এই কী-র জন্য অনুমোদিত নয় এমন আইপি থেকে অনুরোধ; আপনার অ্যাকাউন্ট চালু নেই |
| 422 | invalid_request | অনুরোধ সঠিক নয় (fields দেখুন) |
| 402 | insufficient_balance | ব্যালেন্স যথেষ্ট নয় |
| 422 | no_brand, no_price, promo_not_bangla, no_valid_recipients, too_long, bad_sender, schedule_past | ব্র্যান্ডের নাম এখনো অনুমোদিত নয়; এই ধরনের মেসেজের মূল্য নির্ধারিত নেই; প্রমোশনাল এসএমএস বাংলায় হতে হবে; কোনো সঠিক প্রাপক নেই (সব ভুল, ডুপ্লিকেট বা আনসাবস্ক্রাইব) |
| 409 | idempotency_conflict | Idempotency-Key ভিন্ন অনুরোধে ব্যবহার হয়েছে |
| 404 | not_found | পাওয়া যায়নি |
| 429 | rate_limited | অনেক বেশি অনুরোধ |
| 500 | server_error | আমাদের দিকে সমস্যা; একই Idempotency-Key দিয়ে নিরাপদে আবার চেষ্টা করুন |