簡訊 API 串接教學
5 分鐘發出第一則測試簡訊:cURL 範例、回應解讀與錯誤處理
一句話:建立 API Key → 呼叫 POST /api/v2/send → 讀 result 與每個門號的狀態。單筆、多號碼、排程都是同一支 API;內容每人不同才需要批次 API。以下用 cURL 示範,任何語言(PHP、Node.js、Python、Java…)照同樣的 HTTP 請求即可。
1. 準備:開通帳號、建立 API Key
- 註冊帳號並完成開通(審核通過後以 Email 通知)。
- 登入會員中心,到「API Key」頁建立金鑰,格式為
sk_live_…。金鑰只會完整顯示一次,請立刻存進伺服器的環境變數或密鑰管理工具。 - 建議同時設定 IP 白名單,只允許自家伺服器的 IP 使用這把金鑰。
2. 發出第一則測試簡訊
把簡訊發到自己的手機,是最直接的「簡訊測試」:
curl -X POST https://sms-api.labspace.com.tw/api/v2/send \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"dstaddr": "0912345678",
"smbody": "【貴公司名稱】這是一則 API 測試簡訊"
}'dstaddr:手機號碼。台灣可用 09 開頭;海外要帶國碼(例如 8613…)。多個門號以逗號分隔。smbody:簡訊內容。開頭的【品牌】需與登記公司名稱相符,不加【】則不受此限。
只想看則數與扣點、不要真的發?把網址換成 /api/v2/send/estimate,回應會有 parts(則數)、points_required(需要點數)、points_available(目前可用點數)。
3. 讀懂回應
成功受理時 result 為 1。帶多個門號時,data.results[] 會逐一列出每個門號的狀態:
{
"result": 1,
"text": "群發完成:成功 2,失敗 0",
"data": {
"total": 2,
"sent": 2,
"failed": 0,
"points_remaining": 98,
"results": [
{ "phone": "0912345678", "status": "success" },
{ "phone": "0922345678", "status": "success" }
]
}
}success:已送出。failed:送出失敗,可以重送。skipped:略過(例如在拒收名單內,或短時間內同內容已發過),不扣點,不要重送。- 失敗時
result為 0,看code判斷原因(見下一節),不要只讀錯誤文字。 - 「已送出」不等於「已送達手機」。關鍵訊息請用發送記錄 API(
GET /api/v2/logs/{id})或 Webhook(send.success/send.failed)追蹤每則的結果。
4. 常見錯誤碼與處理
| code | HTTP | 怎麼處理 |
|---|---|---|
| INSUFFICIENT_BALANCE | 422 | 點數不足,先儲值。可用試算 API 的 points_required 事先檢查。 |
| REALNAME_TAG_VIOLATION | 422 | 簡訊開頭的【品牌】與登記公司名稱不符,也還沒通過審核。data.application 是申請狀態(null=沒申請過、pending=審核中),data.suggested_tag 是可直接使用的公司名稱。改用它或不加【】,或到會員中心「實名 tag」申請。 |
| DOMAIN_NOT_WHITELISTED | 422 | 內容含尚未申請白名單的網域,先申請網域白名單。 |
| FORBIDDEN_DOMAIN | 422 | 內容含免費短網址(如 bit.ly),依規範一律禁止,改用品牌網域。 |
| API_KEY_IP_NOT_ALLOWED | 403 | 金鑰設了 IP 白名單,這次來源 IP 不在清單內。到「API Key」頁把伺服器 IP 加入。 |
| RATE_LIMITED | 429 | 超過每個來源 IP 每分鐘 60 次請求。依 retry_after 秒數等待;同內容多個門號改用一次請求送出。 |
這些業務錯誤發生時簡訊不會送出、也不會扣點。
5. 大量發送:一次請求、別一個門號打一次
最常見的串接錯誤是「名單有 2,000 人,就呼叫 2,000 次 API」。每個來源 IP 每分鐘上限 60 次請求,這樣寫一定會撞到 429;如果撞到後又把整批重送,已經送成功的人會收到好幾則。正確做法:
- 內容相同:一次請求、
dstaddr以逗號分隔多個門號(建議每次 200 個以內、逾時設 90 秒以上),多個門號只算 1 次請求。 - 內容不同(例如帶姓名):用
/api/v2/send/bulk-upload上傳名單,再呼叫/api/v2/send/bulk。 - 只重送失敗的:看
data.results[],只把failed的門號重送。 - 防重送保護:透過 API Key 串接時,同門號+同內容預設 10 分鐘內只發一次,重複的回
data.duplicate=true、不扣點。這是保險,不是重試策略。
6. 上線前檢查清單
- API Key 只放在伺服器端(環境變數或密鑰管理),不要寫進前端或 App
- 替 API Key 設 IP 白名單,只允許自家伺服器呼叫
- 同內容發多個門號:一次請求、dstaddr 逗號分隔(建議每次 200 個以內、逾時 90 秒以上)
- 只重送 data.results[] 中 status=failed 的門號,success 與 skipped 不要重送
- 收到 429 依 Retry-After 等待,不要立刻整批重試
- 簡訊開頭【品牌】使用登記公司名稱;含網址先申請網域白名單
- 先用試算 API 檢查則數與點數,避免文案超過一則
完整端點(發送記錄、排程、通訊錄、範本、儲值)見 API 文件,可直接在頁面上測試或下載 Postman Collection。要做手機驗證碼,另見簡訊驗證碼(OTP)怎麼發;費用與則數規則見簡訊費用怎麼算。
7. 常見問題
簡訊 API 要怎麼測試?
註冊並開通帳號後,在會員中心建立 API Key,用 cURL 或 Postman 呼叫 /api/v2/send,把簡訊發到自己的手機即可。想先確認則數與扣點而不實際發送,可以呼叫 /api/v2/send/estimate 試算。API 文件頁另有線上測試區與 Postman Collection 可下載。
簡訊 API 有呼叫次數限制嗎?
每個來源 IP 每分鐘上限 60 次請求,超過回 HTTP 429(code=RATE_LIMITED,附 retry_after 秒數)。同一內容發多個門號時,用一次請求、dstaddr 以逗號分隔即可,多個門號只算 1 次請求。
同一則簡訊不小心重送,會發兩次嗎?
透過 API Key 串接時,同一門號+同一內容在預設 10 分鐘內只會發一次;重複的請求仍回 result=1,但 data.duplicate=true、不發送、不扣點。先前發送失敗的可以直接重送,不受此限。
內容每個人都不一樣(例如帶姓名)要怎麼發?
用批次發送:先呼叫 /api/v2/send/bulk-upload 上傳 CSV 或 XLSX(每列一個門號與變數),再呼叫 /api/v2/send/bulk 送出。內容相同的大量發送則直接用 /api/v2/send 帶多個門號。
可以預約時間發送嗎?
可以。在 /api/v2/send 或 /api/v2/send/bulk 帶 scheduled_at(格式 YYYY-MM-DD HH:MM:SS、台灣時區、5 分鐘後至 30 天內)即為排程發送;排程只預留點數,取消後全額退回。