ドキュメント
登録ページにエージェントを置き、サーバーから 1 つのエンドポイントを呼び、判定に従って処理します。
クイックスタート
1. 登録ページにエージェントを追加
端末シグナルを収集し、ページ内のすべてのフォームに attrelix_visitor という隠しフィールドで短命のビジタートークンを入れます。シングルページアプリ向けに window.attrelix.token() も用意しています。
<script src="https://attrelix.com/v1.js?v=0bbe74b52d" data-key="pk_live_…" async></script> // single-page apps: wait for the token before you submit const visitor = await window.attrelix.token();
2. サーバーから登録をチェック
メールアドレス、クライアント IP、ビジタートークンをシークレットキーとともに送ります。任意: external_id(自社のユーザー ID)、user_agent、card_fingerprint(例: Stripe の card.fingerprint)。
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"jdoe+7@gmail.com","ip":"203.0.113.9","visitor":"vt1.…"}'
# Python r = requests.post("https://attrelix.com/v1/check", timeout=3, headers={"Authorization": f"Bearer {SECRET}"}, json={"email": email, "ip": ip, "visitor": form["attrelix_visitor"]}) decision = r.json().get("decision", "allow") if r.ok else "allow"
3. 判定に従って処理
allow: 無料クレジットを付与。review: カードや電話番号など、不正集団にコストがかかるものを求めるか、付与するクレジットを減らす。block: アカウントまたはクレジットを拒否。呼び出しが失敗したら許可してください。私たちのせいで本物のユーザーを締め出さないために。
キーとトークン
- 公開キー(pk_live_…): 公開を前提としたキーです。ページに置かれ、ダッシュボードで許可したオリジンからシグナルを収集することしかできません。
- シークレットキー(sk_live_…): サーバー専用。チェックの実行と結果の取得に使います。保存するのはハッシュだけなので、作成時にコピーしてください。
- ビジタートークン: 私たちが署名し、15 分間・1 回のチェックに限り有効で、プロジェクトに紐づきます。2 回使われたトークンや、登録とは別のネットワークで取得されたトークンはスコアを上げます。
POST /v1/check
リクエストボディ(JSON)。email、ip、visitor のうち少なくとも 1 つを送ってください。
| ユーザーが入力したアドレス。 | |
| ip | 登録リクエストのクライアント IP(自社サーバーの IP ではありません)。 |
| visitor | フォームの attrelix_visitor の値。 |
| user_agent | 登録リクエストの User-Agent ヘッダー。 |
| external_id | アカウントが既にある場合の自社 ID。 |
| card_fingerprint | 登録時にカードを追加した場合のカードフィンガープリント。 |
レスポンス
decision は allow、review、block のいずれか。score は 0〜100 で、理由ごとのポイントの合計(上限あり)です。各理由にはログや表示に使える固定のコードがあります。
{
"id": "chk_3fJ8kQ2mN7pX1aZb",
"decision": "block",
"score": 100,
"reasons": [
{ "code": "linked_accounts_10", "points": 45, "detail": "14" },
{ "code": "alias_of_existing", "points": 30, "detail": "3 variants of jdoe@gmail.com" },
{ "code": "datacenter_ip", "points": 25, "detail": "aws" }
],
"email": { "normalized": "jdoe@gmail.com", "disposable": false, "relay": false, "mx": "yes", … },
"network": { "ip": "3.88.0.1", "type": "datacenter", "provider": "aws", "signups_24h": 2 },
"device": { "id": "dev_9c1e…", "token": "valid", "browser": "Firefox 144", "flags": ["canvas_noise"] },
"linked": { "accounts": 14, "by_device": 12, "by_card": 0, "cluster": "cl_7q2f…" },
"latency_ms": 38
}
エラー
エラーは JSON で返ります: {"error": code, "message": text}。
| 401 | キーがない、不明、失効済み、または種類が違う(/v1/check に pk_ キー)。 |
| 400 | ボディが JSON でない、または email・ip・visitor のいずれもない。 |
| 402 | プランの月間チェック数を使い切った。 |
| 403 | 許可していないオリジンでエージェントが動いた。 |
| 429 | 同じアドレスからのリクエストが多すぎる。 |
スコアリング
ポイントは加算され、上限は 100 です。既定値は 50 以上で要確認、80 以上でブロック(どちらも変更可能)。使い捨てメールだけでも要確認になりますが、端末やネットワークのシグナル単独では要確認になりません。
| コード | ポイント | 意味 |
|---|---|---|
| invalid_email | +50 | アドレスが無効 |
| disposable_email | +50 | 使い捨てメールのドメイン |
| no_mx | +35 | ドメインがメールを受信できない |
| alias_of_existing | +30 | 既出のメールボックスの別表記 |
| relay_email | +10 | 転送サービスのアドレス |
| plus_tag | +5 | + タグまたは Gmail のドット |
| tor_exit | +35 | Tor の出口ノード |
| datacenter_ip | +25 | データセンターまたはクラウドのアドレス |
| vpn_ip | +20 | VPN のアドレス |
| ip_signups_24h | +10 | この IP から 24 時間で 3 件以上 |
| ip_signups_24h_high | +25 | この IP から 24 時間で 10 件以上 |
| subnet_burst | +15 | このサブネットから 1 時間で 10 件以上 |
| automation_webdriver | +40 | WebDriver による自動化 |
| headless_browser | +40 | ヘッドレスブラウザ |
| automation_cdp | +10 | DevTools プロトコルによる自動化(Puppeteer、Playwright) |
| antidetect_browser | +15 | アンチディテクトブラウザ(複数の偽装が同時に存在) |
| headless_viewport | +15 | ブラウザのバーもタブもないウィンドウ |
| webgl_os_mismatch | +25 | グラフィックカードが別のOSのもの |
| memory_cpu_mismatch | +10 | コア数とメモリが矛盾している |
| no_human_interaction | +30 | 入力もマウス操作もタッチもなく即送信 |
| instant_signup | +25 | ページ読み込みから1秒以内に記入・送信 |
| os_mismatch | +20 | OS の情報が矛盾している |
| browser_mismatch | +20 | ブラウザが自身の user agent と矛盾 |
| fonts_mismatch | +15 | フォントが申告された OS と合わない |
| canvas_noise | +15 | ランダム化された canvas フィンガープリント |
| software_renderer | +15 | ソフトウェア描画(仮想マシンまたはヘッドレス) |
| zero_window | +15 | ウィンドウのサイズがゼロ |
| permissions_mismatch | +15 | 権限の状態が矛盾している |
| no_plugins | +10 | プラグインのないデスクトップ版 Chrome |
| no_languages | +10 | ブラウザに言語設定がない |
| utc_timezone | +5 | 時計が UTC |
| token_missing | 0–100 | ビジタートークンなし(エージェント未読み込みまたはブロック) |
| token_invalid | +30 | 偽造または他プロジェクトのビジタートークン |
| token_replayed | +35 | 使用済みのビジタートークン |
| token_expired | +10 | 期限切れのビジタートークン |
| token_ip_mismatch | +8 | 別のネットワークで取得されたトークン |
| token_ua_mismatch | +15 | 別のブラウザで取得されたトークン |
| linked_accounts | +15 | 他のアカウントと紐づく |
| linked_accounts_3 | +30 | 3 件以上のアカウントと紐づく |
| linked_accounts_10 | +45 | 10 件以上のアカウントと紐づく |
| shared_card | +30 | 他のアカウントが使ったカード |
| device_burst | +15 | この端末から 1 時間で 5 回以上のチェック |
データソース
使い捨てドメイン: disposable-email-domains プロジェクト(CC0)と disposable/disposable-email-domains(MIT)、毎日更新。データセンターの IP 範囲: AWS、Google Cloud、Oracle Cloud、DigitalOcean、Linode が公開しているリスト。Tor: Tor Project の出口ノードリスト、1 時間ごとに更新。
現在: 使い捨てドメイン 98,644 件、IP 範囲 21,665 件。