偵測人臉

偵測一張圖片裡的所有人臉,回傳每張臉的邊界框座標與粗略年齡分級。需要合法的 X-Api-Key,依 model 計費,扣款規則見〈積分與計費〉。

model 可填 YUYU_M2 或 YUYU_M5,兩者的請求/回應格式完全相同,差別只在後端產能配置:YUYU_M2 與換臉任務共用同一批產能,YUYU_M5 是獨立配置的產能,不受換臉任務排隊影響。沒有特別需求時任選一個即可,下方範例以 YUYU_M2 示範,把 model 換成 YUYU_M5 即可改用獨立產能,其餘欄位不變。

POST /api/tasks/detect-face
X-Api-Key: sk-live-xxxx
Content-Type: application/json
Idempotency-Key: 選填,見〈圖生影片〉的說明

完整範例

images 只接受恰好一張完整的 base64 data URI(png/jpeg/webp 三種 MIME 皆可),這裡為了範例簡短省略實際 base64 內容:

curl -X POST https://example.com/api/tasks/detect-face \
  -H "X-Api-Key: sk-live-xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "YUYU_M2",
    "images": ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."],
    "callback_url": "https://example.com/webhooks/yuyu-detect-face"
  }'

成功回 201 Created(任務剛建立時是待派工狀態,result 尚無內容,credits 是這次實際扣款的積分,下方範例的數字僅為示意,實際以平台設定為準,見〈積分與計費〉):

{
  "public_id": "01K1M2N3P4Q5R6S7T8V9W0XY14",
  "type": 3,
  "status": 0,
  "credits": 5,
  "params": {
    "model": "YUYU_M2",
    "images": ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."]
  },
  "result": null,
  "error_code": null,
  "error_message": null,
  "created_at": "2026-08-18T08:00:00.000000Z",
  "finished_at": null,
  "files_expire_at": null,
  "files_expired": false,
  "files": []
}

files_expire_at/files_expired/files 對這個任務類型沒有實際意義(結果不是檔案),永遠是 null/false/[],詳見〈任務查詢與取件〉。

任務完成後(status = 20),GET /api/tasks/{public_id} 的 result 會是:

{
  "result": {
    "face_coordinates": [
      { "index": 0, "bbox": [41, 49, 131, 146], "age": 4 },
      { "index": 1, "bbox": [328, 274, 415, 388], "age": 2 }
    ]
  }
}

沒有偵測到任何臉時,face_coordinates 會是空陣列 [](這是正常完成,不是失敗)。

參數表

欄位 型別 必填 規則
model string 是 YUYU_M2 或 YUYU_M5,二選一(差異見上方說明)
images string[] 是 恰好 1 張,元素為完整 base64 data URI(data:image/{png|jpeg|webp};base64,...)
callback_url string 否 必須是 https:// 開頭的網址,最長 2000 字;見〈回呼(Webhook)〉——這個任務類型的回呼內容比其他任務類型多帶一個欄位,見下方說明

一次只能偵測一張圖;要偵測多張圖,對每張圖各自呼叫一次這支端點即可(各自是獨立計費、獨立的 public_id)。

result.face_coordinates 欄位說明

欄位 說明
index 臉的索引,從 0 起算
bbox 臉部邊界框 [x1, y1, x2, y2],單位為像素,對應原始上傳圖片的座標系
age 年齡分級 ID(整數),對照表見下方

age 對照表

age 對應年齡區間
0 0–2 歲
1 3–9 歲
2 10–19 歲
3 20–29 歲
4 30–39 歲
5 40–49 歲
6 50–59 歲
7 60–69 歲
8 以上 70 歲以上

回呼(Webhook)內容的例外

〈回呼(Webhook)〉頁面說明的通知格式,對這個任務類型多帶一個 result 欄位——因為偵測結果只是一小段 JSON,直接帶在通知裡就能省去你再查詢一次的往返:

{
  "public_id": "01K1M2N3P4Q5R6S7T8V9W0XY14",
  "status": 20,
  "error_code": null,
  "payload": null,
  "result": {
    "face_coordinates": [
      { "index": 0, "bbox": [41, 49, 131, 146], "age": 4 }
    ]
  }
}

任務失敗時(status = 30),result 這個鍵仍會出現、但值為 null。其他任務類型(圖生影片等)的回呼不含 result,行為與〈回呼(Webhook)〉頁描述的一致,不受此例外影響。

回應

成功建立回 201 Created(冪等命中既有任務則回 200 OK),內容是〈任務查詢與取件〉描述的任務物件,type 為 3。

錯誤情境

狀態碼 情境 內容
422 參數驗證失敗(缺必填、images 不是恰好 1 張、data URI 格式不合法等) Laravel 標準 errors 欄位驗證錯誤格式
422 model 值查無對應模型 { "message": "Unknown model alias: {model}" }
402 積分(付費餘額或試用額度剩餘額度)不足以支付這次建單費用 { "message": "Insufficient credits to complete this charge." }
429 你名下這個任務類型(偵測人臉)的待處理任務數已達上限 { "message": "Too many pending tasks of this type; please retry later." },回應帶 Retry-After header

實際如何查詢進度、其他任務類型的計費規則,見〈任務查詢與取件〉與〈積分與計費〉。