API 參考
API 總覽
Base URL、身分驗證、錯誤格式以及完整錯誤碼參考
Base URL
https://openapi.thunderbit.com/openapi/v1身分驗證
所有端點使用 HTTP Bearer(API Key):
Authorization: Bearer YOUR_API_KEY請從 Thunderbit 主控台 取得你的 Key。Key 可撤銷、依環境區分 —— 切勿將正式 Key 嵌入用戶端程式碼。
錯誤回應結構
所有錯誤回應共用同一種 envelope。預設採用 LEGACY 格式:
{
"success": false,
"error": {
"code": "INVALID_URL",
"status": 400,
"message": "The provided URL is not valid",
"details": null
}
}Note: 先前文件曾介紹
GOOGLE_RPC備選 envelope,code與status型別互換(string ↔ number)。該模式 已棄用,不推薦使用 —— 強型別客戶端(OpenAPI codegen、Pydantic、serde、encoding/json)會直接反序列化失敗。請使用上面的 LEGACY 格式;未來code: string、status: number型別保持穩定。
details 欄位可能攜帶結構化內容 —— 例如 INVALID_PARAMETER 錯誤時會回傳欄位級驗證錯誤,格式為 { field: message }。
標準錯誤碼
| HTTP | Code | 意義 |
|---|---|---|
| 400 | INVALID_URL | URL 格式無效 |
| 400 | INVALID_SCHEMA | JSON Schema 無效 |
| 400 | INVALID_PARAMETER | 一或多個請求參數驗證失敗 |
| 400 | SCHEMA_OR_PROMPT_REQUIRED | 擷取時必須提供 schema(或 prompt) |
| 400 | SCHEMA_AND_PROMPT_EXCLUSIVE | schema 與 prompt 不可同時提供 |
| 400 | BATCH_SIZE_EXCEEDED | 批次請求超過 100 個 URL 上限 |
| 400 | MALFORMED_REQUEST_BODY | 請求主體不是合法 JSON |
| 401 | API_KEY_MISSING | 缺少 Authorization 標頭 |
| 401 | API_KEY_INVALID_FORMAT | API Key 格式無效 |
| 401 | API_KEY_NOT_FOUND | 系統中找不到該 API Key |
| 401 | API_KEY_REVOKED | API Key 已撤銷 |
| 401 | API_KEY_DISABLED | API Key 已停用 |
| 401 | API_KEY_EXPIRED | API Key 已過期 |
| 401 | INVALID_API_KEY | (已淘汰,請改用上述具體 API_KEY_* 錯誤碼) |
| 402 | INSUFFICIENT_CREDITS | 帳戶額度不足 |
| 404 | JOB_NOT_FOUND | 找不到批次任務 |
| 404 | RESOURCE_NOT_FOUND | 找不到資源 |
| 408 | REQUEST_TIMEOUT | API 請求逾時 |
| 408 | SCRAPE_TIMEOUT | 目標頁面回應逾時 |
| 422 | SCRAPE_SSL_ERROR | 目標站點有 SSL/TLS 問題 |
| 422 | SCRAPE_DNS_RESOLUTION_ERROR | 無法解析目標主機名 |
| 422 | SCRAPE_SITE_ERROR | 目標站點回傳錯誤 |
| 422 | SCRAPE_EMPTY_CONTENT | 目標頁面回傳空內容 |
| 422 | SCRAPE_CONTENT_TOO_LARGE | 目標頁面超過大小限制 |
| 422 | SCRAPE_TARGET_FORBIDDEN | 目標站點拒絕存取(403) |
| 422 | SCRAPE_TARGET_NOT_FOUND | 目標 URL 回傳 404 |
| 422 | SCRAPE_UNSUPPORTED_FILE | 不支援的目標檔案型別 |
| 429 | RATE_LIMIT_EXCEEDED | 觸發帳戶速率限制 |
| 429 | SCRAPE_TARGET_RATE_LIMITED | 目標站點對我們的請求進行限流 |
| 500 | INTERNAL_ERROR | 通用內部錯誤 |
| 500 | DISTILL_FAILED | 蒸餾流水線失敗 |
| 500 | EXTRACT_FAILED | 擷取流水線失敗 |
| 500 | PIPELINE_ERROR | 流水線某一步發生錯誤 |
| 500 | AI_EXTRACTION_FAILED | AI 擷取步驟失敗 |
| 500 | MARKDOWN_CONVERSION_FAILED | HTML 轉 Markdown 失敗 |
| 502 | SCRAPE_ALL_PROVIDERS_FAILED | 所有抓取 provider 全部失敗 |
| 502 | UPSTREAM_BAD_GATEWAY | 上游回傳了無效回應 |
| 503 | SCRAPE_PROVIDER_UNAVAILABLE | 抓取 provider 無法使用 |
| 503 | AI_SERVICE_UNAVAILABLE | AI 服務無法使用 |
| 503 | DOWNSTREAM_SERVICE_UNAVAILABLE | 下游服務暫時無法使用 |
| 504 | UPSTREAM_TIMEOUT | 上游閘道逾時 |
| 504 | AI_TIMEOUT | AI 服務呼叫逾時 |
重試策略參考
| 錯誤類別 | 是否重試? | 如何處理 |
|---|---|---|
4xx(輸入錯誤) | ❌ 否 | 修正請求後重試 |
401(驗證) | ❌ 否 | 重新產生 / 替換 API Key |
402(額度) | ❌ 否 | 加值 |
408 / 504(逾時) | ✅ 是 | 指數退避,最多 3 次 |
429(限流) | ✅ 是 | 等到 X-RateLimit-Reset —— 參見 速率限制 |
5xx(伺服器) | ✅ 是 | 指數退避,最多 3 次 |
SCRAPE_TARGET_*(目標站點) | ⚠️ 視情況 | 升級 renderMode 後重試一次 |