นักพัฒนา

เอกสาร API SMS แบบกลุ่ม

SendBulkSMS REST API ส่ง SMS ไปยัง 10,000 หมายเลขต่อคำขอ ส่งคืน ID แคมเปญทันที และรายงานทุกข้อความไปยัง webhook ของคุณ มันใช้ JSON ผ่าน HTTPS ใช้ Bearer API key และคิดค่าบริการต่อข้อความในอัตราเดียวกับคอนโซล

https://sendbulksms.cc/api/v1

เริ่มต้นอย่างรวดเร็ว

  1. สร้างบัญชีและเติมเงินในคอนโซล
  2. เปิด API keys และสร้างคีย์ คีย์สามารถสร้างได้หลังจากเติมเงินครั้งแรกเสร็จสิ้น คีย์จะแสดงเพียงครั้งเดียว; จัดเก็บเป็นความลับ
  3. ส่งคำขอ POST ไปที่ /sms พร้อมหมายเลขและข้อความ อ่านรหัสแคมเปญที่ส่งกลับมา จากนั้นติดตามการจัดส่งในคอนโซลหรือผ่านเว็บฮุค

การยืนยันตัวตน

ทุกคำขอยกเว้นรายการอัตราสาธารณะต้องมีคีย์ในส่วนหัว Authorization คีย์เริ่มต้นด้วย sbk_live_ คีย์ใหม่จะแทนที่คีย์เก่าทันที

Authorization: Bearer sbk_live_YOUR_KEY

ส่ง SMS

POST/sms

สร้างแคมเปญ หักเงินจากยอดเงิน และเข้าคิวทุกข้อความ หมายเลขจะถูกทำความสะอาดและกำจัดซ้ำ; หมายเลขที่ไม่สามารถใช้ได้จะถูกส่งกลับใน dropped พร้อมเหตุผลและไม่ถูกคิดเงิน

ฟิลด์คำอธิบาย
toจำเป็นหมายเลขเดียวหรืออาร์เรย์สูงสุด 10,000 หมายเลขในรูปแบบสากล เช่น "+447700900461"
textจำเป็นข้อความ สูงสุด 10 ส่วน ข้อความ GSM-7 ใช้ได้ 160 ตัวอักษรต่อส่วน UCS-2 ใช้ได้ 70 ตัวอักษร
schedule_atไม่จำเป็นเวลา ISO 8601 จาก 5 นาทีถึง 60 วันข้างหน้า ไม่ระบุเพื่อส่งทันที
client_refไม่จำเป็นอ้างอิงของคุณเอง สูงสุด 64 ตัวอักษร a-z A-Z 0-9 _ . : -, ส่งกลับในรายงานและเว็บฮุค
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"
  }'

ตอบกลับ: แคมเปญพร้อมค่าใช้จ่ายและข้อความ 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" } ] }

เว็บฮุคการจัดส่ง

ตั้งค่า URL เว็บฮุคในคอนโซลภายใต้ API keys เมื่อข้อความถึงสถานะสุดท้าย (จัดส่งหรือล้มเหลว) เราจะ POST รายงานไปที่ URL ตอบกลับด้วยสถานะ 2xx ใดๆ ภายใน 8 วินาที; ไม่เช่นนั้นจะลองอีกครั้งสูงสุด 8 ครั้งในประมาณ 11 ชั่วโมง ใช้ 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"
  }
}

ตรวจสอบลายเซ็นก่อนเชื่อถือรายงาน: HMAC-SHA256 ของ t + "." + raw body ด้วยความลับเว็บฮุคของคุณ เปรียบเทียบในเวลาคงที่ และปฏิเสธเวลาที่เก่ากว่า 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);
}

สถานะ

สถานะความหมาย
queuedรับแล้วและคิดเงินแล้ว กำลังรอคิวในการส่ง
sentส่งให้ผู้ให้บริการแล้ว กำลังรอรายงานการส่ง
deliveredเครือข่ายยืนยันการส่งถึงมือถือแล้ว
failedส่งไม่สำเร็จ เงินจะถูกคืนและแสดงสาเหตุใน error
canceledส่วนหนึ่งของแคมเปญที่กำหนดเวลาถูกยกเลิกก่อนเริ่มส่ง เงินถูกคืน

ข้อผิดพลาด

ข้อผิดพลาดใช้รหัสสถานะ HTTP และเนื้อหา JSON: { "error": { "code": "insufficient_balance", "message": "..." } } การร้องขอที่ส่งกลับข้อผิดพลาดจะไม่คิดเงินจากยอดเงิน

HTTPรหัส
400bad_requestไม่มีฟิลด์หรือฟิลด์ไม่ถูกต้อง ข้อความจะระบุว่าอันไหน
400no_valid_numbersไม่มีหมายเลขใน "to" ที่สามารถใช้ได้
401unauthorizedไม่มี API key หรือไม่ถูกต้อง
402insufficient_balanceยอดเงินไม่พอสำหรับการส่ง ไม่มีการคิดเงิน
404not_foundแคมเปญ ข้อความหรือ endpoint ไม่มีในบัญชีของคุณ
409not_scheduledเฉพาะแคมเปญที่กำหนดเวลาและยังไม่เริ่มส่งเท่านั้นที่ยกเลิกได้
413too_many_recipientsมากกว่า 10,000 หมายเลขในหนึ่งคำขอ
429rate_limitedมากกว่า 300 คำขอในหนึ่งนาทีสำหรับ key นี้
500server_errorลองอีกครั้ง ไม่มีการคิดเงินสำหรับคำขอที่ล้มเหลว

ข้อจำกัด

  • 300 คำขอต่อนาทีต่อ API key
  • 10,000 หมายเลขต่อคำขอส่ง 10 ส่วนต่อข้อความ
  • ข้อความจะถูกส่งสูงสุด 200 ข้อความต่อนาทีต่อคิว ตามลำดับที่รับมา
  • กำหนดเวลาส่งล่วงหน้าได้ 5 นาทีถึง 60 วัน
  • หมายเลขในรายชื่อไม่ส่งจะถูกข้ามและส่งกลับใน dropped พร้อมรหัส suppressed ไม่มีการคิดเงิน
เอกสาร API การส่ง SMS แบบกลุ่ม: ส่ง SMS ด้วย REST API | SendBulkSMS