Labspace SMS

簡訊 API 串接教學

5 分鐘發出第一則測試簡訊:cURL 範例、回應解讀與錯誤處理

發布 2026/10/27閱讀約 8 分鐘

一句話:建立 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. 常見錯誤碼與處理

codeHTTP怎麼處理
INSUFFICIENT_BALANCE422點數不足,先儲值。可用試算 API 的 points_required 事先檢查。
REALNAME_TAG_VIOLATION422簡訊開頭的【品牌】與登記公司名稱不符,也還沒通過審核。data.application 是申請狀態(null=沒申請過、pending=審核中),data.suggested_tag 是可直接使用的公司名稱。改用它或不加【】,或到會員中心「實名 tag」申請。
DOMAIN_NOT_WHITELISTED422內容含尚未申請白名單的網域,先申請網域白名單。
FORBIDDEN_DOMAIN422內容含免費短網址(如 bit.ly),依規範一律禁止,改用品牌網域。
API_KEY_IP_NOT_ALLOWED403金鑰設了 IP 白名單,這次來源 IP 不在清單內。到「API Key」頁把伺服器 IP 加入。
RATE_LIMITED429超過每個來源 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. 上線前檢查清單

  1. API Key 只放在伺服器端(環境變數或密鑰管理),不要寫進前端或 App
  2. 替 API Key 設 IP 白名單,只允許自家伺服器呼叫
  3. 同內容發多個門號:一次請求、dstaddr 逗號分隔(建議每次 200 個以內、逾時 90 秒以上)
  4. 只重送 data.results[] 中 status=failed 的門號,success 與 skipped 不要重送
  5. 收到 429 依 Retry-After 等待,不要立刻整批重試
  6. 簡訊開頭【品牌】使用登記公司名稱;含網址先申請網域白名單
  7. 先用試算 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 天內)即為排程發送;排程只預留點數,取消後全額退回。