詐欺チェックAPI · 法人向け

詐欺のチェックを、
APIひとつで。

リンク、お客様から届いたSMS・LINE・メールの文面、Webページを送るだけ。「安全・要注意・危険」の判定と、その理由を返します。サポート担当者にもお客様にも伝わる、わかりやすい理由です。

  • 毎月1,000クレジット無料
  • 送信データは保存しません
  • 日本語の詐欺文面に対応
POST /v1/scan/url
$ 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を即座に判定。支払ってしまう前に、理由を添えて返信できます。

EC・フリマ・マーケットプレイス

出品やメッセージ内のリンクを判定。偽の決済ページや「送料はこちらで」リンクを、クリックされる前に止めます。

広告配信・メディア

広告主のランディングページを審査。審査時は普通のショップ、利用者には偽のウイルス警告を見せる「クローキング」も解析します。

SMS・メッセージ配信

配信時にメッセージ内のリンクを判定。日本語・英語・スペイン語・ヒンディー語の文面と、詐欺師がまねる国内ブランドに対応します。

SafeHopの強み

ブロックリストの照合だけではありません。

リストに載るのは、すでに報告された詐欺だけです。SafeHopはリンクとページが実際に何をするかを見るので、できたばかりの詐欺も初日に見つけます。

スコアだけでなく理由を返す

ブランドのなりすまし、4日前に登録されたドメイン、隠れた転送、偽警告ページなど、判定の理由を毎回返します。お客様や不正対策チームにそのまま提示できます。

隠れた詐欺ページを解析

本物の人がマウスを動かすまで詐欺ページを暗号化して隠す手口があります。SafeHopは鍵を見つけて安全に中身を解読し、判定します。

プライバシー重視の設計

送信されたリンクやメッセージは判定後に破棄され、保存・記録・広告利用は一切しません。保存するのはキーごとの利用回数だけです。

クイックスタート

3ステップで導入。

キーはお客様のサーバーにだけ置きます。Webサイトはリンクやメッセージを自社のサーバーに送り、サーバーがSafeHopに問い合わせ、結果に応じて表示を決めます。

  1. 1

    キーを取得

    Googleアカウントまたは仕事用メールで登録。キーは一度だけ表示されます。毎月1,000クレジット無料。

    無料キーを取得
  2. 2

    シークレットとして保存

    コードやWebサイトではなく、サーバーの環境変数に保存します。漏れた場合は再ログインで新しいキーを発行できます。

    .env
    # .env on your server: never commit it, never put the key in browser code
    SAFEHOP_API_KEY=sh_live_your_key_here
  3. 3

    サーバーからリンクを判定

    リンクやメッセージが他の人に表示される前に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そのまま表示
    suspiciousreasons[0].text を添えて注意を表示
    dangerousブロック、または利用者に確認を求める

    おすすめの使い方

    • キーをブラウザのJavaScriptやアプリに入れないでください。誰でもコピーできてしまいます。
    • 10秒以内に応答がない場合は、コンテンツをそのまま通してください。
    • 同じリンクの結果は数時間キャッシュすると、クレジットを節約できます。
    • SMS・チャット・メールの本文全体は POST /v1/scan/message({"text": "…"})で判定できます。

ドキュメント

4つのエンドポイント。JSONで送って、JSONで受け取る。

ベース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

判定

  • safe スコア30未満:危険の兆候なし
  • suspicious 30〜69:利用者に注意を促す
  • dangerous 70〜100:ブロック、または強い警告

エラー

  • 400 本文が正しくない
  • 401 キーがない・誤り · 403 キーが無効
  • 429 1分あたりの上限、または月間クレジットの上限
POST /v1/scan/message
{ "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クレジット
毎分30リクエスト

キーを取得

スターター

$49/月

月25,000クレジット
毎分120リクエスト

今すぐ始める
人気

グロース

$299/月

月250,000クレジット
毎分600リクエスト

今すぐ始める

エンタープライズ

個別見積

数百万クレジット、詐欺サイトのフィード、サポート契約

お問い合わせ

クレジットの使い方:リンク1件またはメッセージ1件の確認で1クレジット(一括確認はリンク1件ごとに1クレジット)、ページ全体のスキャンは5クレジットです。料金は米ドル建てです。

無料トライアルキーを、1分で。

カード登録不要、毎月1,000クレジット無料。アカウントページからいつでもアップグレード・解約できます(アカウントページは英語です)。