開放原始碼 · 事實查核 API MVP

把事實查核,
接進你的應用。

送入一段待查核文字,取得相關查核、證據綜整與結構化 JSON 結果。也能附上來源網址,補充查核背景。

付費查核與免費入口

POST/api/fact-check

x402 付費 API:verify 通過後轉送 fact-check-core,成功回應才 settle(正式預設每次 0.05 USDC)。

GET/api/fact-check

同樣需要付款;query string 會轉成 core 的 POST JSON。

POST/api/demo

首頁使用的免費入口,保留 Origin guard、CORS 與 IP 限流(每 IP 60 秒一次)。

直接試用

查核一段文字

輸入你想確認的具體主張,也可以附上背景網址。結果會保留證據、原始分數與不確定性。

0 / 10,000 字 · 請盡量包含對象、時間與適用範圍。

公開 HTTP/HTTPS 網頁。不填網址也可以查核。

01 / 開始呼叫

第一個查核請求

`/api/fact-check` 是 x402 付費 API,正式預設每次查核收取 0.05 USDC。第一次呼叫會回 402;請用支援 x402 的錢包依 PAYMENT-REQUIRED 產生付款簽章, 再以 PAYMENT-SIGNATURE(或舊版 X-PAYMENT)重試相同請求。 首頁互動表單則使用下方的免費 /api/demo,不需要錢包。

POST JSON 請求JavaScript
// 第一次請求會回 402;用錢包依 PAYMENT-REQUIRED 產生簽章
const paymentSignature = await wallet.createPaymentSignature(/* PAYMENT-REQUIRED */);
const response = await fetch("/api/fact-check", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "PAYMENT-SIGNATURE": paymentSignature
  },
  body: JSON.stringify({
    text: "非學校型態學生,國中小以下目前沒有普遍補助"
  })
});
const result = await response.json();
console.log(result);

正式部署設定使用 Base mainnet(eip155:8453)、CDP facilitator 與 0.05 USDC;本機範例預設改用 Base Sepolia(eip155:84532)公開 facilitator。 付款簽章由錢包或 x402 client 產生,請勿在瀏覽器程式碼中放入 facilitator secret。

付費端點允許寬鬆跨來源 CORS,預檢允許 PAYMENT-SIGNATURE 與 X-PAYMENT。免費 /api/demo 仍只接受本站與既有允許清單來源, 並保留 Origin guard、CORS 與 IP 限流;預設每個 IP 每 60 秒一次,可由 RATE_LIMIT_WINDOW_MS 調整。

使用 GET 呼叫

使用 --data-urlencode 編碼中文、空白及特殊字元。

curl --get 'https://check.vtaiwan.tw/api/fact-check' \
  --data-urlencode 'text=非學校型態學生,國中小以下目前沒有普遍補助'
附上 URL,補充查核背景

GET 與 POST 都接受選填的 url。以下示範 GET;POST 則在 JSON 加入相同欄位。

curl --get 'https://check.vtaiwan.tw/api/fact-check' \
  --data-urlencode 'text=非學校型態學生,國中小以下目前沒有普遍補助' \
  --data-urlencode 'url=https://law.moj.gov.tw/LawClass/LawAll.aspx?pcode=A0000001'

02 / 輸入參數

一段文字,一個選填網址

欄位必填格式與限制
text是string,去除首尾空白後不可為空,最多 10,000 字(Unicode code point)。
url否 公開 HTTP/HTTPS 網址,最多 2,048 個 UTF-16 code unit;不可包含帳號密碼或指向內網。

POST 使用 Content-Type: application/json,請求本文上限為 128,000 bytes。沒有網址時請省略 url,不要傳空字串或 null。

付款 verify 通過後才轉送 fact-check-core;成功回應才會 settle。

本 Worker 只負責輸入基本格式與公開網址驗證,不執行查核模型。GET 的 query string 會轉成 core 所需的 POST JSON;核心回應本文與 X-Request-Id、 Cache-Control、X-Fact-Check-Cache 等標頭會原樣回傳。

03 / 讀懂回應

判斷結果,也保留證據脈絡

以下是「證據不足」的格式示例,並非對範例主張的實際查核結果。completed 表示流程完成,仍可能得到 insufficient_evidence。

回應示例 · 證據不足JSON
{
  "text": "非學校型態學生,國中小以下目前沒有普遍補助",
  "status": "completed",
  "moderation": {
    "decision": "allow",
    "categories": []
  },
  "factuality": 0.7,
  "confidence": 0.4,
  "verdict": "mostly_supported",
  "related_checks": [],
  "feedback": "查無相關查核資料,以下為常識判斷:此主張與常見制度描述大致相符,請自行查證。",
  "meta": {
    "request_id": "example-request-id",
    "cofacts_candidates": 0,
    "cofacts_relevant": 0,
    "cofacts_human_checks": 0,
    "cofacts_ai_checks": 0,
    "url_context_used": false,
    "url_context_allowlisted": false,
    "no_relevant_evidence": true,
    "warnings": []
  }
}
factuality
0~1,表示證據支持主張的程度。它不是主張為真的機率;無證據時的 0.5 表示無法判定。
confidence
0~1,表示判斷所依據的證據是否充分、可靠且一致。應與 factuality 一起閱讀。
feedback
繁體中文說明,補充證據限制、適用範圍與需要進一步查證之處。
related_checks
相關查核陣列,以 cofacts_human/cofacts_ai 區分人工與 AI 回覆。每筆包含查核文字與 Cofacts 原文 url;有引文時另附 reference_url/reference_urls。
meta
包含 request ID、候選及證據數量、是否使用 URL 背景,以及 warnings 警告。

六種判斷結果

supported證據支持
mostly_supported證據大致支持
mixed支持與反駁的證據並存
mostly_refuted證據大致反駁
refuted證據反駁
insufficient_evidence證據不足,無法判定

兩種分數各有用途:retrieval_score 只是 Cofacts 搜尋排序;relevance_score 是 0~1 的語意相關程度。兩者都不代表真假,不能直接換算 factuality。

04 / 狀態與錯誤

先看 HTTP,再看核心回應

付款放行後,查核 JSON 與核心的狀態欄位會原樣轉送;服務自身只負責付款與 proxy。 所有回應都附 X-Request-Id,並維持 Cache-Control: no-store。

HTTPerror處理方式
402PAYMENT_REQUIRED依 PAYMENT-REQUIRED 付款,帶 PAYMENT-SIGNATURE 重試。
400INVALID_INPUT修正 JSON、文字或網址後重試。
413PAYLOAD_TOO_LARGE縮短請求本文。
502UPSTREAM_UNAVAILABLEservice binding 或 core 暫時不可用;這次錯誤不會結算付款,詳見 README。
500INTERNAL_ERROR提供 request ID 協助排查。

`/api/demo` 另有免費入口的 FORBIDDEN_ORIGIN 與 RATE_LIMITED; 這些守護不套用到 x402 付費端點。

05 / x402 付款流程

先驗證,再轉送;成功才結算

  1. 1

    收到 402

    第一次呼叫不帶付款,服務回傳 PAYMENT-REQUIRED 與繁體中文付款說明。

  2. 2

    使用錢包付款

    正式預設在 Base mainnet 以 USDC 支付 0.05;本機範例使用 Base Sepolia。

  3. 3

    帶簽章重試

    把 PAYMENT-SIGNATURE(或 X-PAYMENT)附在相同 GET/POST 請求重試。

  4. 4

    驗證、轉送,再結算

    facilitator verify 成功後才透過 service binding 送到 fact-check-core;handler 回應 <400(本 API 通常為 2xx)才呼叫 settle。回應 >=400 時不結算,錯誤直接回客戶端。

  5. 5

    保留核心回應

    核心回應本文與 X-Request-Id、Cache-Control、X-Fact-Check-Cache 等標頭原樣回傳。

x402 沒有 JWT cookie 通行證;每個付費 API 請求都要 verify。core 回 >=400 或 fetch 失敗轉 502 時不結算;core 回 2xx 但內容為錯誤仍可能結算,settle 網路失敗則需另外確認付款狀態。

06 / 自行架設

設定 facilitator 與 core binding

本專案以 Cloudflare Workers、Hono 與 @x402/hono 執行。維運者需設定 PAY_TO、X402_NETWORK、X402_PRICE 與 FACILITATOR_URL,並在 wrangler.jsonc 維持 FACT_CHECK_CORE service binding。Base mainnet 上線前請準備 production facilitator;正式設定使用 CDP 短效 JWT,公開 x402.org facilitator 僅適合 Base Sepolia 測試。

查看安裝與付款設定指南