
01 銀行
變更綁定門號
晴空銀行
林
用到的訊號
- 換 SIM 卡SIM Swap
- 來電轉接Call Forwarding
- 新門號開通時間KYC Tenure
- 新門號核實Number Verification
結果
- 82分二次驗證詐團
先 補辦 SIM, 再改 綁門號
改綁
電信訊號 × AI 風險決策 API
商家
現況
資料來源:內政部警政署 165 打詐儀錶板
電信
拿到
機構
一通電話

通話中
未知號碼
0:12

步驟 1 / 5
TrustLayer 看得到
步驟 2 / 5
TrustLayer 看得到
步驟 3 / 5
TrustLayer 看得到
步驟 4 / 5
TrustLayer 看得到
步驟 5 / 5
風險分數(示範回應)87
攔截審核BLOCK_REVIEW原因碼
CALL_STATE_CONCURRENT+35交易CALL_FORWARDING_ACTIVE+30門號CONTEXT_ANOMALY+22首次建議:
通話
示範劇本;電信訊號依公開 CAMARA 規格模擬中華電信。
電信網路
中華電信
TrustLayer 目前沒有與中華電信合作。
電信訊號依公開 CAMARA 規格模擬中華電信。中華電信 2026/7/1 公告
信任層
TrustLayer
判斷方式
換卡、
01 訊號進來
SIM 卡與門號
通話與網路
這支手機
示意圖;手機為程式繪製的通用機型,畫面為模擬。
02 算出分數
電信訊號
示意,不是實測。
03 給出動作
拿不到
AI 模型
換卡、
計畫書 7 個
SIM_RECENT_CHANGE門號DEVICE_ROAMING_MISMATCH門號正在NUMBER_BINDING_WEAK帳號CALL_STATE_CONCURRENT交易CONTEXT_ANOMALY這次COUNTERPARTY_RISK交易TELECOM_SIGNAL_UNAVAILABLE電信訊號暫時平台版新增 6 個
NUMBER_TENURE_SHORT門號DEVICE_RECENT_CHANGE門號LOCATION_MISMATCH門號所在DEVICE_UNREACHABLE門號CALL_FORWARDING_ACTIVE門號DEVICE_UNRECOGNIZED這次產業情境
同

01 銀行
晴空銀行
林
用到的訊號
結果
改綁

02 購物平台
拾光購物
密碼
事件
用到的訊號
結果
單看

03 收款銀行
綠野銀行(收款)・晴空銀行(付款)
小陳
用到的訊號
結果
入帳

04 售票平台
星光售票
一批
用到的訊號
結果
在

05 購物平台
拾光購物
「好友」
用到的訊號
結果
沒有

06 發卡銀行
晴空銀行
林
不會
用到的訊號
結果
好人

07 外送平台
快送夥伴
沒通過
用到的訊號
結果
每次

08 政府線上服務
補助申請・發票小幫手
張
用到的訊號
結果
送出
一套 API,
品牌、
情資與簡訊
詐騙情資
其中
POST /v1/messages/check把
沒發現
最小揭露
門號
0900-000-007
加鹽雜湊
POST /v1/score
回應
telecom_evidence.signals
true=異常false=正常
簡訊
【物流
POST /v1/messages/check
回應
URL_IN_INTELURGENCY_PATTERN沒發現
01
只存加鹽雜湊,
02
簡訊全文不存。
03
回應不含換卡日期、
04
只查商家自己會員的門號,
接入方式
接法
在換
cURL
export TRUSTLAYER_SECRET_KEY=sk_test_your_key # secret 金鑰,只放伺服器端
curl -s https://trustlayer-platform-rho.vercel.app/v1/score \
-H "X-API-Key: $TRUSTLAYER_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_type": "TRANSACTION",
"user": { "user_ref": "member-0007", "phone_number": "+886900000007" },
"context": { "amount": 10000, "avg_amount_30d": 823.33, "is_new_device": true }
}'Node
const res = await fetch("https://trustlayer-platform-rho.vercel.app/v1/score", {
method: "POST",
headers: {
"X-API-Key": process.env.TRUSTLAYER_SECRET_KEY, // sk_test_your_key,只放伺服器端
"Content-Type": "application/json",
},
body: JSON.stringify({
event_type: "TRANSACTION",
user: { user_ref: "member-0007", phone_number: "+886900000007" },
context: { amount: 10000, avg_amount_30d: 823.33, is_new_device: true },
}),
});
const decision = await res.json();
console.log(decision.risk_score, decision.action); // 87 "BLOCK_REVIEW"Python
import os
import httpx
r = httpx.post(
"https://trustlayer-platform-rho.vercel.app/v1/score",
headers={"X-API-Key": os.environ["TRUSTLAYER_SECRET_KEY"]}, # sk_test_your_key,只放伺服器端
json={
"event_type": "TRANSACTION",
"user": {"user_ref": "member-0007", "phone_number": "+886900000007"},
"context": {"amount": 10000, "avg_amount_30d": 823.33, "is_new_device": True},
},
)
r.raise_for_status()
decision = r.json()
print(decision["risk_score"], decision["action"]) # 87 BLOCK_REVIEW一行 script,
HTML
<script src="https://trustlayer-platform-rho.vercel.app/sdk/trustlayer.js" data-key="pk_test_your_key"></script>
<script>
TrustLayer.check({ event: "LOGIN", phone: "0900000001" })
.then((d) => console.log(d.action, d.message));
</script>
<!-- 或標在表單上:送出前先查,ALLOW、WARN 才送出 -->
<form data-trustlayer-event="LOGIN">
<input name="phone" />
</form>付款
WooCommerce → 設定 → 整合 → TrustLayer
依
低於
放行
外掛怎麼處理
正常
正常
訂單
付款
決策
通知內容
POST https://your-shop.example/webhooks/trustlayer
Content-Type: application/json
X-TrustLayer-Event: decision.block_review
X-TrustLayer-Signature: t=1793019912,v1=<HMAC-SHA256 hex>
{
"type": "decision.block_review",
"created_at": "2026-10-26T13:05:12.481920+00:00",
"data": {
"decision_id": "…",
"risk_score": 87,
"action": "BLOCK_REVIEW",
"reasons": [ … ]
}
}Node 收件端
import { createHmac, timingSafeEqual } from "node:crypto";
// X-TrustLayer-Signature: t=<秒>,v1=<HMAC-SHA256(secret, "t.body")>
export async function POST(request) {
const body = await request.text(); // 用原始內容驗簽,驗過才 JSON.parse
const header = request.headers.get("x-trustlayer-signature") ?? "";
const sig = Object.fromEntries(
header.split(",").map((p) => [p.slice(0, p.indexOf("=")), p.slice(p.indexOf("=") + 1)]),
);
const t = Number(sig.t);
if (!t || Math.abs(Date.now() / 1000 - t) > 300) {
return new Response("stale timestamp", { status: 401 });
}
const expected = createHmac("sha256", process.env.TRUSTLAYER_WEBHOOK_SECRET) // whsec_your_secret
.update(`${t}.${body}`)
.digest();
const given = Buffer.from(sig.v1 ?? "", "hex");
if (given.length !== expected.length || !timingSafeEqual(given, expected)) {
return new Response("bad signature", { status: 401 });
}
const event = JSON.parse(body); // event.type === "decision.block_review"
// event.data:那次 /v1/score 的回應
return Response.json({ received: true });
}請求
X-API-Key: sk_test_your_key
{"event_type": "TRANSACTION","user": { "user_ref": "member-0007", "phone_number": "+886900000007" },"context": { "amount": 10000, "avg_amount_30d": 823.33, "is_new_device": true }}
300 ms端到端 P95 目標(是目標,不是實測)
回應
200 OK87BLOCK_REVIEW{"risk_score": 87,"action": "BLOCK_REVIEW","reasons": [{ "code": "CALL_STATE_CONCURRENT", "source": "TELECOM", "points": 35, "message": "交易當下門號正在通話中" },{ "code": "CALL_FORWARDING_ACTIVE", "source": "TELECOM", "points": 30, "message": "門號已開啟無條件來電轉接" },{ "code": "CONTEXT_ANOMALY", "source": "PLATFORM", "points": 22, "message": "首次使用的裝置、金額為近 30 日平均的 12.1 倍" }],"explanation": "風險分數 87(CRITICAL):交易當下門號正在通話中;門號已開啟無條件來電轉接;首次使用的裝置、金額為近 30 日平均的 12.1 倍。建議:攔截並送人工審核。","customer_message": "這次操作已暫停,將由客服人工審核,結果會另行通知您。","step_up_methods": [],"telecom_evidence": { "source": "CHT_SIMULATED", "is_simulated": true, "status": "COMPLETE" }}
示範:
引擎本機壓測 P95 約 7 ms(Mock 電信、不含電信往返)
商家後台
每次



左右滑動,看三個畫面
畫面
每筆
替測試門號切換
評分
貼上
沒發現已知詐騙特徵,
攔截
測試
常見問題
TrustLayer
記為
不存明碼門號,
依
目前
REST API、