BDIT SMS এপিআই (v1)

সহজ JSON অনুরোধে নিজের ওয়েবসাইট বা সফটওয়্যার থেকে এসএমএস পাঠান। এপিআই-তে BDIT SMS প্যানেলের মতোই একই যাচাই, ওয়ালেট ও কিউ ব্যবহার হয়।

এপিআই কী পেতে লগইন করুন

শুরু করুন

প্রতিটি এসএমএসের নিয়ম

এসএমএস পাঠান

POST/sms/send — এক বা একাধিক নম্বরে একই বার্তা।

cURL
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
<?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);
উত্তর (202)
{
  "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…" } } }
HTTPcode
401unauthenticatedএপিআই কী নেই, ভুল অথবা বাতিল
403ip_not_allowed, account_inactiveএই কী-র জন্য অনুমোদিত নয় এমন আইপি থেকে অনুরোধ; আপনার অ্যাকাউন্ট চালু নেই
422invalid_requestঅনুরোধ সঠিক নয় (fields দেখুন)
402insufficient_balanceব্যালেন্স যথেষ্ট নয়
422no_brand, no_price, promo_not_bangla, no_valid_recipients, too_long, bad_sender, schedule_pastব্র্যান্ডের নাম এখনো অনুমোদিত নয়; এই ধরনের মেসেজের মূল্য নির্ধারিত নেই; প্রমোশনাল এসএমএস বাংলায় হতে হবে; কোনো সঠিক প্রাপক নেই (সব ভুল, ডুপ্লিকেট বা আনসাবস্ক্রাইব)
409idempotency_conflictIdempotency-Key ভিন্ন অনুরোধে ব্যবহার হয়েছে
404not_foundপাওয়া যায়নি
429rate_limitedঅনেক বেশি অনুরোধ
500server_errorআমাদের দিকে সমস্যা; একই Idempotency-Key দিয়ে নিরাপদে আবার চেষ্টা করুন