Sendjai Open Platform
API สำหรับเชื่อมต่อระบบขนส่งพัสดุ สร้างออเดอร์ เช็คราคา ติดตามพัสดุ — ทั้งหมดผ่าน API เดียว
Base URL
| Environment | Base URL | สถานะ |
|---|---|---|
| Production | https://api.sendjai.com/v2 | 🟢 Active |
| Legacy | https://app.sendjai.com/api/v1 | 🟢 Active |
Features
| Feature | คำอธิบาย |
|---|---|
| 🚚 Multi-courier | เชื่อมต่อขนส่งหลายเจ้าผ่าน API เดียว (Flash, Kerry, J&T, ไปรษณีย์ไทย) |
| 💰 Check Price | เปรียบเทียบราคาค่าส่งทุกขนส่งอัตโนมัติ |
| 📍 Real-time Tracking | ติดตามสถานะพัสดุแบบ real-time |
| 🏦 COD Support | รองรับเก็บเงินปลายทาง |
| 🖨️ Label Printing | พิมพ์ใบปะหน้าพัสดุ A4/A6/A7 |
| 🔐 Secure | HMAC-SHA256 signature ทุก request |
เริ่มต้นใช้งาน
เชื่อมต่อระบบของคุณกับ Sendjai ใน 3 ขั้นตอน
สมัครบัญชี Developer
สมัครที่ app.sendjai.com แล้วไปที่ ตั้งค่า → API Keys เพื่อรับ App ID และ Secret Key
ตั้งค่า API Key
ใช้ App ID + Secret Key สร้าง HMAC-SHA256 signature สำหรับทุก request
Headers:
X-App-Id: YOUR_APP_ID
X-Timestamp: 1712345678
X-Signature: a1b2c3d4e5f6...
เรียก API
ส่ง request ไปที่ Base URL พร้อม signature
curl -X POST https://api.sendjai.com/v2/couriers/check-price \
-H "X-App-Id: YOUR_APP_ID" \
-H "X-Timestamp: 1712345678" \
-H "X-Signature: a1b2c3..." \
-H "Content-Type: application/json" \
-d '{"src_zipcode":"10230","dst_zipcode":"50200","weight":500}'
Authentication
ทุก API request ต้องมี 3 headers สำหรับยืนยันตัวตน
Required Headers
| Header | Type | คำอธิบาย |
|---|---|---|
X-App-Id | string | App ID ที่ได้จากหน้า API Keys |
X-Timestamp | integer | Unix timestamp (วินาที) ต้องไม่เกิน 5 นาทีจากเวลาจริง |
X-Signature | string | HMAC-SHA256 hash ของ sign string |
วิธีสร้าง Signature
{app_id}{timestamp}{request_body}
Node.js / TypeScript
const crypto = require("crypto");
const appId = "YOUR_APP_ID";
const secretKey = "YOUR_SECRET_KEY";
const timestamp = Math.floor(Date.now() / 1000);
const body = JSON.stringify({
src_zipcode: "10230",
dst_zipcode: "50200",
weight: 500
});
const signString = `${appId}${timestamp}${body}`;
const signature = crypto
.createHmac("sha256", secretKey)
.update(signString)
.digest("hex");
const response = await fetch("https://api.sendjai.com/v2/couriers/check-price", {
method: "POST",
headers: {
"X-App-Id": appId,
"X-Timestamp": String(timestamp),
"X-Signature": signature,
"Content-Type": "application/json",
},
body,
});
Python
import hmac, hashlib, time, json, requests
app_id = "YOUR_APP_ID"
secret_key = "YOUR_SECRET_KEY"
timestamp = str(int(time.time()))
body = json.dumps({"src_zipcode": "10230", "dst_zipcode": "50200", "weight": 500})
sign_string = f"{app_id}{timestamp}{body}"
signature = hmac.new(
secret_key.encode(), sign_string.encode(), hashlib.sha256
).hexdigest()
resp = requests.post(
"https://api.sendjai.com/v2/couriers/check-price",
headers={
"X-App-Id": app_id,
"X-Timestamp": timestamp,
"X-Signature": signature,
"Content-Type": "application/json",
},
data=body,
)
print(resp.json())
PHP
$appId = "YOUR_APP_ID";
$secretKey = "YOUR_SECRET_KEY";
$timestamp = time();
$body = json_encode(["src_zipcode" => "10230", "dst_zipcode" => "50200", "weight" => 500]);
$signString = $appId . $timestamp . $body;
$signature = hash_hmac("sha256", $signString, $secretKey);
$ch = curl_init("https://api.sendjai.com/v2/couriers/check-price");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-App-Id: $appId",
"X-Timestamp: $timestamp",
"X-Signature: $signature",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
API Reference
เลือก endpoint จากเมนูด้านซ้าย
Create Shipment
สร้างพัสดุใหม่ ระบบจะเรียก API ขนส่งจริงและคืนเลข tracking
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
courier_name | string | ✅ | ชื่อขนส่ง เช่น "Flash Express" |
wefast_code | string | ✅ | รหัสขนส่ง เช่น "FlashExpressC" |
sender_name | string | ✅ | ชื่อผู้ส่ง |
sender_phone | string | ✅ | เบอร์โทรผู้ส่ง |
src_province | string | ✅ | จังหวัดต้นทาง (ภาษาไทย) |
src_city | string | ❌ | อำเภอ/เขต ต้นทาง |
src_district | string | ❌ | ตำบล/แขวง ต้นทาง |
src_postal | string | ✅ | รหัสไปรษณีย์ต้นทาง |
src_detail | string | ✅ | ที่อยู่ละเอียดต้นทาง |
receiver_name | string | ✅ | ชื่อผู้รับ |
receiver_phone | string | ✅ | เบอร์โทรผู้รับ |
dst_province | string | ✅ | จังหวัดปลายทาง (ภาษาไทย) |
dst_city | string | ❌ | อำเภอ/เขต ปลายทาง |
dst_district | string | ❌ | ตำบล/แขวง ปลายทาง |
dst_postal | string | ✅ | รหัสไปรษณีย์ปลายทาง |
dst_detail | string | ✅ | ที่อยู่ละเอียดปลายทาง |
weight | integer | ✅ | น้ำหนัก (กรัม) |
width | integer | ❌ | กว้าง (ซม.) default: 20 |
length | integer | ❌ | ยาว (ซม.) default: 30 |
height | integer | ❌ | สูง (ซม.) default: 15 |
cod_amount | integer | ❌ | ยอด COD (สตางค์) เช่น 50000 = ฿500, ส่ง 0 = ไม่เก็บเงิน |
remark | string | ❌ | หมายเหตุ |
Response
{
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"tracking_number": "TH01408JDBMR0B2",
"sort_code": "16B-16461-01",
"courier_name": "Flash Express",
"sender_name": "สมชาย",
"receiver_name": "บอส",
"status": "pending",
"cod_amount": 50000,
"shipping_cost": 35.00,
"weight": 500,
"created_at": "2026-04-03T12:00:00.000Z"
}
}
cod_amount เก็บเป็นสตางค์ (×100) เช่น ฿500 = 50000
List Shipments
ดึงรายการพัสดุทั้งหมดของคุณ
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
status | string | ❌ | กรอง: pending in_transit delivered cancelled |
page | integer | ❌ | หน้า (default: 1) |
limit | integer | ❌ | จำนวนต่อหน้า (default: 50, max: 100) |
Response
{
"data": [
{
"id": "uuid-xxx",
"tracking_number": "TH01408JDBMR0B2",
"courier_name": "Flash Express",
"receiver_name": "สมชาย",
"status": "in_transit",
"cod_amount": 50000,
"created_at": "2026-04-03T12:00:00Z"
}
],
"total": 150
}
Get Shipment Detail
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
tracking_number | string | ✅ | เลข tracking |
Cancel Shipment
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
tracking_number | string | ✅ | เลข tracking ที่ต้องการยกเลิก |
pending เท่านั้น ถ้าขนส่งรับพัสดุแล้วจะยกเลิกไม่ได้
Check Price
เปรียบเทียบราคาค่าส่งจากทุกขนส่งที่รองรับ
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
src_zipcode | string | ✅ | รหัสไปรษณีย์ต้นทาง |
dst_zipcode | string | ✅ | รหัสไปรษณีย์ปลายทาง |
weight | integer | ✅ | น้ำหนัก (กรัม) |
width | integer | ❌ | กว้าง (ซม.) |
length | integer | ❌ | ยาว (ซม.) |
height | integer | ❌ | สูง (ซม.) |
Response
{
"data": [
{
"courier": "Flash Express",
"code": "FlashExpressC",
"price": 35.00,
"est_days": "1-2 วัน",
"cod_available": true
},
{
"courier": "Kerry Express",
"code": "KerryExpress",
"price": 40.00,
"est_days": "2-3 วัน",
"cod_available": true
}
]
}
List Couriers
ดูรายชื่อขนส่งทั้งหมดที่เปิดใช้งาน
ไม่ต้องส่ง request body
Track Shipment
ติดตามสถานะพัสดุแบบ real-time
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
tracking_number | string | ✅ | เลข tracking |
Response
{
"data": {
"tracking_number": "TH01408JDBMR0B2",
"status": "in_transit",
"courier": "Flash Express",
"timeline": [
{ "status": "pending", "timestamp": "2026-04-03T12:00:00Z", "note": "สร้างออเดอร์" },
{ "status": "picked_up", "timestamp": "2026-04-03T14:00:00Z", "note": "รับพัสดุแล้ว" },
{ "status": "in_transit", "timestamp": "2026-04-03T18:00:00Z", "note": "กำลังขนส่ง — ศูนย์คัดแยก กรุงเทพ" }
]
}
}
Status Values
| Status | คำอธิบาย |
|---|---|
pending | รอรับพัสดุ |
picked_up | รับพัสดุแล้ว |
in_transit | กำลังขนส่ง |
out_for_delivery | กำลังนำส่ง |
delivered | จัดส่งสำเร็จ |
returned | ส่งกลับ |
cancelled | ยกเลิก |
Top Up via PromptPay QR
สร้าง PromptPay QR Code สำหรับเติมเครดิต ลูกค้าสแกนจ่ายผ่านแอปธนาคาร — เงินเข้าอัตโนมัติผ่าน Stripe
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
amount | number | ✅ | จำนวนเงิน (บาท) ขั้นต่ำ ฿1 |
Response
{
"code": "SUCCESS",
"data": {
"payment_intent_id": "pi_3abc123...",
"qr_image_url": "https://stripe.com/qr/xxx.png",
"qr_data": "00020101021...",
"amount": 500,
"currency": "THB",
"expires_at": "2026-04-03T12:03:00Z"
}
}
1. เรียก API → ได้
qr_image_url2. แสดง QR ให้ลูกค้าสแกน
3. Poll
/v2/topup/status ทุก 3 วินาทีเพื่อเช็คสถานะ4. เมื่อ status =
paid → เครดิตเข้าอัตโนมัติ
Top Up via Card
สร้าง Stripe Payment Intent สำหรับเติมเครดิตด้วยบัตรเครดิต/เดบิต
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
amount | number | ✅ | จำนวนเงิน (บาท) ขั้นต่ำ ฿100 |
Response
{
"code": "SUCCESS",
"data": {
"payment_intent_id": "pi_3abc123...",
"client_secret": "pi_3abc123_secret_xxx",
"amount": 500,
"fee": 27,
"charge_amount": 527,
"currency": "THB"
}
}
ตัวอย่าง: เติม ฿500 → fee ฿27 → charge ฿527
การ Confirm Payment ฝั่ง Frontend
// ใช้ Stripe.js confirm ด้วย client_secret
const stripe = Stripe("pk_live_xxx");
const { error } = await stripe.confirmCardPayment(client_secret, {
payment_method: {
card: cardElement,
billing_details: { name: "Customer Name" },
},
});
if (!error) {
// Payment succeeded — poll /v2/topup/status
}
Check Top Up Status
เช็คสถานะการเติมเงิน — ใช้ poll ทุก 3 วินาทีหลังสร้าง QR หรือ Payment Intent
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
payment_intent_id | string | ✅ | ID ที่ได้จาก topup/promptpay หรือ topup/card |
Response
{
"code": "SUCCESS",
"data": {
"payment_intent_id": "pi_3abc123...",
"status": "paid",
"amount": 500,
"currency": "THB",
"method": "promptpay"
}
}
Status Values
| Status | คำอธิบาย |
|---|---|
pending | รอชำระ — ยังไม่ได้สแกน QR หรือกรอกบัตร |
awaiting_payment | QR ถูกสร้างแล้ว รอสแกนจ่าย |
processing | กำลังดำเนินการ |
paid | ชำระสำเร็จ — เครดิตเข้าแล้ว |
cancelled | ยกเลิก/หมดอายุ |
Top Up History
ดูประวัติเติมเงินทั้งหมด
Request Parameters
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
limit | number | ❌ | จำนวนต่อหน้า (default: 20, max: 100) |
page | number | ❌ | หน้า (default: 1) |
Response
{
"code": "SUCCESS",
"data": [
{
"id": 123,
"type": "topup",
"amount": 500.00,
"balance_after": 1750.00,
"note": "เติมเครดิต ฿500 ผ่าน PromptPay",
"created_at": "2026-04-03T12:00:00Z"
}
],
"total": 25
}
Get Balance
เช็คยอดเครดิตคงเหลือ
ไม่ต้องส่ง request body
Response
{ "data": { "balance": 1250.50, "currency": "THB" } }
Error Codes
เมื่อเกิดข้อผิดพลาด API จะคืน JSON ดังนี้:
{
"error": "เครดิตไม่เพียงพอ — คงเหลือ ฿50.00 ต้องการ ฿35.00",
"code": "INSUFFICIENT_BALANCE",
"balance": 50.00
}
Error Code Reference
| Code | HTTP | คำอธิบาย |
|---|---|---|
MISSING_FIELDS | 400 | ส่งข้อมูลไม่ครบ — ดู field ที่ขาดใน error message |
INVALID_SIGNATURE | 401 | Signature ไม่ถูกต้อง — เช็ค sign string format |
TIMESTAMP_EXPIRED | 401 | Timestamp เกิน 5 นาทีจากเวลาจริง |
APP_NOT_FOUND | 401 | ไม่พบ App ID — เช็คว่าถูกต้อง |
INSUFFICIENT_BALANCE | 403 | เครดิตไม่เพียงพอ — เติมเงินก่อน |
ACCOUNT_SUSPENDED | 403 | บัญชีถูกระงับ — ติดต่อ support |
EMAIL_NOT_VERIFIED | 403 | ยังไม่ยืนยันอีเมล |
KYC_NOT_APPROVED | 403 | ยังไม่ยืนยันตัวตน (KYC) |
USER_NOT_FOUND | 404 | ไม่พบผู้ใช้ |
SHIPMENT_NOT_FOUND | 404 | ไม่พบพัสดุ |
RATE_LIMITED | 429 | เรียก API เร็วเกินไป — รอแล้วลองใหม่ |
COURIER_ERROR | 502 | ขนส่งตอบ error — ดู error message |
Rate Limits
| Endpoint Group | Limit | Window |
|---|---|---|
| ทุก endpoint | 100 requests | 1 นาที |
| Create Shipment | 30 requests | 1 นาที |
| Check Price | 60 requests | 1 นาที |
X-RateLimit-Reset สำหรับเวลาที่ reset
Changelog
v2.0 — 3 เมษายน 2026
- เปิด Open Platform
open.sendjai.com - API v2 endpoints พร้อมใช้งาน
- รองรับ HMAC-SHA256 authentication
- เพิ่ม Check Price, Tracking, Balance APIs