銀行・カード・決済
お客様から転送された「ご利用を一時停止しました」SMSを即座に判定。支払ってしまう前に、理由を添えて返信できます。
詐欺チェックAPI · 法人向け
リンク、お客様から届いたSMS・LINE・メールの文面、Webページを送るだけ。「安全・要注意・危険」の判定と、その理由を返します。サポート担当者にもお客様にも伝わる、わかりやすい理由です。
$ curl https://api.safehop.app/v1/scan/url \
-H "Authorization: Bearer sh_live_…" \
-d '{"url":"rakuten.co.jp.ajlmn.xyz/login"}'
{
"verdict": "dangerous",
"score": 100,
"reasons": [
{ "id": "brand-domain-embedded", "points": 50,
"text": "starts like rakuten.co.jp, but the real
website is ajlmn.xyz, not rakuten" },
{ "id": "new-domain", "points": 35,
"text": "ajlmn.xyz was registered only 4 days ago" },
…
],
"domain": { "ageDays": 4, "registrar": "…" }
}
活用例
お客様から転送された「ご利用を一時停止しました」SMSを即座に判定。支払ってしまう前に、理由を添えて返信できます。
出品やメッセージ内のリンクを判定。偽の決済ページや「送料はこちらで」リンクを、クリックされる前に止めます。
広告主のランディングページを審査。審査時は普通のショップ、利用者には偽のウイルス警告を見せる「クローキング」も解析します。
配信時にメッセージ内のリンクを判定。日本語・英語・スペイン語・ヒンディー語の文面と、詐欺師がまねる国内ブランドに対応します。
SafeHopの強み
リストに載るのは、すでに報告された詐欺だけです。SafeHopはリンクとページが実際に何をするかを見るので、できたばかりの詐欺も初日に見つけます。
ブランドのなりすまし、4日前に登録されたドメイン、隠れた転送、偽警告ページなど、判定の理由を毎回返します。お客様や不正対策チームにそのまま提示できます。
本物の人がマウスを動かすまで詐欺ページを暗号化して隠す手口があります。SafeHopは鍵を見つけて安全に中身を解読し、判定します。
送信されたリンクやメッセージは判定後に破棄され、保存・記録・広告利用は一切しません。保存するのはキーごとの利用回数だけです。
クイックスタート
キーはお客様のサーバーにだけ置きます。Webサイトはリンクやメッセージを自社のサーバーに送り、サーバーがSafeHopに問い合わせ、結果に応じて表示を決めます。
コードやWebサイトではなく、サーバーの環境変数に保存します。漏れた場合は再ログインで新しいキーを発行できます。
# .env on your server: never commit it, never put the key in browser code
SAFEHOP_API_KEY=sh_live_your_key_hereリンクやメッセージが他の人に表示される前にSafeHopへ問い合わせ、判定に応じて対応します。
// Node.js 18+ (built-in fetch). Runs on your server, never in the browser.
export async function checkLink(url) {
try {
const res = await fetch('https://api.safehop.app/v1/scan/url', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SAFEHOP_API_KEY}`,
'content-type': 'application/json',
},
body: JSON.stringify({ url }),
signal: AbortSignal.timeout(10000),
});
return res.ok ? await res.json() : null;
} catch {
return null; // SafeHop unreachable: let the content through
}
}
const result = await checkLink(linkFromUser);
if (result?.verdict === 'dangerous') {
// block it, or show result.reasons[0].text to the user
}<?php
function safehop_check_link(string $url): ?array {
$ch = curl_init('https://api.safehop.app/v1/scan/url');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SAFEHOP_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['url' => $url]),
]);
$body = curl_exec($ch);
$ok = curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200;
curl_close($ch);
return $ok ? json_decode($body, true) : null; // null: let the content through
}
$result = safehop_check_link($linkFromUser);
if ($result && $result['verdict'] === 'dangerous') {
// block it, or show $result['reasons'][0]['text']
}import os
import requests
def check_link(url):
try:
r = requests.post(
"https://api.safehop.app/v1/scan/url",
headers={"Authorization": f"Bearer {os.environ['SAFEHOP_API_KEY']}"},
json={"url": url},
timeout=10,
)
return r.json() if r.ok else None
except requests.RequestException:
return None # SafeHop unreachable: let the content through
result = check_link(link_from_user)
if result and result["verdict"] == "dangerous":
... # block it, or show result["reasons"][0]["text"]curl https://api.safehop.app/v1/scan/url \
-H "Authorization: Bearer $SAFEHOP_API_KEY" \
-H "content-type: application/json" \
-d '{"url":"paypal-account-verify-center.shop/login"}'| 判定 | 対応 |
|---|---|
safe | そのまま表示 |
suspicious | reasons[0].text を添えて注意を表示 |
dangerous | ブロック、または利用者に確認を求める |
POST /v1/scan/message({"text": "…"})で判定できます。ドキュメント
ベースURL https://api.safehop.app。Authorization: Bearer sh_live_… ヘッダーにキーを付け、JSONの本文を送ります。判定理由(text)は現在英語で返されます。理由の種類は id で判別できます。
| エンドポイント | 本文 | 内容 | クレジット |
|---|---|---|---|
POST /v1/scan/url | { "url" } | リンクを判定:ブランドのなりすまし、ドメインの登録日と登録事業者、フィッシングリスト、転送先、広告リンクの本当の行き先。 | 1 |
POST /v1/scan/batch | { "urls": [ … ] } | 1回で最大100件のリンクを判定。 | 1件ごとに1 |
POST /v1/scan/message | { "text" } | SMS・LINE・メールの文面と、含まれるすべてのリンクを判定:偽の不在通知、カード・口座の停止、当選、副業、投資、警察を名乗る詐欺。 | 1 |
POST /v1/scan/page | { "url" } | ページを(実行せずテキストとして)読み取り判定:偽ログイン、偽のウイルス警告、閉じられない罠、暗号化された隠しローダー。 | 5 |
GET /v1/account | プラン、月間上限、使用済みクレジット。 | 0 |
400 本文が正しくない401 キーがない・誤り · 403 キーが無効429 1分あたりの上限、または月間クレジットの上限{ "text": "【重要】お客様のカードのご利用を一時停止
しました。本日中にご本人確認をお願いします:
card-kakunin.top/verify" }
{
"verdict": "dangerous", "score": 80,
"scamType": "a fake bank or account warning",
"reasons": [
{ "id": "msg-account", … },
{ "id": "msg-throwaway-link", … },
{ "id": "msg-urgency", … }
],
"links": [ { "url": "https://card-kakunin.top/verify", … } ]
}
カード登録不要、毎月1,000クレジット無料。アカウントページからいつでもアップグレード・解約できます(アカウントページは英語です)。