API 文件

章節+

1. 快速入門

Regunow API 使用 HTTPS、Bearer 身分驗證及含版本的前綴 /api/v1。無須帳戶即可閱讀本文件。發出 API 請求需要有效的 Pro 存取權限,並同意現行政策。

  1. 登入 Regunow,在設定 → API 金鑰中建立金鑰。
  2. 請妥善保存金鑰的秘密值。它只會在建立金鑰時顯示一次。
  3. 設定主機和金鑰,然後透過後端或可信任的自動化程式傳送第一個問題。
cURL · 第一個問題
# Use your Regunow host and a key from Settings → API Keys.
export REGUNOW_BASE_URL="https://YOUR_REGUNOW_HOST"
export REGUNOW_API_KEY="YOUR_API_KEY"

curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/chat/completions" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: first-question-001" \
  -d '{
    "messages": [{
      "role": "user",
      "content": "Which EU product-safety obligations apply to a connected consumer device?"
    }],
    "mode": "jurisdiction",
    "jurisdiction": "eu"
  }'

回答位於 output.content。回應也包含來源引用與收取的點數。此請求會消耗點數。每個新問題都應使用新的冪等鍵。

JavaScript 範例(Node.js)
JavaScript · 伺服器端請求
// Node.js: set REGUNOW_BASE_URL and REGUNOW_API_KEY in your environment.
// Generate one key per operation; keep it unchanged when retrying that operation.
import { randomUUID } from "node:crypto";

const idempotencyKey = randomUUID();
const response = await fetch(
  process.env.REGUNOW_BASE_URL + "/api/v1/chat/completions",
  {
    method: "POST",
    headers: {
      Authorization: "Bearer " + process.env.REGUNOW_API_KEY,
      "Content-Type": "application/json",
      "Idempotency-Key": idempotencyKey,
    },
    body: JSON.stringify({
      messages: [{ role: "user", content: "Summarize EU product-safety obligations." }],
      mode: "jurisdiction",
      jurisdiction: "eu",
    }),
  },
);

const result = await response.json();
if (!response.ok) {
  throw new Error(result.error.code + ": " + result.error.message);
}
console.log(result.output.content);

2. 身分驗證

每次請求都應在 HTTP Authorization 標頭中傳送 API 金鑰。URL、Cookie 或請求主體中的金鑰不會被接受。

HTTP · 身分驗證標頭
Authorization: Bearer rgn_live_...

請將金鑰儲存在環境變數或秘密管理服務中,不要放入瀏覽器程式碼、行動應用程式套件、公開程式碼儲存庫或日誌。未啟用瀏覽器跨來源存取,請透過自己的伺服器發出請求。

已停用、刪除或過期的金鑰會立即無法驗證。Regunow 只儲存秘密值的雜湊,因此無法再次顯示既有金鑰的秘密值。需要時請建立替代金鑰。

每次請求都會檢查 Pro 權限與政策同意狀態。收到 legal_acceptance_required 時,金鑰擁有者必須登入並開啟法律條款確認。API 金鑰不能代為同意政策。

3. 模型與選項

GET/api/v1/models

查詢支援的模型、強度等級、管轄區、回答語言與功能。此端點需要驗證,但不單獨收取點數,適合在生成回答前驗證金鑰。

cURL · 模型目錄
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/models" \
  -H "Authorization: Bearer $REGUNOW_API_KEY"
模型目錄欄位
欄位內容
models模型 ID、名稱、預設強度與支援的強度值。
default預設模型與強度選項。
jurisdictions支援的管轄區識別碼及名稱。
languages支援的回答語言代碼及名稱。
capabilities串流輸出和檔案支援情況,以及檔案數量與大小限制。

請使用目前部署的目錄傳回值。在管轄區模式下,省略 model 和 effort 即可使用允許的預設值。若指定,則必須為預設的 Sonnet 4.6 / 高。不含附件時,擷取服務管理回答模型;回應中的模型欄位描述已驗證的選擇。

4. 聊天回答生成

POST/api/v1/chat/completions

傳送包含 messages 陣列的 JSON 主體。預設情況下,API 會傳回完整的 JSON 回答。將 stream 設為 true 即可逐步接收文字。

聊天請求欄位
欄位預設說明
messages必填1–20 則交替的 user 和 assistant 訊息,以 user 結尾。每則均包含 role 和字串 content。
modefreestylefreestyle 用於彈性的法規研究,jurisdiction 用於受支援的管轄區研究。
jurisdictionnull管轄區模式下必填。使用目錄中的識別碼。在自由模式中必須省略或設為 null。
model目錄預設值受支援的模型 ID。管轄區模式要求使用預設的 Sonnet 選擇。
effort模型預設值該模型支援的強度值。管轄區模式要求高。
web_searchauto / off自由模式支援 auto、on 或 off,預設為 auto。管轄區模式只接受 off。
response_languageen目錄中的回答語言代碼。文件語言不限制回答語言。
streamfalse設為 true 以使用伺服器傳送事件(SSE)。
file_ids無最多五個不重複的可用檔案 UUID,檔案必須屬於金鑰擁有者的帳戶。
JSON · 含附件的自由模式
{
  "messages": [{
    "role": "user",
    "content": "What retention period does this policy specify? Cite the document."
  }],
  "mode": "freestyle",
  "web_search": "off",
  "response_language": "en",
  "file_ids": ["YOUR_FILE_ID"]
}

將 YOUR_FILE_ID 替換為上傳成功後傳回的 UUID。後續提問應傳送相關的使用者與助理訊息歷史,並重新傳送所需的 file_ids。API 不會自動記住對話歷史或附件。

系統訊息與未知欄位會被拒絕。此 API 不提供圖片生成、報告生成、音訊輸入或已儲存記憶的存取。上傳的圖片可作為提問輸入。

5. 回答與引用

回答生成成功後會傳回 object: "regunow.chat.completion"、回答、來源中繼資料、用量與耗時。以下值僅供示範。

JSON · 聊天回答
{
  "id": "request-uuid",
  "request_id": "request-uuid",
  "object": "regunow.chat.completion",
  "created": 1790812800,
  "model": "jp.anthropic.claude-sonnet-4-6",
  "latency": {
    "time_to_first_token_ms": 2345,
    "time_to_answer_completion_ms": 9876
  },
  "output": {
    "input_files": [],
    "role": "assistant",
    "content": "The complete answer...",
    "finish_reason": "end_turn",
    "citations": [],
    "sources": [],
    "web_search": false
  },
  "usage": {
    "input_tokens": 1234,
    "output_tokens": 456,
    "charged_microcredits": 789000,
    "charged_credits": 0.789
  }
}
  • output.content 包含最終回答文字。引用偏移量以此最終字串為準;sourceIndexes 識別 output.sources 中的項目。
  • 來源包含標題、檔名、MIME 類型、URI 及擷取的摘錄。請在回答旁顯示摘錄與引用。
  • 來源 URI 是位置識別,可能指向私有儲存空間。只有發布者的公開 URL 才應作為使用者可開啟的連結。API 不提供法規來源檔案的下載或翻譯。
  • 使用附件時,output.input_files 識別提供的檔案。附件來源具有 file_id;法規與網頁來源具有 file_id: null。附件 URI 為 null。
  • 存在輸入檔案並不代表它支持每項陳述。模型可能省略文內引用,圖片或掃描檔的摘錄也可能為空。

擷取服務未提供權杖數量時,其值可能為 null,表示未知而非零。charged_credits 是記錄的客戶費用。created 是以秒為單位的 Unix 時間戳記,延遲值以毫秒為單位。

每個端點回應均含 X-Request-Id 標頭。請保留此識別碼以便排查問題。聊天回答和錯誤 JSON 也包含 request_id。

6. 串流輸出

設定 "stream": true。回應使用 text/event-stream。使用 cURL 時加入 -N 可停用輸出緩衝。

cURL · 串流回答
curl --fail-with-body -N \
  "$REGUNOW_BASE_URL/api/v1/chat/completions" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: streaming-question-001" \
  -d '{
    "messages": [{"role":"user","content":"Summarize EU product-safety obligations."}],
    "mode": "jurisdiction",
    "jurisdiction": "eu",
    "stream": true
  }'

讀取以空行分隔的完整 SSE 事件。一個網路資料區塊可能包含部分事件或多個事件。收到 choices[0].delta.content 時將其附加。忽略以 : 開頭的連線維持註解。

SSE · 事件序列(簡略)
data: {"choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"choices":[{"index":0,"delta":{"content":"The answer begins..."},"finish_reason":null}]}

data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"choices":[],"usage":{"prompt_tokens":1234,"completion_tokens":456,"total_tokens":1690},"regunow":{"output":{},"latency":{},"usage":{"charged_credits":0.789,"charged_microcredits":789000}}}

data: [DONE]

最後的中繼資料事件含有空的 choices 陣列。最終回答、引用與來源位於 regunow.output,耗時位於 regunow.latency,點數位於 regunow.usage。權杖數量使用 usage.prompt_tokens 和 usage.completion_tokens。

擷取與引用處理可能造成暫停。在最終中繼資料抵達前,應將文字視為暫定內容。串流開始後的錯誤會以 error 物件及隨後的 [DONE] 傳回;僅有 HTTP 200 並不能確認成功。此前的驗證或檢查失敗會傳回一般 JSON 錯誤回應。

已完成作業的重播仍使用 SSE,並以單一文字區塊傳回已儲存的回答,同時包含 X-Idempotent-Replayed: true。

7. 檔案

上傳文件或圖片,再將其 ID 附加到聊天請求中。檔案共用金鑰擁有者的檔案庫與儲存配額。文件最大為 10 MiB,圖片最大為 5 MiB。

支援的檔案格式
類別格式
文件PDF, TXT, CSV, TSV, Markdown, DOC, DOCX, ODT, RTF, XLSX, ODS, PPTX, ODP
圖片JPEG, PNG, WebP, GIF

直接上傳(建議)

此三步驟流程將原始檔案位元組直接傳送到儲存空間,避開應用程式請求主體限制。建議託管整合使用,尤其適用於較大的檔案。

POST/api/v1/files/upload-intents

只傳送 name、mime_type 和 bytes(確切的檔案大小)。成功後傳回 HTTP 201、待處理檔案 ID,以及有效期為 300 秒的簽署上傳 URL。

cURL · 準備上傳
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files/upload-intents" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: policy-intent-001" \
  -d '{"name":"policy.txt","mime_type":"text/plain","bytes":16384}'
JSON · 上傳準備回應(部分欄位)
{
  "id": "YOUR_FILE_ID",
  "status": "pending",
  "upload_method": "PUT",
  "upload_url": "SIGNED_UPLOAD_URL",
  "upload_headers": {"Content-Type": "text/plain"},
  "expires_in": 300
}

將 FILE_ID 設為傳回的 id。使用傳回的 upload_method、upload_url 和 upload_headers 上傳完全一致的原始位元組。請設定確切的 Content-Length。不要向上傳 URL 傳送 Regunow API 金鑰,也不要將簽署 URL 寫入日誌。

cURL · 傳送檔案位元組
# Set UPLOAD_URL from the intent response. Use its returned upload_headers.
# This example assumes policy.txt is exactly 16,384 bytes.
curl --fail-with-body -X PUT "$UPLOAD_URL" \
  -H "Content-Type: text/plain" \
  -H "Content-Length: 16384" \
  --data-binary @./policy.txt

POST/api/v1/files/{fileId}/complete

使用不同的冪等鍵傳送 {}。完成作業會驗證位元組,並傳回 HTTP 200 和可用檔案。只有完成成功後,才能在 file_ids 中使用其 ID。

cURL · 完成上傳
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files/$FILE_ID/complete" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: policy-complete-001" \
  -d '{}'

上傳 URL 過期後,刪除未使用的待處理檔案,並用新鍵準備另一次上傳。重播準備請求不會延長 URL 有效期。如果完成結果不確定,請先查詢檔案狀態。如果仍待處理,請用新的冪等鍵重試完成;舊鍵會傳回已儲存的結果。對已可用檔案執行完成作業會傳回其中繼資料。

多部分上傳

POST/api/v1/files

較小的檔案可透過一個名為 file 的 multipart/form-data 欄位傳送。請傳送原始位元組,而非 base64 或遠端 URL。託管閘道的主體上限可能低於 API 的檔案大小限制。

cURL · 多部分上傳
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Idempotency-Key: policy-upload-001" \
  -F "file=@./policy.pdf;type=application/pdf"

上傳成功後傳回 HTTP 201 和可用檔案,無須另外呼叫完成作業。

JSON · 可用檔案(範例)
{
  "id": "YOUR_FILE_ID",
  "object": "regunow.file",
  "name": "policy.pdf",
  "mime_type": "application/pdf",
  "category": "file",
  "bytes": 16384,
  "status": "available",
  "created_at": "2026-10-01T00:00:00Z",
  "request_id": "request-uuid",
  "usage": {"charged_microcredits":500,"charged_credits":0.0005}
}

列出、查詢及刪除檔案

檔案管理端點
方法端點行為
GET/api/v1/files列出可用檔案。limit 預設為 20,接受 1–100。結果包含 data、has_more 和 next_after。下一頁請將 next_after 作為 after 傳入。
GET/api/v1/files/{fileId}查詢檔案中繼資料及狀態(待處理、可用或失敗)。
DELETE/api/v1/files/{fileId}永久刪除檔案庫中的檔案及分析與預覽產物。傳回 object: "regunow.file.deleted" 和 deleted: true。
cURL · 列出可用檔案
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files?limit=20" \
  -H "Authorization: Bearer $REGUNOW_API_KEY"

同一帳戶的金鑰可存取該帳戶檔案庫中的可用檔案。不存在的檔案與其他帳戶的檔案都會傳回 404。如果應用程式透過一個帳戶服務多位使用者,請在附加或刪除檔案前實施自己的使用者權限檢查。

待處理與失敗的上傳會占用配額,直到清理成功。超過 24 小時的未完成上傳可被清理。可用檔案已通過上傳驗證,但擷取在提問時才進行,因此損毀、加密或無法讀取的文件仍可能在分析時失敗。

8. 點數與限制

回答生成、上傳及刪除均記錄計量用量。模型目錄與檔案中繼資料讀取不單獨收取點數。文件擷取和圖片分析透過聊天請求計費。

使用 usage.charged_credits 查看作業費用。1 點數等於 1,000,000 微點數。金鑰點數上限與帳戶點數相互獨立,任一不足都可能阻止請求。請在設定 → API 金鑰中查看用量並設定上限。

API 限制
限制額度
API 金鑰每個帳戶 25 個
同時回答生成與檔案修改每個金鑰 10 個
回答生成 JSON 主體192 KiB
每次回答生成的訊息數1–20
訊息文字每則訊息 32,000 字元,合計 64,000 字元
每次回答生成的附件數5 個不同檔案
文件大小每個檔案 10 MiB
圖片大小每個檔案 5 MiB
檔案庫儲存空間與帳戶檔案庫共用 5 GiB
冪等鍵1–120 個可列印 ASCII 字元,不含空格
重播期限結算後 24 小時

即使每則訊息與附件符合 API 限制,模型的上下文與視覺限制仍然適用。金鑰預算依每日、每週或每月的滾動週期重設,從金鑰建立或前一週期更新時開始計算。

有可用預算時開始的請求可能略微超出金鑰的小額剩餘預算,因為最終費用在生成後才確定。達到上限後,新的回答生成與檔案修改會被阻止。預留機制避免同時請求重複使用同一份可用金鑰預算。

9. 安全重試

每次回答生成、上傳、上傳完成與刪除都應傳送 Idempotency-Key。它是選用項目,但強烈建議使用,以避免連線失敗後重複處理及收費。

HTTP · 冪等標頭
Idempotency-Key: a-unique-key-for-this-operation
  • 為每個新作業產生唯一鍵,並與原始請求一同儲存。
  • 使用相同的 API 金鑰、冪等鍵與不變的輸入重試。結算後 24 小時內,可重播已儲存的狀態與回應,無須再次呼叫供應商,也不再收費。
  • 重播會包含 X-Idempotent-Replayed: true。以不同輸入重用鍵,或首次請求仍在處理時重用鍵,都會傳回 409。
  • 快取結果可能包含錯誤。同一鍵可能傳回相同失敗,而不會重新執行。開始新作業前請先檢查結果。
  • 重播期限到期後,重用鍵會開始新請求,並可能再次收費。

暫時網路故障、速率限制或服務故障應使用指數退避。處理結果不確定的請求時保留相同冪等鍵。無效輸入、過期憑證或點數不足,應先修正原因再重試。

刪除檔案不會清除重播期限內已快取的回答生成或上傳回應。刪除後重播上傳會傳回原始回應,但不會重新建立檔案。

10. 錯誤

錯誤使用固定的 JSON 結構。處理時請查看 error.code,聯絡支援時保留 request_id 或 X-Request-Id 標頭。

JSON · 錯誤回應(範例)
{
  "error": {
    "type": "request_error",
    "code": "invalid_request",
    "message": "messages must contain 1 to 20 alternating user/assistant messages, end with a user message, and stay within 64,000 characters."
  },
  "request_id": "request-uuid"
}
HTTP 錯誤與處理
狀態常見代碼處理方法
400invalid_request檢查 JSON、允許的欄位、訊息、模型選項及檔案 ID。
401invalid_api_key檢查 Bearer 標頭,並替換過期、停用或已刪除的金鑰。
402account_quota_exceeded, api_key_limit_exceeded檢查帳戶點數與金鑰點數上限。
403pro_required, legal_acceptance_required恢復 Pro 權限,或讓擁有者在 Regunow 中同意現行政策。
404file_not_found使用屬於金鑰擁有者帳戶的檔案。
409idempotency_conflict, request_in_progress輸入變更時使用新鍵。若請求仍在處理中,請等待後重試原作業。
413request_too_large減小訊息或檔案大小。若閘道主體上限是原因,請使用直接上傳。
415unsupported_media_type使用端點要求的 Content-Type 與未壓縮的請求主體。
429concurrency_limit_exceeded, upstream_rate_limited降低同時執行數,並使用指數退避重試。
502–504upstream_unavailable, upstream_timeout, service_unavailable, usage_settlement_failed暫時故障請逐步延長等待時間,並使用相同冪等鍵重試。已儲存的失敗可能會被重播。